Автор Тема: Реалистичное передвижение курсора  (Прочитано 46124 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3802
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • Просмотр профиля
Re: Реалистичное передвижение курсора
« Ответ #45 : Март 16, 2017, 09:33:47 am »
А какой из этих скриптов самый правдивый по реалистичности ?

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

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

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


RasDimday

  • Зашел в гости
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Реалистичное передвижение курсора
« Ответ #46 : Декабрь 17, 2017, 01:34:13 pm »
Взял скипт от Oravenа. Первое перемещение срабатывает как нужно ведя курсор, а все последующие просто прыгает.
В чём может быть проблема?

RasDimday

  • Зашел в гости
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Реалистичное передвижение курсора
« Ответ #47 : Декабрь 17, 2017, 02:38:26 pm »
автор скрипта всё таки Vint, попробуйте какую нибудь из авторских версий.
Спасибо, скрипты от Vinta работают как надо.

Тимофей

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

Vint

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

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

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

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


Bitya

  • Зашел в гости
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Реалистичное передвижение курсора
« Ответ #50 : Февраль 04, 2020, 05:55:14 pm »
Тоже задался этим вопросом (да знаю, опять археология, но вопрос на сколько понимаю всё еще открытый). Задача поистине нетривиальная и комплексная, по этому решил решать её по частям, начиная с более простого.

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

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

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

На практике данный способ я реализовал через численный метод, описанный здесь, "Метод генерации нормально распределенных чисел, использующий центральную предельную теорему"...вдруг ктото захочет ознакомится с первоисточником. Собственно, сам код:
Код: Clickermann
  1. SUB(NormalDistribution, $y_nd, $a_nd, $sigma_max)//немного слов о параметрах
  2.                                                 //$y_nd - "ссылка" на переменную куда запишем результат
  3.                                                 //$a_nd - "математическое ожидание", или простыми словами - центр мишени
  4.                                                 //$sigma_max - три "средних отклонения", или простыми словами -
  5.                                                 //радиус в который смоделированное итоговое значение попадет с шансом в 99+%.
  6.                                                 //другими словами - $sigma_max задает интервал, относитительно центра,
  7.                                                 //вокруг которого будем получать значения
  8.  
  9.  
  10.   $result = 0
  11.   $n = 6                                       //на сколько понял, n задаёт точность приближения к нормальному распределению
  12.                                                 //чем больше тем лучше, но на практике вероятно хватит и меньших значений
  13.                                                 //не уверен что можно брать любое число, я бы брал кратное 6
  14.  
  15.   $sigma_nd = $sigma_max/3                      //переводим человеко-понятное значение интервала +-значений в "среднее отклонение"
  16.                                                 //далее просто реализация алгоритма
  17.   label_nd:
  18.   $V = 0
  19.   FOR($i=0, $i < $n)
  20.      $r_i = RND(0,10000)
  21.      $V = $V + $r_i
  22.   END_CYC
  23.   $V = $V/10000
  24.   $Z = ($V - $n/2)/SQRT($n/12)
  25.   $result = ROUND($Z*$sigma_nd + $a_nd,0)
  26.   IF(ABS($result - $a_nd)>$sigma_max)           //проверка на то, что в итоге мы попали в заданный $sigma_max интервал
  27.                                                 //т.к. есть шанс около ~0.3% что полученное значение будет лежать
  28.                                                 //за его пределами, то в таком случае просто пересчитываем по новой
  29.      LOGWRITE("")
  30.      LOGWRITE("Выход случайного числа за заданный предел!")
  31.      LOGWRITE("Ожидали ",$a_nd,"+-",$sigma_max,"; Получили ", $result)
  32.      LOGWRITE("")
  33.      GOTO(label_nd)
  34.   END_IF
  35.   SETVAR($y_nd, $result)
  36. END_SUB
  37.  
  38.  
  39. $target = 0//результирующее значение
  40. NormalDistribution("$target",950,800)//передаём его в процедуру по "ссылке", что позволит
  41.                                     //нам его  использовать дальше в том же блоке кода.
  42.                                     //на выходе получаем уже число с нормальным распределением
  43.  
  44. $target = ROUND($target,0)           //округляем до целых
  45. MOVE($target,500)                    //перемещаем курсор и кликаем
  46. LDOWN($target, 500)
  47. WAITMS(50)
  48. LUP($target, 500)
  49. WAITMS(50)
  50.  
  51. HALT
  52.  

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

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

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

Bitya

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

dramster

  • Герой форума
  • *****
  • Сообщений: 1130
    • Просмотр профиля
Re: Реалистичное передвижение курсора
« Ответ #52 : Февраль 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 чисел (считает уж очень долго, нужно потерпеть).
Код: Clickermann
  1. SUB(NormalDistribution, $y_nd, $a_nd, $sigma_max)//немного слов о параметрах
  2.   //$y_nd - "ссылка" на переменную куда запишем результат
  3.   //$a_nd - "математическое ожидание", или простыми словами - центр мишени
  4.   //$sigma_max - три "средних отклонения", или простыми словами -
  5.   //радиус в который смоделированное итоговое значение попадет с шансом в 99+%.
  6.   //другими словами - $sigma_max задает интервал, относитительно центра,
  7.   //вокруг которого будем получать значения
  8.  
  9.  
  10.   $result = 0
  11.   $n = 192                                      //на сколько понял, n задаёт точность приближения к нормальному распределению
  12.   //чем больше тем лучше, но на практике вероятно хватит и меньших значений
  13.   //не уверен что можно брать любое число, я бы брал кратное 6
  14.  
  15.   $sigma_nd = $sigma_max/3                      //переводим человеко-понятное значение интервала +-значений в "среднее отклонение"
  16.   //далее просто реализация алгоритма
  17.   label_nd:
  18.   $V = 0
  19.   FOR($i=0, $i < $n)
  20.      $r_i = RND(0,10000)
  21.      $V = $V + $r_i
  22.   END_CYC
  23.   $V = $V/10000
  24.   $Z = ($V - $n/2)/SQRT($n/12)
  25.   $result = ROUND($Z*$sigma_nd + $a_nd,0)
  26.   IF(ABS($result - $a_nd)>$sigma_max)           //проверка на то, что в итоге мы попали в заданный $sigma_max интервал
  27.      //т.к. есть шанс около ~0.3% что полученное значение будет лежать
  28.      //за его пределами, то в таком случае просто пересчитываем по новой
  29.      //      LOGWRITE("")
  30.      //      LOGWRITE("Выход случайного числа за заданный предел!")
  31.      //      LOGWRITE("Ожидали ",$a_nd,"+-",$sigma_max,"; Получили ", $result)
  32.      //      LOGWRITE("")
  33.      GOTO(label_nd)
  34.   END_IF
  35.   SETVAR($y_nd, $result)
  36. END_SUB
  37.  
  38.  
  39.  
  40. FOR($a=0,$a<5000) //записываем 5000 вероятных чисел  
  41.   $target = 0
  42.   NormalDistribution("$target",100,100)
  43.   arrpush($arr_target, $target)          //помещаем в массив
  44. END_CYC
  45.  
  46. arrsort($arr_target)  // сортируем
  47.  
  48. FOR($a=0,$a<arrsize($arr_target)-1)   //подсчет  вероятности попадания в одно число
  49.  
  50.   IF($arr_target[$a] = $arr_target[$a+1])
  51.      $b = $b+1
  52.   else
  53.      IF($b > 0)
  54.         arrpush($graf, $b)
  55.      else
  56.         arrpush($graf, 0)
  57.      END_IF
  58.      $b = 0
  59.   END_IF
  60.  
  61. END_CYC
  62.  
  63.  
  64. //рисуем график. где x - это выпавшее рандомное число, а y - это количество повторений этого числа
  65. PXLREPLACE (0, 0, 199, 199, -1, 16777215)
  66. FOR($a=0,$a<arrsize($graf))
  67.   PXLREPLACE ($a, 200-$graf[$a], $a, 200-$graf[$a], -1, 0)
  68. END_CYC
  69. SCREENSHOTEX (0, 0, 199, 199)
  70. HALT
  71.  

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



А вот что делает обычный рандом. Расчет по 5000 чисел, выполняется мгновенно.
Код: Clickermann
  1. FOR($a=0,$a<5000) //записываем 5000 вероятных чисел  
  2.  
  3.   $target = 100 + rnd(rnd(-100,0),rnd(0,100))
  4.  
  5.   arrpush($arr_target, $target)          //помещаем в массив
  6.  
  7. END_CYC
  8.  
  9.  
  10.  
  11. arrsort($arr_target)  // сортируем
  12.  
  13. FOR($a=0,$a<arrsize($arr_target)-1)   //подсчет  вероятности попадания в одно число
  14.  
  15.   IF($arr_target[$a] = $arr_target[$a+1])
  16.      $b = $b+1
  17.   else
  18.      IF($b > 0)
  19.         arrpush($graf, $b)
  20.      else
  21.         arrpush($graf, 0)
  22.      END_IF
  23.      $b = 0
  24.   END_IF
  25.  
  26. END_CYC
  27.  
  28.  
  29. //рисуем график. где x - это выпавшее рандомное число, а y - это количество повторений этого числа
  30. PXLREPLACE (0, 0, 199, 199, -1, 16777215)
  31. FOR($a=0,$a<arrsize($graf))
  32.   PXLREPLACE ($a, 200-$graf[$a], $a, 200-$graf[$a], -1, 0)
  33. END_CYC
  34. SCREENSHOTEX (0, 0, 199, 199)
  35. HALT

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


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


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

Код: Clickermann
  1. //будет стремиться попасть в точку ($x, $y)
  2. LCLICK($x + rnd(rnd(-100, 0),rnd(0, 100)),$y + rnd(rnd(-100, 0),rnd(0, 100)))

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



Bitya

  • Зашел в гости
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Реалистичное передвижение курсора
« Ответ #53 : Февраль 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к чисел).
Код: Clickermann
  1. //будет стремиться попасть в точку ($x, $y)
  2. FOR($a=0,$a<5000)
  3.   //1 вариант
  4.   LCLICK($x + rnd(-100,100),$y + rnd(-100,100))
  5.   //2 вариант
  6.   LCLICK($x + rnd(rnd(-100, 0),rnd(0, 100)),$y + rnd(rnd(-100, 0),rnd(0, 100)))
  7.   //3 вариант
  8.   NormalDistribution("$x",$x,100)
  9.   NormalDistribution("$y",$y,100)
  10.   LCLICK($x,$y)
  11. END_CYC
  12.  
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, а именно -

Где тут реалистичность - я не знаю.
« Последнее редактирование: Февраль 06, 2020, 10:46:02 pm от Bitya »