Полная Эмуляция Мыши - нашел в инете готовое решение - как вставить в общий код

ramzes8

Client
Регистрация
27.05.2016
Сообщения
43
Благодарностей
45
Баллы
18
Здравствуйте, наткнулся на готовое решение эмуляции роботы мыши - https://codeby.net/threads/imitacija-povedencheskix-faktorov-kursora-myshi-c.65994/
Приложение предназначено для автоматического управления системным курсором. Позволяет помочь в обходе защиты Google Recaptcha v3, которая предполагает анализ поведенческих факторов пользователя как одного из основных при выдаче “fraud score”.
Позволяет помочь в обходе запись Вебвизора, являющегося частью Яндекс.Метрики.
Также приложение может использоваться для любых иных задач, связанных с автоматизацией управления системным курсором, например, при тестировании веб-приложений, игр, написании ботов, в которых нужна имитация действий настоящего пользователя, для управления браузером на веб-ресурсах, которые используют антифрод-системы по отслеживанию пользовательского поведения. Из последних известных примеров можно привести: Hubstaff Tracker или Upwork Tracker, предназначенные для отслеживания работы исполнителей на биржах фриланса по довольно топорным метрикам.

подскажите как запустить эти методы из общего кода в zenno?
 

Вложения

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 691
Баллы
113
подскажите как запустить эти методы из общего кода в zenno?
посидеть с месяц, покурить форум, покурить WinApi, возможно тогда и сможете адаптировать под зенку. Копипаст тут не прокатит.
в зенке есть же фулэмулятион метод. чем не устраивает ?
 

VladZen

Administrator
Команда форума
Регистрация
05.11.2014
Сообщения
22 237
Благодарностей
5 847
Баллы
113

ramzes8

Client
Регистрация
27.05.2016
Сообщения
43
Благодарностей
45
Баллы
18
в зенке есть же фулэмулятион метод. чем не устраивает ?
Да есть использую - НО метод FullEmulationMouseMove не всегда корректно работает,
если ввожу координаты превышающие высоту разрешения экрана (например разрешение окна 1024х728 высота body 5900, задаю точку х=500 у=1700) то метод не всегда находит этот элемент, - зацикливает скролл вверх вниз страницы (ОСОБЕННО если в цикле рандомное движение курсора по странице) (у меня эта беда наблюдается давно, как и здесь https://zennolab.com/discussion/threads/zavisaet-kubik-s-ehmuljaciej-myshi.75435/ есть версии zenno где нет глюка, но они не устраивают - хочется обновлений).

вот мой код:


C#:
Random rnd = new Random();

int x = 0;
int y = 0;
// указываем количество точек
int Kolichestvo_Tochek = rnd.Next(15, 35);
// указываем когда дергаться курсор будет
int int_Kogda_drigaemsia = rnd.Next(2, Kolichestvo_Tochek);
// указываем когда скролл страницыт
int int_Kogda_scroll = rnd.Next(2, Kolichestvo_Tochek);

// обьявляем массив точек, по которым будет двигаться курсор мыши
Point[] points = new Point[Kolichestvo_Tochek];
project.SendInfoToLog("ScreenSizeWidth = " + project.Profile.ScreenSizeWidth.ToString() + " ScreenSizeHeight = " + project.Profile.ScreenSizeHeight.ToString(), true);
//instance.SetWindowSize(project.Profile.ScreenSizeWidth, project.Profile.ScreenSizeHeight);
instance.SetWindowSize(1024, 768);
instance.ActiveTab.Navigate("https://www.google.com/search?&q=C%23+движение+курсора+zenno");
instance.ActiveTab.WaitDownloading();



//--------ПРОПИСЫВАЕМ сценарий движения курсора по экрану - заполняем масив-------
for (int i = 0; i < Kolichestvo_Tochek; i++)
{
    // указываем рандомные пределы для сдвига курсора в пикселях
    x = rnd.Next(100, project.Profile.AvailScreenWidth - 170);
    y = rnd.Next(100, project.Profile.AvailScreenHeight - 270);

    points[i] = new Point(x, y);
    project.SendInfoToLog("points " + x.ToString() + " , " + y.ToString(), false); // выводим в лог координаты
}
//--------движение курсора по экрану -------------
for (int i = 0; i < points.Length; i++)
{
    //задаем рандомно скорость движения для каждого рывка:
    instance.ActiveTab.FullEmulationMouseSetOptions(rnd.Next(3,5), rnd.Next(3,5), rnd.Next(4, 17));
    //Двигаем мышкой плавно:
    instance.ActiveTab.FullEmulationMouseMove(points.ElementAt(i).X, points.ElementAt(i).Y);


    Thread.Sleep(rnd.Next(1000, 4000));

    //Скролл страницы
    if (rnd.Next(0, 100) > 50)
    {
        Point point_x_y_do_skroll = instance.ActiveTab.FullEmulationMouseCurrentPosition;
        instance.ActiveTab.FullEmulationMouseSetScrollBorder(instance.ActiveTab.FullEmulationMouseCurrentPosition.X, instance.ActiveTab.FullEmulationMouseCurrentPosition.Y);
        //Скрол в ВВЕРХ
        if (rnd.Next(0, 100) > 50 && instance.ActiveTab.MainDocument.Body.DisplacementInTabWindow.Y < -850)
        {
            project.SendInfoToLog("Скролл страницы в ВВЕРХ", true);
            instance.ActiveTab.FullEmulationMouseWheel(0, rnd.Next(0, -550));
        }
        else //Скролл в НИЗ
        {
            project.SendInfoToLog("Скролл страницы в НИЗ", true);
            instance.ActiveTab.FullEmulationMouseWheel(0, rnd.Next(0, 550));
        }
        Thread.Sleep(rnd.Next(2000, 5000));
     }
}
 
Последнее редактирование:
  • Спасибо
Реакции: ermax

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 691
Баллы
113
Да есть использую - НО метод FullEmulationMouseMove не всегда корректно работает,
если ввожу координаты превышающие высоту разрешения экрана (например разрешение окна 1024х728 высота body 5900, задаю точку х=500 у=1700) то метод не всегда находит этот элемент, - зацикливает скролл вверх вниз страницы (ОСОБЕННО если в цикле рандомное движение курсора по странице) (у меня эта беда наблюдается давно, как и здесь https://zennolab.com/discussion/threads/zavisaet-kubik-s-ehmuljaciej-myshi.75435/ есть версии zenno где нет глюка, но они не устраивают - хочется обновлений).

вот мой код:


C#:
Random rnd = new Random();

int x = 0;
int y = 0;
// указываем количество точек
int Kolichestvo_Tochek = rnd.Next(15, 35);
// указываем когда дергаться курсор будет
int int_Kogda_drigaemsia = rnd.Next(2, Kolichestvo_Tochek);
// указываем когда скролл страницыт
int int_Kogda_scroll = rnd.Next(2, Kolichestvo_Tochek);

// обьявляем массив точек, по которым будет двигаться курсор мыши
Point[] points = new Point[Kolichestvo_Tochek];
project.SendInfoToLog("ScreenSizeWidth = " + project.Profile.ScreenSizeWidth.ToString() + " ScreenSizeHeight = " + project.Profile.ScreenSizeHeight.ToString(), true);
//instance.SetWindowSize(project.Profile.ScreenSizeWidth, project.Profile.ScreenSizeHeight);
instance.SetWindowSize(1024, 768);
instance.ActiveTab.Navigate("https://www.google.com/search?&q=C%23+движение+курсора+zenno");
instance.ActiveTab.WaitDownloading();



//--------ПРОПИСЫВАЕМ сценарий движения курсора по экрану - заполняем масив-------
for (int i = 0; i < Kolichestvo_Tochek; i++)
{
    // указываем рандомные пределы для сдвига курсора в пикселях
    x = rnd.Next(100, project.Profile.AvailScreenWidth - 170);
    y = rnd.Next(100, project.Profile.AvailScreenHeight - 270);

    points[i] = new Point(x, y);
    project.SendInfoToLog("points " + x.ToString() + " , " + y.ToString(), false); // выводим в лог координаты
}
//--------движение курсора по экрану -------------
for (int i = 0; i < points.Length; i++)
{
    //задаем рандомно скорость движения для каждого рывка:
    instance.ActiveTab.FullEmulationMouseSetOptions(rnd.Next(3,5), rnd.Next(3,5), rnd.Next(4, 17));
    //Двигаем мышкой плавно:
    instance.ActiveTab.FullEmulationMouseMove(points.ElementAt(i).X, points.ElementAt(i).Y);


    Thread.Sleep(rnd.Next(1000, 4000));

    //Скролл страницы
    if (rnd.Next(0, 100) > 50)
    {
        Point point_x_y_do_skroll = instance.ActiveTab.FullEmulationMouseCurrentPosition;
        instance.ActiveTab.FullEmulationMouseSetScrollBorder(instance.ActiveTab.FullEmulationMouseCurrentPosition.X, instance.ActiveTab.FullEmulationMouseCurrentPosition.Y);
        //Скрол в ВВЕРХ
        if (rnd.Next(0, 100) > 50 && instance.ActiveTab.MainDocument.Body.DisplacementInTabWindow.Y < -850)
        {
            project.SendInfoToLog("Скролл страницы в ВВЕРХ", true);
            instance.ActiveTab.FullEmulationMouseWheel(0, rnd.Next(0, -550));
        }
        else //Скролл в НИЗ
        {
            project.SendInfoToLog("Скролл страницы в НИЗ", true);
            instance.ActiveTab.FullEmulationMouseWheel(0, rnd.Next(0, 550));
        }
        Thread.Sleep(rnd.Next(2000, 5000));
     }
}
при использовании скрола, надо самостоятельно переставлять координаты крысы в экранные координаты. скрол сам это не делает. крыса работает в абсолютных координатах. и когда происходит скролл мышь поедет вместе со страницей. а потом когда начинается движение крысы , ее алгоритм сначала сделает ее положение видимым , тоесть проскролит обратно (ваше мотание туда-сюда) и только потом она поедет в нужное место.
установка координат крыски instance.ActiveTab.FullEmulationMouseCurrentPosition = new Point(x,y);
так же полезно начать работать в относительных координатах экрана, а не абсолютных документа. то есть завести новые переменные в проекте и постоянно там сохранять там экранные координаты крысы. при начале кубика вытаскивать их , после работы с крысой сохранять их туда.
пересчитывать можно через instance.ActiveTab.MainDocument.Body.DisplacementInTabWindow.Y

предлагал я разрабам сделать такое, но чот пока они думают ?) https://zennolab.com/discussion/threads/v-metod-fullemulationmousecurrentposition-dobavit-otnositelnye-koordinaty.70805/
 

ramzes8

Client
Регистрация
27.05.2016
Сообщения
43
Благодарностей
45
Баллы
18
установка координат крыски instance.ActiveTab.FullEmulationMouseCurrentPosition = new Point(x,y);
Да делал так, вот мой вариант с прописыванием новой позиции курсора результат тот же, и пробовал добавлять в качестве координаты смещения по У - instance.ActiveTab.MainDocument.Body.DisplacementInTabWindow.Y
-результат тот-же плужит и зависает движение вверх вниз скролом



C#:
Random rnd = new Random();

int x = 0;
int y = 0;
int y_Scroll = 0;
// указываем количество точек
int Kolichestvo_Tochek = rnd.Next(15, 35);
// указываем когда дергаться курсор будет
int int_Kogda_drigaemsia = rnd.Next(2, Kolichestvo_Tochek);
// указываем когда скролл страницыт
int int_Kogda_scroll = rnd.Next(2, Kolichestvo_Tochek);

// обьявляем массив точек, по которым будет двигаться курсор мыши
Point[] points = new Point[Kolichestvo_Tochek];

project.Profile.ScreenSizeWidth = 1280;
project.Profile.ScreenSizeHeight = 800;
instance.SetWindowSize(project.Profile.ScreenSizeWidth, project.Profile.ScreenSizeHeight);


instance.ActiveTab.Navigate("https://www.google.com/search?client=firefox-b-d&biw=2560&bih=1305&q=C%23+движение+курсора+zenno");
instance.ActiveTab.WaitDownloading();

//ПРОПИСЫВАЕМ сценарий движения курсора по экрану - заполняем наш масив
for (int i = 0; i < Kolichestvo_Tochek; i++)
{
    //instance.ActiveTab.MainDocument.DisplacementInTabWindow.Y;
  
    // указываем рандомные пределы для сдвига курсора в пикселях
    x = rnd.Next(100, project.Profile.ScreenSizeWidth - 170);
    y = rnd.Next(100, project.Profile.ScreenSizeHeight - 270);
  
    points[i] = new Point(x, y);
    project.SendInfoToLog("points " + x.ToString() + " , " + y.ToString(), false); // выводим в лог координаты
}

for (int i = 0; i < points.Length; i++)
{
    //задаем рандомно скорость движения для каждого рывка:
    instance.ActiveTab.FullEmulationMouseSetOptions(rnd.Next(4,5), rnd.Next(4,5), rnd.Next(4,15));
    project.SendInfoToLog("FullEmulationMouseMove к координатам: " + points.ElementAt(i).X.ToString() + "  " + (points.ElementAt(i).Y + (-1 * instance.ActiveTab.MainDocument.Body.DisplacementInTabWindow.Y)).ToString(), true);
    //Двигаем мышкой плавно:
    instance.ActiveTab.MainDocument.Body.Focus();
    instance.ActiveTab.FullEmulationMouseMove(points.ElementAt(i).X, points.ElementAt(i).Y + y_Scroll);
    //Записываемновые точки нахождения курсора с учетом СКРОЛЛА!!!
    project.SendInfoToLog("устанавливаем новую позицию FullEmulationMouseCurrentPosition Y = " + points.ElementAt(i).Y + y_Scroll);
    instance.ActiveTab.FullEmulationMouseCurrentPosition = new Point(points.ElementAt(i).X, points.ElementAt(i).Y + y_Scroll);
    
    Thread.Sleep(rnd.Next(2000, 5000));
  

    //Скролл страницы
    if (rnd.Next(0, 100) > 50)
    {
        Point point_x_y_do_skroll = instance.ActiveTab.FullEmulationMouseCurrentPosition;
        instance.ActiveTab.FullEmulationMouseSetScrollBorder(instance.ActiveTab.FullEmulationMouseCurrentPosition.X, instance.ActiveTab.FullEmulationMouseCurrentPosition.Y);
        //Скрол в ВВЕРХ
        if (rnd.Next(0, 100) > 50 && instance.ActiveTab.MainDocument.Body.DisplacementInTabWindow.Y < -850)
        {
            project.SendInfoToLog("Скролл страницы в ВВЕРХ", true);
            y_Scroll = rnd.Next(0, -550);
            instance.ActiveTab.FullEmulationMouseWheel(0, y_Scroll);
        }
        else //Скролл в НИЗ
        {
            project.SendInfoToLog("Скролл страницы в НИЗ", true);
            y_Scroll = rnd.Next(0, 550);
            instance.ActiveTab.FullEmulationMouseWheel(0,  y_Scroll);
        }
      
        project.SendInfoToLog(" DisplacementInTabWindow.Y = "+ instance.ActiveTab.MainDocument.Body.DisplacementInTabWindow.Y.ToString());
         project.SendInfoToLog(" DisplacementInBrowser.Y = "+ instance.ActiveTab.MainDocument.Body.DisplacementInBrowser.Y.ToString());
      
        //Если новая точка со скроллом не вылазит за пределы страницы по у тогда устанавливаем новую позицию FullEmulationMouseCurrentPosition
        if ((point_x_y_do_skroll.Y + y_Scroll) < instance.ActiveTab.MainDocument.Body.BoundingClientHeight && (point_x_y_do_skroll.Y + y_Scroll) > 0)
        {
            //Записываемновые точки нахождения курсора с учетом СКРОЛЛА!!!
            project.SendInfoToLog("устанавливаем новую позицию FullEmulationMouseCurrentPosition = " + (point_x_y_do_skroll.Y + y_Scroll).ToString());
            instance.ActiveTab.FullEmulationMouseCurrentPosition = new Point(point_x_y_do_skroll.X, point_x_y_do_skroll.Y + y_Scroll);
        }
      
        Thread.Sleep(rnd.Next(3000, 9000));   
     } 
}
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 691
Баллы
113
та нее. не то. ну вот на реальную крысу посмотри когда ты скрол делаешь. у нее координаты разве меняются ? вот заведи эти координаты. и работай только в них. они будут в пределах экранных.
и надо сделать две формулы пересчета из абсолютных и наоборот. ну вот я тут примерчик накидывал. https://zennolab.com/discussion/threads/soxranjaetsja-polozhenie-myshi-pri-perexode-na-druguju-stranicu.70633/post-484699
 

ramzes8

Client
Регистрация
27.05.2016
Сообщения
43
Благодарностей
45
Баллы
18
надо сделать две формулы пересчета из абсолютных и наоборот.
можно пример формулы пересчета - что то не могу уловить мысль

вот это:
int win_pageYOffset = int.Parse(instance.ActiveTab.MainDocument.EvaluateScript("return window.pageYOffset;"));
old_y = old_y - win_pageYOffset;

то есть скриптом вытягиваешь высоту страницы, вычитаешь от нее координату последней FullEmulationMouseCurrentPosition.Y и получаеш положение на странице относительно body
я делал этот вариант но высоту страницы брал так instance.ActiveTab.MainDocument.Body.DisplacementInTabWindow.Y

от зависаний скролла не спасало
 
Последнее редактирование:

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 691
Баллы
113
можно пример формулы пересчета - что то не могу уловить мысль

вот это:
int win_pageYOffset = int.Parse(instance.ActiveTab.MainDocument.EvaluateScript("return window.pageYOffset;"));
old_y = old_y - win_pageYOffset;

то есть скриптом вытягиваешь высоту страницы, вычитаешь от нее координату последней FullEmulationMouseCurrentPosition.Y и получаеш положение на странице относительно body
я делал этот вариант но высоту страницы брал так instance.ActiveTab.MainDocument.Body.DisplacementInTabWindow.Y

от зависаний скролла не спасало
instance.ActiveTab.MainDocument.Body.DisplacementInTabWindow.Y это не высота страницы. это смещение верхнего визуального края от начала таба. вместо int.Parse(instance.ActiveTab.MainDocument.EvaluateScript("return window.pageYOffset;")); можно использовать.

как я работаю с крысой.
в переменных Old_Y храню визуальные координаты мышки. например это 500.
вначале снипета получаю координаты , получаю смещение визуального окна win_pageYOffset = instance.ActiveTab.MainDocument.Body.DisplacementInTabWindow.Y
допустим был скрол на 900 пунктов. значит надо высчитать абсолютное положение мышки соответствующее относительному.
считаю так Y_abs = Old_Y - win_pageYOffset это 500 - (-900) = 1400 пунктов.
и вот в эту точку телепортирую крысу до начала движения. instance.ActiveTab.FullEmulationMouseCurrentPosition=new Point(X_abs,Y_abs );
после этого можно двигать мышь , указав ей абсолютные координаты. я на этом этапе проверяю как далеко мышь уедет. там целая длинная процедура. в кратце если конечная точка не в пределах экранных координат , то делаю скрол на эту разницу . ну можно и не делать таких сложных проверок.
вот. после движения мышки я считываю ее положение с instance.ActiveTab.FullEmulationMouseCurrentPosition , считываю win_pageYOffset = instance.ActiveTab.MainDocument.Body.DisplacementInTabWindow.Y и пересчитываю текущие экранные координаты крысы. Old_Y = Y_abs + win_pageYOffset допустим крысу двинули до 2500 пунктов и окно при этом умудрилось проскролить и смещение у нас -2100 пунктов.
значит экранные координаты 2500+(-2100) = 400 пунктов. и сохранить в переменную.
таким образом неважно как и куда будет двигаться скрол , можно всегда начать двигать мышку с последней визуальной координатой. проверял в вебвизоре, выглядит человечно, странных телепортов не наблюдается.

вот примерчик как она двигается с такой реализацией. https://www.loom.com/share/2602b8524a284d7a9a7005fc7847b05f
 
  • Спасибо
Реакции: orka13

ramzes8

Client
Регистрация
27.05.2016
Сообщения
43
Благодарностей
45
Баллы
18
Спасибо за совет, буду пробовать, я это все делал, сейчас заметил что нет проверки на вылет курсора за пределы экрана, ставлю проверки тестю
 

dtk77

Client
Регистрация
26.07.2017
Сообщения
24
Благодарностей
4
Баллы
3
  • Спасибо
Реакции: orka13

ramzes8

Client
Регистрация
27.05.2016
Сообщения
43
Благодарностей
45
Баллы
18
Извините, в каком конкурсе планируется демонстрация кода этого "примерчика" и планируется ли?
Нет не планируется, я думал может есть матерые C# прогеры которые с визуал студией на ТЫ, и им не сложно подсказать как перекинуть в общий код эти методы, - но к сожалению сказали что сложно.

Я пошёл по пути наименьшего сопротивления и приспособил под себя FullEmulationMouseMove сделав отдельный метод рандомного движения курсора по экрану со скроллом.
 
  • Спасибо
Реакции: djaga

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)