Author Topic: Реалистичное передвижение курсора  (Read 78873 times)

0 Members and 1 Guest are viewing this topic.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #45 on: March 16, 2017, 09:33:47 AM »
А какой из этих скриптов самый правдивый по реалистичности ?

Никакой. Такой задачи не было. Делали просто не механическое и не прямолинейное движение слегка имитирующее обычные движения человека.
Нужен был достаточно простой скрипт, чтоб не сильно нагружал.
Ещё расчёт был на то, что даже при системах слежения за курсором, такие системы тоже не будут снимать данные с частотой достаточной чтоб ловить попиксельное перемещение.

Не вопрос, можно написать и более реальный. С изменением скорости по кривым и более разнообразной траекторией с хитрым алгоритмом или выбором из большого количества шаблонов.
Так и хотелось сделать в дальнейшем, но... применения не видно. Вот не поверишь нигде это не потребовалось. А без реального применения нет стимула всё выдумывать и отлаживать.
Тем более, как удалось выяснить, многие по разному понимают "реалистичность". Согласись, движения при рисовании на экране - одни, а прибежавшего с кухни по вызову скайпа, будут другие. Видимо ещё зависит от конкретной задачи. А делать прям совсем универсальный скрипт, со множеством настроек точности/скорости/хаотичности и пр. никто не хочет. И настраивать его потом будет сложно.

Можешь взяться за это дело и внести вклад. Все будут благодарны, заработаешь уважение и дружеское похлопывание по плечу  :D ;D


RasDimday

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #46 on: December 17, 2017, 01:34:13 PM »
Взял скипт от Oravenа. Первое перемещение срабатывает как нужно ведя курсор, а все последующие просто прыгает.
В чём может быть проблема?

RasDimday

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #47 on: December 17, 2017, 02:38:26 PM »
автор скрипта всё таки Vint, попробуйте какую нибудь из авторских версий.
Спасибо, скрипты от Vinta работают как надо.

Тимофей

  • Зашел в гости
  • *
  • Posts: 1
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #48 on: October 17, 2018, 01:13:23 AM »
Тема передвижения курсора совершенно заглохла. Хотя со временем она становится все более актуальной и важной.
Любой ресурс, с которого можно поиметь хотя бы "шерсти клок", пытается выявить ботоводов. Казалось бы- соблюдай осторожность при работе с мультиаккаунтами и не жадничай, но не все так просто. Банан прилетает еще на стадии отладки скрипта. У меня возникали подозрения по поводу сканирования курсора, но без уверенности. И вот в качестве доказательства, попадает мне информация от админов проекта. Оказалось, что для обеспечения "правильного" ГСЧ- берется передвижение мыши, данные тысяч пользователей хешируются. Как следствие, генератор приобретает статус аппаратного (не вдавался в подробности, но видимо это важно).
Нет сомнений, что паралельно выявляются подозрительные скачки курсора.
Подскажите, кто знает, как зарандомить мышу? Идеальным вариантом конечно будет вшитая в программу инструкция.
Но это могут сделать только разработчики Clickermann.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #49 on: October 17, 2018, 09:04:38 AM »
Банан прилетает еще на стадии отладки скрипта.
В том то и дело. Отлаживать всё равно придётся на конкретном проекте.

И ничего не заглохло, говорю же нет надобности. У кого есть надобность пусть двигает тему или хотя бы расшевелит  ;D
И делать под конкретную игру хоть и полезно (для неё) но не очень интересно.

По поводу хэшируемости, не думаю что хранят данные тысяч пользователей. Зачем? Если только выявлять ботоводов пользующихся одним [известным] ботом.

Вот про гуглокапчу "Я не робот" понял, что она пишет передвижение мыши и отсылает хэш вместе с другими параметрами. Заметил что гугл или на сервере или в куках помнит несколько таких хэшей, сколько ХЗ. Позже прочитал, что отправляется инфа о передвижении за последнюю секунду перед кликом, но это не точно. Ну в любом случае нет смысла писать продолжительное время, это ведь уменьшает уникальность и смысл теряется. Понятно что пишет последний период в цикле. И при клике отправляет.
Там даже допуск пришит (а  это на другой капче подобной, но не суть). Старался в ручном режиме делать минимальные передвижения или вообще без них (нацеливался заранее) так меня без всяких ботов через раз стали не пропускать. Но то гуглокапча, в принципе знающий JavaScript  распотрошив скрипты может хотя бы определить главные параметры слежения, ведь иначе за мышью в браузере нечем следить. А вот что делать с клиентом игры где не доберёшся. Только косвенно выявлять на что агрится защита и пытаться подстроится.


Bitya

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #50 on: February 04, 2020, 05:55:14 PM »
Тоже задался этим вопросом (да знаю, опять археология, но вопрос на сколько понимаю всё еще открытый). Задача поистине нетривиальная и комплексная, по этому решил решать её по частям, начиная с более простого.

Может я конечно что-то пропустил, но не видел отсылок в данной теме, а тем не менее аспект не менее важный - любое реалистичное перемещение из точки А в точку Б по определению зависит от самих этих точек А и Б. т.к. начальная точка почти всегда известна, то остаётся конечная - другими словами: в основе реалистичного передвижения курсора лежит реалистичный выбор "конечного пункта назначения".

Мне кажется, что авторы зачастую если и задаются данным вопросом, то решают его через рандом - задаётся конечная точка+-какоето расстояние по бокам. И в целом это не плохой подход, т.к. размазывает места кликов, но есть одно но - rand() генерирует равномерно распределённую случайную величину. Простыми словами для людей не особо знакомых с теорвером - в примере rand(1,10) шанс того что выпадет любой из возможных результатов одинаков(в данном случае 10%), т.е. получаем "1" с шансом в 10%, "2" с шансом в 10%, и т.д.

Когда же мы, люди, передвигаем кудато курсор, мы целимся априори в "центр" мишени. Но изза того что мы люди (а человеку свойственно ошибатся ;D), почти всегда промазываем попадая всё таки в некоторую окрестность центра. И при множественном повторении, случаев когда курсор в итоге оказался "ближе" к центру намного больше, чем тех где он в итоге оказался "дальше". И такое поведение очень хорошо, и в то же время довольно просто, моделируется нормальным распределением. Для человека не знакомому с теорвером обьяснить его суть в двух словах наверное будет проблематично, но если просто и вкратце(на примере первого рисунка в вики, красный график) - по оси Х то куда по факту будет попадать курсор, центр мишени в данном случае - 0, по оси Y - вероятность того что мы получим соответствующее значение Х(конечную точку для курсора). Как видим - чем ближе к центру(в примере красного графика - 0), тем выше вероятность получить такое значение. Собственно то что нам и требуется - целимся в центр мишени, но в итоге получаем значение с некоторым отклонением, в то же время чем ближе к центру, тем выше вероятность получить данное значение.

На практике данный способ я реализовал через численный метод, описанный здесь, "Метод генерации нормально распределенных чисел, использующий центральную предельную теорему"...вдруг ктото захочет ознакомится с первоисточником. Собственно, сам код:
Code: (clickermann) [Select]
SUB(NormalDistribution, $y_nd, $a_nd, $sigma_max)//немного слов о параметрах
                                                 //$y_nd - "ссылка" на переменную куда запишем результат
                                                 //$a_nd - "математическое ожидание", или простыми словами - центр мишени
                                                 //$sigma_max - три "средних отклонения", или простыми словами -
                                                 //радиус в который смоделированное итоговое значение попадет с шансом в 99+%.
                                                 //другими словами - $sigma_max задает интервал, относитительно центра,
                                                 //вокруг которого будем получать значения
                                                 
                                                 
   $result = 0
   $n = 6                                       //на сколько понял, n задаёт точность приближения к нормальному распределению
                                                 //чем больше тем лучше, но на практике вероятно хватит и меньших значений
                                                 //не уверен что можно брать любое число, я бы брал кратное 6
                                                 
   $sigma_nd = $sigma_max/3                      //переводим человеко-понятное значение интервала +-значений в "среднее отклонение"
                                                 //далее просто реализация алгоритма
   label_nd:
   $V = 0
   FOR($i=0, $i < $n)
      $r_i = RND(0,10000)
      $V = $V + $r_i
   END_CYC
   $V = $V/10000
   $Z = ($V - $n/2)/SQRT($n/12)
   $result = ROUND($Z*$sigma_nd + $a_nd,0)
   IF(ABS($result - $a_nd)>$sigma_max)           //проверка на то, что в итоге мы попали в заданный $sigma_max интервал
                                                 //т.к. есть шанс около ~0.3% что полученное значение будет лежать
                                                 //за его пределами, то в таком случае просто пересчитываем по новой
      LOGWRITE("")
      LOGWRITE("Выход случайного числа за заданный предел!")
      LOGWRITE("Ожидали ",$a_nd,"+-",$sigma_max,"; Получили ", $result)
      LOGWRITE("")
      GOTO(label_nd)
   END_IF
   SETVAR($y_nd, $result)
END_SUB


$target = 0//результирующее значение
NormalDistribution("$target",950,800)//передаём его в процедуру по "ссылке", что позволит
                                     //нам его  использовать дальше в том же блоке кода.
                                     //на выходе получаем уже число с нормальным распределением
                                     
$target = ROUND($target,0)           //округляем до целых
MOVE($target,500)                    //перемещаем курсор и кликаем
LDOWN($target, 500)
WAITMS(50)
LUP($target, 500)
WAITMS(50)

HALT

Наглядно увидеть и убедится воочию эффективность данного подхода довольно просто. Убираем в конце HALT, открываем paint или его веб-аналог, разворачиваем лист на весь экран, выбираем балончик спрея и запускаем скрипт. Мы будем чаще получать значения ближе к центру, что будет отображатся в свою очередь в более черном закрашивание этой области.

!!Важно - заданные в примере параметры "мат. ожидания" и "3*отклонения"(950 и 800 соответственно) выбраны для Full HD разрешения(1920 пикселов по иксу) - будем получать значения в интервале от 150 до 1750, с центром в 950. Для других разрешений выбирайте соответствующие параметры(для HD например 640 и 500)!!

Еще важно: данный подход хорошо подходит для кликанья по статичным элементам, для которых заранее известны их размеры(чтобы знать какое отклонение брать). В случае же динамичных и\или движущихся целей эффективность его под вопросом:
1). Некоторый элемент случайности места нажатия задаётся самой случайностью местонахождения цели, т.е. мы уже по определению не кликаем в "одну и ту же точку на кнопке"
2). т.к. итоговую координату мы всё же получаем в некоторой окрестности, то в случае динамической цели невозможно точно расчитать отклонение чтобы оно со 100% попадало в пределы цели, и есть шанс кликнуть мимо (например если за "центр" a.k.a. мат. ожидание будет взята точка на краю мишени)
По этому в случаях динамичных целей применять данный метод нужно с осторожностью и полным пониманием того, что при неправильном выборе центра и отклонения, мы можем промазать.
В то же время, дабы не плодить лишний код, динамические случаи можно спокойно обрабатывать просто задавая "отклонение"(последний параметр, три "сигмы") равным нулю. При таком варианте получаем вырожденный случай, когда клик будет ровно в том месте, которое задано в качестве "центра мишени"(второй параметр, мат. ожидание "а")
« Last Edit: February 06, 2020, 10:43:58 PM by Bitya »

Bitya

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #51 on: February 04, 2020, 07:05:52 PM »
Графомания не имеющая отношения к теме и ценности при практическом применении.
любое реалистичное перемещение из точки А в точку Б по определению зависит от самих этих точек А и Б. т.к. начальная точка почти всегда известна, то остаётся конечная - другими словами: в основе реалистичного передвижения курсора лежит реалистичный выбор "конечного пункта назначения".

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #52 on: February 05, 2020, 12:53:50 PM »
Да, просто тыкание в точку с рандомным отклонением не очень реалистично выглядит. И это уже обсуждали в какой-то теме, не стал искать, давно было.

Но както все сложно у тебя в расчетах, хотя вероятнее всего так и нужно. Я же всегда использовал рандомное отклонение от точки с рандомным интервалом этого самого отклонения (незнаю как правильно описать  :)) - выглядит это так $rnd_x= $x + rnd(rnd(-100, 0),rnd(0, 100)) - рандомное число от ($x-100) до ($x+100) где rnd_число стремится к числу $x.

График этих чисел по отношению к повторениям этих чисел выглядит немного не так как в твоих расчетах, но вполне себе реалистичен на деле.



Вот твой график, от 0 до 200 с центром в точке 100. Расчет по 5000 чисел (считает уж очень долго, нужно потерпеть).
Code: (clickermann) [Select]
SUB(NormalDistribution, $y_nd, $a_nd, $sigma_max)//немного слов о параметрах
   //$y_nd - "ссылка" на переменную куда запишем результат
   //$a_nd - "математическое ожидание", или простыми словами - центр мишени
   //$sigma_max - три "средних отклонения", или простыми словами -
   //радиус в который смоделированное итоговое значение попадет с шансом в 99+%.
   //другими словами - $sigma_max задает интервал, относитительно центра,
   //вокруг которого будем получать значения
   
   
   $result = 0
   $n = 192                                      //на сколько понял, n задаёт точность приближения к нормальному распределению
   //чем больше тем лучше, но на практике вероятно хватит и меньших значений
   //не уверен что можно брать любое число, я бы брал кратное 6
   
   $sigma_nd = $sigma_max/3                      //переводим человеко-понятное значение интервала +-значений в "среднее отклонение"
   //далее просто реализация алгоритма
   label_nd:
   $V = 0
   FOR($i=0, $i < $n)
      $r_i = RND(0,10000)
      $V = $V + $r_i
   END_CYC
   $V = $V/10000
   $Z = ($V - $n/2)/SQRT($n/12)
   $result = ROUND($Z*$sigma_nd + $a_nd,0)
   IF(ABS($result - $a_nd)>$sigma_max)           //проверка на то, что в итоге мы попали в заданный $sigma_max интервал
      //т.к. есть шанс около ~0.3% что полученное значение будет лежать
      //за его пределами, то в таком случае просто пересчитываем по новой
      //      LOGWRITE("")
      //      LOGWRITE("Выход случайного числа за заданный предел!")
      //      LOGWRITE("Ожидали ",$a_nd,"+-",$sigma_max,"; Получили ", $result)
      //      LOGWRITE("")
      GOTO(label_nd)
   END_IF
   SETVAR($y_nd, $result)
END_SUB



FOR($a=0,$a<5000) //записываем 5000 вероятных чисел 
   $target = 0
   NormalDistribution("$target",100,100)
   arrpush($arr_target, $target)          //помещаем в массив
END_CYC

arrsort($arr_target)  // сортируем

FOR($a=0,$a<arrsize($arr_target)-1)   //подсчет  вероятности попадания в одно число
   
   IF($arr_target[$a] = $arr_target[$a+1])
      $b = $b+1
   else
      IF($b > 0)
         arrpush($graf, $b)
      else
         arrpush($graf, 0)
      END_IF
      $b = 0
   END_IF
   
END_CYC


//рисуем график. где x - это выпавшее рандомное число, а y - это количество повторений этого числа
PXLREPLACE (0, 0, 199, 199, -1, 16777215)
FOR($a=0,$a<arrsize($graf))
   PXLREPLACE ($a, 200-$graf[$a], $a, 200-$graf[$a], -1, 0)
END_CYC
SCREENSHOTEX (0, 0, 199, 199)
HALT

График красивый, прям как на рисунках по твоим ссылкам. Только почему-то наблюдается небольшой сдвиг влево.



А вот что делает обычный рандом. Расчет по 5000 чисел, выполняется мгновенно.
Code: (clickermann) [Select]
FOR($a=0,$a<5000) //записываем 5000 вероятных чисел 

   $target = 100 + rnd(rnd(-100,0),rnd(0,100))

   arrpush($arr_target, $target)          //помещаем в массив
                                                                                                 
END_CYC



arrsort($arr_target)  // сортируем

FOR($a=0,$a<arrsize($arr_target)-1)   //подсчет  вероятности попадания в одно число
   
   IF($arr_target[$a] = $arr_target[$a+1])
      $b = $b+1
   else
      IF($b > 0)
         arrpush($graf, $b)
      else
         arrpush($graf, 0)
      END_IF
      $b = 0
   END_IF
   
END_CYC


//рисуем график. где x - это выпавшее рандомное число, а y - это количество повторений этого числа
PXLREPLACE (0, 0, 199, 199, -1, 16777215)
FOR($a=0,$a<arrsize($graf))
   PXLREPLACE ($a, 200-$graf[$a], $a, 200-$graf[$a], -1, 0)
END_CYC
SCREENSHOTEX (0, 0, 199, 199)
HALT

График более остроугольный, без плавного перехода.


Но на деле большой разницы то и нет.


Так зачем заморачиваться с такими сложными расчетами, если можно это все заменить вот на такой простейший рандом, который стремится к центру:

Code: (clickermann) [Select]
//будет стремиться попасть в точку ($x, $y)
LCLICK($x + rnd(rnd(-100, 0),rnd(0, 100)),$y + rnd(rnd(-100, 0),rnd(0, 100)))

Вот так выглядят эти клики:



Bitya

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #53 on: February 06, 2020, 02:50:34 PM »
2 dramster
Да, описанный тобой метод $rnd_x= $x + rnd(rnd(-100, 0),rnd(0, 100)) действительно даёт хорошие результаты, как-то даже и не приходил в голову подобный подход. Конечно, имитирует реальные клики он несколько хуже (вероятность попасть в конкретную точку, от края к центру, наростает линейно), но это с лихвой компенсируется и лучшей производительностью(выборка 5к чисел, 4 секунды против 12) и даже в большей степени - простотой реализации.
В общем, по сравнению с обычным рандомом $rnd_x= $x + rnd(-100,100) очень даже отличное решение.

Немного сравнительный тестов, для трёх вариантов рандомизации чисел. Первый рисунок - график вероятности получения конкретного числа(выборка 10к чисел, для наглядности отличий), из описанного выше тобой кода. У меня оно работает несколько кривовато, но общую суть показывает. Второй рисунок - как бы эти клики выглядели на плоскости(выборка 5к чисел).
Code: (clickermann) [Select]
//будет стремиться попасть в точку ($x, $y)
FOR($a=0,$a<5000)
   //1 вариант
   LCLICK($x + rnd(-100,100),$y + rnd(-100,100))
   //2 вариант
   LCLICK($x + rnd(rnd(-100, 0),rnd(0, 100)),$y + rnd(rnd(-100, 0),rnd(0, 100)))
   //3 вариант
   NormalDistribution("$x",$x,100)
   NormalDistribution("$y",$y,100)
   LCLICK($x,$y)
END_CYC
1) $rnd_x= $x + rnd(-100,100)
     
2) $rnd_x= $x + rnd(rnd(-100, 0),rnd(0, 100))
     
3) NormalDistribution("$rnd_x",$x,100)
     

Как видно, по сравнению с явным "палевом" варианта 1, остальные два дают на порядок более реальные результаты. И хотя и между ними есть разница, но ввиду вышеописанных преймуществ - твой вариант(второй) однозначно лучше.

p.s.:
Расчет по 5000 чисел (считает уж очень долго, нужно потерпеть).
В моём изначальном коде подправил параметр $n со 192 до 6(11-ая строка кода). На качество результата влият не особо, а с его увеличением производительность падает значительно.
График красивый, прям как на рисунках по твоим ссылкам. Только почему-то наблюдается небольшой сдвиг влево.
Проблема смещения в другом - ты в своём коде в блоке "//подсчет  вероятности попадания в одно число" используешь arrpush($graf, $b). В общем случае это вызывает неточность, т.к. оно просто накидывает сверху в массив количество уникальных результатов. Дело в том, что при 5000 выборке, мы не гарантированно получаем все возможные 200 уникальных чисел(из диапазона [-100;100]), и в таком случае итоговый массив $graf имеет меньшую длину чем 200, что в конечном итоге выражается в том что график сьезжает "влево".
А так как в моём варианте генерации случайных чисел, граничные значения имеют очень низкий шанс попастся(на порядки ниже, чем у тебя), то в выборке из 5000 их на много больше, и график сьезжает влево значительно ощутимей, что видно даже невооруженным глазом. Если же использовать $graf[$arr_target[$a]] = $b (т.е. на индекс сгенерированного числа будем записывать количество его появлений), то всё будет отображатся на графике правильно.
Я то понимаю что это всё писалось на коленке (и это не в коем случае не "предьява" :) ), но "сдвиг графика влево" это исключительно неточность визуализации полученного результата, а не его самого.


2 kiril
Прямоугольные сектора при обычном рандоме, дают гораздо более реалистичный разброс конечных координат передвижения.
Прямоугольные сектора при обычном рандоме, дают результаты описанные в варианте 1, а именно -

Где тут реалистичность - я не знаю.
« Last Edit: February 06, 2020, 10:46:02 PM by Bitya »

Tatiana_ol

  • Зашел в гости
  • *
  • Posts: 3
    • View Profile
    • hi!
hi!
« Reply #54 on: July 01, 2022, 08:49:55 AM »
Quote
Можно конечно ещё заморочиться.Код: Clickermann

You it is serious?

Bereza

  • Зашел в гости
  • *
  • Posts: 3
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #55 on: January 23, 2023, 12:03:29 AM »
Всем привет!
Похоже самая первая версия наиболее удачна.
Только припаять сверху чутоку  рамдомного алгоритма от dramster
и включить мышиные функции в конечной точки траектории и все вполне пригодно.
Наглядная прогонка паинтом тоже идея отличная !
Подпрограмма правда разбухает до пяти параметров, но зато, по моему, пока на все случаи жизни.
Скрин:
https://ibb.co/mH9nFTD
Винда 11-я, а в десятой кнопки паинта вроде другие, если в ней закоментить 130 строчку то вдруг не дай бог чего...


Code: (clickermann) [Select]
// подпрограмма обязательно выше вызова

SUB(mouse_move,$IN_X,$Razb_X,$IN_Y,$Razb_Y,$mouse)


   $MOVE_SPEED = 1  // множитель скорости

   
   $MOVE_END_X=$IN_X + rnd(rnd(-1*$Razb_X, 0),rnd(0, $Razb_X))
   $MOVE_END_Y=$IN_Y + rnd(rnd(-1*$Razb_Y, 0),rnd(0, $Razb_Y))
   $rnd_x= $x + rnd(rnd(-100, 0),rnd(0, 100))
   
   $MOVE_Start_X = $_xmouse
   $MOVE_Start_Y = $_ymouse
   $MOVE_X = $MOVE_Start_X
   $MOVE_Y = $MOVE_Start_Y
 
   $dist = DIST($MOVE_END_X,$MOVE_END_Y,$MOVE_Start_X,$MOVE_Start_Y)
 
   $MOVE_SPEEDVAR = INT((SQRT($dist))/$MOVE_SPEED)
 
   IF($MOVE_SPEEDVAR < 1)
      $MOVE_SPEEDVAR = 1
   END_IF
 
   $MOVE_step=($dist-1)/$MOVE_SPEEDVAR
   $MOVE_X_step = ($MOVE_END_X-$MOVE_Start_X)/$MOVE_step
   $MOVE_Y_step = ($MOVE_END_Y-$MOVE_Start_Y)/$MOVE_step
 
   FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
      $MOVE_X = $MOVE_X + $MOVE_X_step
      $MOVE_Y = $MOVE_Y + $MOVE_Y_step
      MOVE(ROUND($MOVE_X,0)+RND(-5,5), ROUND($MOVE_Y,0)+RND(-5,5)) // добавляем рандом
      WAITMS(1)
   END_CYC
 
   MOVE($MOVE_END_X, $MOVE_END_Y) //Передвинуть окончательно в заданную точку
   
    //Проверка действия мышиных клавиш
   
      WAITMS(50)
      IF($mouse=0 )
GOTO(mouse)
      END_IF
      IF($mouse=1 )
        LCLICK($MOVE_END_X, $MOVE_END_Y)   // Левый клик
GOTO(mouse)
      END_IF
      IF($mouse=2 )
        RCLICK($MOVE_END_X, $MOVE_END_Y)   // Правый клик
GOTO(mouse)
      END_IF   
      IF($mouse=3 )                             
        MCLICK($MOVE_END_X, $MOVE_END_Y)   //  Средний клик
GOTO(mouse)
      END_IF
      IF($mouse=4 )
        DBLCLICK($MOVE_END_X, $MOVE_END_Y) // Двойной левый
GOTO(mouse)
      END_IF     
      IF($mouse=5 )
        LDOWN($MOVE_END_X, $MOVE_END_Y)    // Зажать левую
GOTO(mouse)
      END_IF
      IF($mouse=6 )
        LUP($MOVE_END_X, $MOVE_END_Y)      // Отпустить левую
GOTO(mouse)
      END_IF   
      IF($mouse=7 )
        RDOWN($MOVE_END_X, $MOVE_END_Y)    // Зажать правую
GOTO(mouse)
      END_IF
      IF($mouse=8 )
        RUP($MOVE_END_X, $MOVE_END_Y)      //  Отпустить правую
GOTO(mouse)
      END_IF
      IF($mouse=9 )
        MDOWN($MOVE_END_X, $MOVE_END_Y)    // Зажать среднюю
GOTO(mouse)
      END_IF
      IF($mouse=10 )
        MUP($MOVE_END_X, $MOVE_END_Y)     // Отпустить среднюю
GOTO(mouse)
      END_IF   
      IF($mouse=11 )
        WHEELDOWN       // Колесико вниз
GOTO(mouse)
      END_IF
      IF($mouse=12 )
        WHEELUP         // Колесико вверх
GOTO(mouse)
      END_IF
      $mouse=0     
      mouse:
 
       
END_SUB

 
// образец

// mouse_move($IN_X,$Razb_X,$IN_Y,$Razb_Y,$mouse)  - 5 параметров


// 1: $IN_X - координата х
// 2: $Razb_X - разброс х
// 3: $IN_Y - координата Y
// 4: $Razb_Y - разброс Y

// 5: $mouse - код действия мыши -
//      - в конечной точке траектории

// $mouse = 0     нет действия
// $mouse = 1  LCLICK      (Левый клик)
// $mouse = 2  RCLICK      (Правый клик)
// $mouse = 3  MCLICK      (Средний клик)
// $mouse = 4  DBLCLICK    (Двойной левый клик)
// $mouse = 5  LDOWN       (Зажать левую)
// $mouse = 6  LUP         (Отпустить левую)
// $mouse = 7  RDOWN       (Зажать правую)
// $mouse = 8  RUP         (Отпустить правую)
// $mouse = 9  MDOWN       (Зажать среднюю)
// $mouse = 10 MUP         (Отпустить среднюю)
// $mouse = 11 WHEELDOWN   (Колесико вниз)
// $mouse = 12 WHEELUP     (Колесико вверх)


//Подготовка паинта

 GOTO(mouse2) // Пропускаем зачистку холста

// Очищаем холст паинта
 
mouse_move(140,8,110,8,1) // кликаем на выделение
WAITMS(50)
mouse_move(10,0,220,0,5) // Верхний угол рамки выделения
WAITMS(50)
mouse_move(1000,0,970,0,6) // Нижний угол рамки выделения
WAITMS(50)
RCLICK(500,250) // стираем все старое
WAITMS(500)
LCLICK(550,262) // стираем все старое
WAITMS(500)

mouse2:
mouse_move(300,5,100,5,4) // включаем карандаш

// рисуем треугольник

mouse_move(100,5,300,8,5)  // точка 1 c зажимом
WAITMS(50)
mouse_move(920,5,300,8,0)  // точка 2
WAITMS(50) 
mouse_move(510,100,900,5,0) // точка 3
WAITMS(150)
mouse_move(100,5,300,8,6) // точка 1 c отпуском
WAITMS(50)

// рисуем прямоугольник
 
mouse_move(300,5,350,8,5)  // точка 4 c зажимом
WAITMS(50)
mouse_move(720,5,350,8,0)  // точка 5
WAITMS(50) 
mouse_move(720,5,530,8,0) // точка 6
WAITMS(50)
mouse_move(300,5,530,8,0) // точка 7
WAITMS(150)
mouse_move(300,5,350,8,6) // точка 4 c отпуском
WAITMS(50)


 
HALT // стоп


Паинт лучше приклеить в левый верхний, нулевой угол и до тысячной координаты Х включительно, тогда в 11-той все кнопки совпадут с тестовым скриптом.
« Last Edit: January 23, 2023, 12:08:30 AM by Bereza »

Bereza

  • Зашел в гости
  • *
  • Posts: 3
    • View Profile
Re: Реалистичное передвижение курсора
« Reply #56 on: January 24, 2023, 01:03:00 AM »
Переписал скрипт, оказывается в кликермане свищ есть, оператор - недоглядел.
Поменял у подпрограммы порядок чередования параметров, с целю сделать обязательными только два первых, добавляя по одному по необходимости. Но так с подпрограммами ничего не работает - ошибка РОР. Есть ли способ как нибудь извернуться, например инклюдить как нить, вместо подпрограмм?

Code: (clickermann) [Select]
// подпрограмма обязательно выше вызова

SUB(mouse, $IN_X, $IN_Y, $mouse, $Razb_X, $Razb_Y)

   $MOVE_SPEED = 1  // множитель скорости

IF(($mouse = 11) or ($mouse = 12))
   $MOVE_END_X=$IN_X + rnd(rnd(-1*$Razb_Y, 0),rnd(0, $Razb_Y))
   $MOVE_END_Y=$IN_Y + rnd(rnd(-1*$Razb_Y, 0),rnd(0, $Razb_Y))
ELSE
   $MOVE_END_X=$IN_X + rnd(rnd(-1*$Razb_X, 0),rnd(0, $Razb_X))
   $MOVE_END_Y=$IN_Y + rnd(rnd(-1*$Razb_Y, 0),rnd(0, $Razb_Y)) 
END_IF

//-------------------------------------------------------

   $MOVE_Start_X = $_xmouse
   $MOVE_Start_Y = $_ymouse
   $MOVE_X = $MOVE_Start_X
   $MOVE_Y = $MOVE_Start_Y
 
   $dist = DIST($MOVE_END_X,$MOVE_END_Y,$MOVE_Start_X,$MOVE_Start_Y)
 
   $MOVE_SPEEDVAR = INT((SQRT($dist))/$MOVE_SPEED)
 
   IF($MOVE_SPEEDVAR < 1)
      $MOVE_SPEEDVAR = 1
   END_IF
 
   $MOVE_step=($dist-1)/$MOVE_SPEEDVAR
   $MOVE_X_step = ($MOVE_END_X-$MOVE_Start_X)/$MOVE_step
   $MOVE_Y_step = ($MOVE_END_Y-$MOVE_Start_Y)/$MOVE_step
 
   FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
      $MOVE_X = $MOVE_X + $MOVE_X_step
      $MOVE_Y = $MOVE_Y + $MOVE_Y_step
      MOVE(ROUND($MOVE_X,0)+RND(-5,5), ROUND($MOVE_Y,0)+RND(-5,5)) // добавляем рандом
      WAITMS(1)
   END_CYC
 
   MOVE($MOVE_END_X, $MOVE_END_Y) //Передвинуть окончательно в заданную точку
   
//-------------------------------------------------------
 
SWITCH($mouse)
CASE(0)
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(1)
LCLICK($MOVE_END_X, $MOVE_END_Y)   // Левый клик
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(2)
RCLICK($MOVE_END_X, $MOVE_END_Y)   // Правый клик
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(3)
MCLICK($MOVE_END_X, $MOVE_END_Y)   //  Средний клик
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(4)
DBLCLICK($MOVE_END_X, $MOVE_END_Y) // Двойной левый
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(5)
LDOWN($MOVE_END_X, $MOVE_END_Y)    // Зажать левую
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(6)
LUP($MOVE_END_X, $MOVE_END_Y)      // Отпустить левую
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(7)
RDOWN($MOVE_END_X, $MOVE_END_Y)    // Зажать правую
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(8)
RUP($MOVE_END_X, $MOVE_END_Y)      //  Отпустить правую
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(9)
MDOWN($MOVE_END_X, $MOVE_END_Y)    // Зажать среднюю
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(10)
MUP($MOVE_END_X, $MOVE_END_Y)     // Отпустить среднюю
CASE(11)
FOR($i=0, $i < $Razb_X)
print("- ",$i," -")
WHEELDOWN                         // Колесико вниз
WAITMS(200+rnd(rnd(-47,0),rnd(0,37)))
END_CYC
CASE(12)
FOR($i=0, $i < $Razb_X)
print("- ",$i," -")
WHEELUP                           // Колесико вверх
WAITMS(200+rnd(rnd(-47,0),rnd(0,37)))
END_CYC
END_SWITCH

$mouse=0
$Razb_X=0
$Razb_Y=0

END_SUB

//-------------------------------------------------------

//  SUB(mouse, $IN_X, $IN_Y, $mouse, $Razb_X, $Razb_Y)

// 1: $IN_X - координата х
// 2: $IN_Y - координата Y
// 3: $mouse -  действия мыши в конечной точке

// $mouse = 0     нет действия
// $mouse = 1  LCLICK      (Левый клик)
// $mouse = 2  RCLICK      (Правый клик)
// $mouse = 3  MCLICK      (Средний клик)
// $mouse = 4  DBLCLICK    (Двойной левый клик)
// $mouse = 5  LDOWN       (Зажать левую)
// $mouse = 6  LUP         (Отпустить левую)
// $mouse = 7  RDOWN       (Зажать правую)
// $mouse = 8  RUP         (Отпустить правую)
// $mouse = 9  MDOWN       (Зажать среднюю)
// $mouse = 10 MUP         (Отпустить среднюю)
// $mouse = 11 WHEELDOWN   (Колесико вниз)
// $mouse = 12 WHEELUP     (Колесико вверх)

//  Функции при  $mouse от 1 до 10
// 4: $Razb_X - разброс х
// 5: $Razb_Y - разброс Y

//  Функции при $mouse = 11 или 12
// 4: $Razb_X - число строк колесиком
// 5: $Razb_Y - разброс х  и  разброс Y


// Рисуем В  паинте

GOTO(mous) // Пропускаем зачистку холста

// Очищаем холст паинта
 
mouse(140,110,1,8,8) // кликаем на выделение
mouse(10,200,5,0,0) // Верхний угол рамки выделения
mouse(1000,970,6,0,0) // Нижний угол рамки выделения
mouse(500,250,2,0,0)  // Открываем меню
WAITMS(100)
mouse(560,267,1,0,0) // стираем  старое
WAITMS(100)

mous:
mouse(290,96,1,5,5)   // включаем карандаш

// рисуем треугольник

mouse(100,300,5,5,8)   // точка 1 c зажимом
mouse(920,300,0,5,8)   // точка 2 
mouse(510,900,0,100,5) // точка 3
mouse(100,300,6,5,8)   // точка 1 c отпуском

// рисуем прямоугольник
 
mouse(300,350,5,5,8)  // точка 4 c зажимом
mouse(720,350,0,5,8)  // точка 5 
mouse(720,530,0,5,8)  // точка 6
mouse(300,530,0,5,8)  // точка 7
mouse(300,350,6,5,8)  // точка 4 c отпуском

HALT


200 прогонов вроде неплохо: https://i.ibb.co/NF31nW6/2.png
« Last Edit: January 24, 2023, 11:36:21 AM by Bereza »