Автокликер Clickermann :: Форум

Основной раздел => Общие вопросы => Topic started by: WHOIM on September 07, 2015, 12:27:57 AM

Title: Реалистичное передвижение курсора
Post by: WHOIM on September 07, 2015, 12:27:57 AM
Делаю сборщик коробок для игры DarkOrbit. Столкнулся с такой задачей. Есть инфа, что в игре идет анализ движения мыши. И дабы не попасть в долгий бан хочу сделать более реалистичное, то есть не идеально ровное, передвижение курсора мыши. Скорость передвижения уже отрегулировал, а вот как быть с реалистичностью не пойму. Кликером пользуюсь третий день. Прошу помочь с данной задачей.

Вот часть кода:

Code: [Select]

SUB(MOVE_SLOW,$MOVE_END_X,$MOVE_END_Y)
   $MOVE_SPEED = 10
   
   $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), ROUND($MOVE_Y,0))
      WAITMS(1)
   END_CYC
   
   MOVE($MOVE_END_X, $MOVE_END_Y)
END_SUB

IF_PIXEL_IN(*,*,*,*, *)         //НАШЛИ ЦЕЛЬ
   Move_SLOW ($_return1, $_return2)       //двигаем мышь и кликаем на цель
   WAITMS(RND(80,125))
   LDOWN ($_return1, $_return2)           //Нажать ЛКМ
   WAITMS(RND(80,125))                     //Выдержка
   LUP($_return1, $_return2)               //Отпустить ЛКМ
   WAITMS(RND(1098,1989))                   //Ждем остановки
END_IF
Title: Re: Реалистичное передвижение курсора
Post by: WHOIM on September 07, 2015, 12:24:39 PM
Благодарю за новый кусочек кода. Проверил, все работает. Но все таки надо добавить и реалистичное передвижение.

Нашел похожий скрип. Только разобраться не могу как заставить его работать в моем примере.

Code: [Select]
#name "Цветок"
 
// Скрипт, рисующий(в паинте) цветок
 
$r = 100 // Радиус
$f = 24  // Форм фактор
$i = 0.3 // Смещение начала
 
while(($i*100) < 1640) // Начало цикла.
                       // Заглушка для проверки дробей
 
$x = cos($i*$f) // переход от полярных координат
$y = sin($i*$f) // к декартовым
 
$x = $x *($r-$i*$f/2) // Придание формы  спирали
$y = $y *($r-$i*$f/2) // и задание размера
 
  $x = $x + 100 + $r // Центрование
  $y = $y + 100 + $r // на холсте
 
  $x = round($x, 0) //  Округление координат
  $y = round($y, 0) //  Иначе клика не получим
 
  lclick($x, $y) // Сам клик
  waitms(50)  // Пауза: разгружает процессор
  $i = $i + 0.02  // следующая полярная координата
 
end_cyc  // Окончание цикла
 
halt // Точка выхода из скрипта

Еще вопрос. Как заставить подпрограмму повторяться определенное или рандомное кол-во раз.

Code: [Select]
SUB(LEFT FIND UP)
PIXELFINDx2()
LEFT UP()
PIXELFINDx2()
LEFT UP()
WAIT(RND(2,3))
END_SUB

LEFT FIND UP()
Title: Re: Реалистичное передвижение курсора
Post by: dramster on September 07, 2015, 03:52:44 PM
Quote
Но все таки надо добавить и реалистичное передвижение.
не знаю насколько реалистичное, но вот, добавил движение по синусу.
Code: (clickermann) [Select]
SUB(MOVE_SLOW,$MOVE_END_X,$MOVE_END_Y)
   $MOVE_SPEED = 20
   $MOVE_WAVE = 1 //длина волны
   $MOVE_AMPL = 30  //амплитуда
   
   $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
   
   IF($MOVE_END_X-$MOVE_Start_X > 0)
      $MOVE_X_X0 = $MOVE_END_X-$MOVE_Start_X
   else
      $MOVE_X_X0 = $MOVE_Start_X - $MOVE_END_X
   END_IF
   IF($MOVE_END_Y-$MOVE_Start_Y > 0)
      $MOVE_Y_Y0 = $MOVE_END_Y-$MOVE_Start_Y
   else
      $MOVE_Y_Y0 = $MOVE_Start_Y - $MOVE_END_Y
   END_IF
   
   IF($MOVE_X_X0 > $MOVE_Y_Y0)
      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), ROUND($MOVE_Y+(sin($MOVE_i*$MOVE_WAVE)*$MOVE_AMPL),0))
         WAITMS(1)
      END_CYC
   ELSE
      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+(sin($MOVE_i*$MOVE_WAVE)*$MOVE_AMPL),0), ROUND($MOVE_Y,0))
         WAITMS(1)
      END_CYC
   END_IF
   
   //   MOVE($MOVE_END_X, $MOVE_END_Y)   
END_SUB
изза такого движения, финишные координаты курсора немного не будут соответствовать заявленным в вызове подпрограммы. чем меньше амплитуда, тем точнее конечные координаты.

Quote
Еще вопрос. Как заставить подпрограмму повторяться определенное или рандомное кол-во раз.
Code: (clickermann) [Select]
SUB(LEFT FIND UP)
   PIXELFINDx2()
   LEFT UP()
   PIXELFINDx2()
   LEFT UP()
   WAIT(RND(2,3))
END_SUB


FOR($a=0,$a<3) // повторяем 3 раза
   LEFT FIND UP()
END_CYC

//или

FOR($a=0,$a<RND(1,4)) // повторяем 1, 2, 3 или 4 раза
   LEFT FIND UP()
END_CYC
Title: Re: Реалистичное передвижение курсора
Post by: dramster on September 08, 2015, 03:49:59 PM
вот более реалистичное передвижение с рандомным отклонением от прямой
Code: (clickermann) [Select]
SUB(MOVE_SLOW,$MOVE_END_X,$MOVE_END_Y)
   $MOVE_SPEED = 20
   $MOVE_WAVE = 10//длина волны
   $MOVE_AMPL = 30  //максимальная амплитуда
   
   $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
   
   IF($MOVE_END_X-$MOVE_Start_X > 0)
      $MOVE_X_X0 = $MOVE_END_X-$MOVE_Start_X
   else
      $MOVE_X_X0 = $MOVE_Start_X - $MOVE_END_X
   END_IF
   IF($MOVE_END_Y-$MOVE_Start_Y > 0)
      $MOVE_Y_Y0 = $MOVE_END_Y-$MOVE_Start_Y
   else
      $MOVE_Y_Y0 = $MOVE_Start_Y - $MOVE_END_Y
   END_IF
   
   
   $RAND=0
   
   IF($MOVE_X_X0 > $MOVE_Y_Y0)
      FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
         
         IF($RAND < 0)
            $RAND_mod=(-1)*$RAND
         else
            $RAND_mod=$RAND
         END_IF
         
         IF(INT($MOVE_step)-$MOVE_i > $RAND_mod)
            IF($WAVE>$MOVE_WAVE)
               IF(($RAND < $MOVE_AMPL)&($RAND > $MOVE_AMPL*(-1)))
                  $STEP=rnd(-1,1)
                  $RAND=$RAND+$STEP
               ELSE
                  IF($RAND = $MOVE_AMPL)
                     $STEP=rnd(-1,0)
                     $RAND=$RAND+$STEP
                  else
                     $STEP=rnd(0,1)
                     $RAND=$RAND+$STEP
                  END_IF
               END_IF
               $WAVE=0
            else
               inc($WAVE)
            END_IF
         ELSE
            IF($RAND < INT($MOVE_step)-$MOVE_i)
               $STEP=1
               $RAND=$RAND+$STEP
            ELSE
               $STEP=-1
               $RAND=$RAND+$STEP
            END_IF
         END_IF
         
         $MOVE_X = $MOVE_X + $MOVE_X_step
         $MOVE_Y = $MOVE_Y + $MOVE_Y_step
         MOVE(ROUND($MOVE_X,0), ROUND($MOVE_Y,0)+$RAND)
         WAITMS(1)
      END_CYC
   ELSE
      FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
         
         IF($RAND < 0)
            $RAND_mod=-$RAND
         else
            $RAND_mod=$RAND
         END_IF
         
         IF(INT($MOVE_step)-$MOVE_i > $RAND_mod)
            IF($WAVE>$MOVE_WAVE)
               IF(($RAND < $MOVE_AMPL)&($RAND > $MOVE_AMPL*(-1)))
                  $STEP=rnd(-1,1)
                  $RAND=$RAND+$STEP
               ELSE
                  IF($RAND = $MOVE_AMPL)
                     $STEP=rnd(-1,0)
                     $RAND=$RAND+$STEP
                  else
                     $STEP=rnd(0,1)
                     $RAND=$RAND+$STEP
                  END_IF
               END_IF
               $WAVE=0
            else
               inc($WAVE)
            END_IF
         ELSE
            IF($RAND < INT($MOVE_step)-$MOVE_i)
               $STEP=1
               $RAND=$RAND+$STEP
            ELSE
               $STEP=-1
               $RAND=$RAND+$STEP
            END_IF
         END_IF
         
         $MOVE_X = $MOVE_X + $MOVE_X_step
         $MOVE_Y = $MOVE_Y + $MOVE_Y_step
         MOVE(ROUND($MOVE_X,0)+$RAND, ROUND($MOVE_Y,0))
         WAITMS(1)
      END_CYC
   END_IF
   MOVE($MOVE_END_X,$MOVE_END_Y)
END_SUB

и финишные координаты по любому ие что надо.
Title: Re: Реалистичное передвижение курсора
Post by: Vint on September 08, 2015, 06:58:15 PM
Можно конечно ещё заморочиться.
Code: (clickermann) [Select]
SUB (m-move_s, $MOVE_END_X, $MOVE_END_Y, $MOVE_SPEED)
   $MOVE_WAVE = 10//длина волны
   $MOVE_AMPL = 30  //максимальная амплитуда
   
   $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
   
   IF($MOVE_END_X-$MOVE_Start_X > 0)
      $MOVE_X_X0 = $MOVE_END_X-$MOVE_Start_X
   else
      $MOVE_X_X0 = $MOVE_Start_X - $MOVE_END_X
   END_IF
   IF($MOVE_END_Y-$MOVE_Start_Y > 0)
      $MOVE_Y_Y0 = $MOVE_END_Y-$MOVE_Start_Y
   else
      $MOVE_Y_Y0 = $MOVE_Start_Y - $MOVE_END_Y
   END_IF
   
   
   $RAND=0
   
   IF($MOVE_X_X0 > $MOVE_Y_Y0)
      FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
         
         IF($RAND < 0)
            $RAND_mod=(-1)*$RAND
         else
            $RAND_mod=$RAND
         END_IF
         
         IF(INT($MOVE_step)-$MOVE_i > $RAND_mod)
            IF($WAVE>$MOVE_WAVE)
               IF(($RAND < $MOVE_AMPL)&($RAND > $MOVE_AMPL*(-1)))
                  $STEP=rnd(-1,1)
                  $RAND=$RAND+$STEP
               ELSE
                  IF($RAND = $MOVE_AMPL)
                     $STEP=rnd(-1,0)
                     $RAND=$RAND+$STEP
                  else
                     $STEP=rnd(0,1)
                     $RAND=$RAND+$STEP
                  END_IF
               END_IF
               $WAVE=0
            else
               inc($WAVE)
            END_IF
         ELSE
            IF($RAND < INT($MOVE_step)-$MOVE_i)
               $STEP=1
               $RAND=$RAND+$STEP
            ELSE
               $STEP=-1
               $RAND=$RAND+$STEP
            END_IF
         END_IF
         
         $MOVE_X = $MOVE_X + $MOVE_X_step
         $MOVE_Y = $MOVE_Y + $MOVE_Y_step
         MOVE(ROUND($MOVE_X,0), ROUND($MOVE_Y,0)+$RAND)
         WAITMS(1)
      END_CYC
   ELSE
      FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
         
         IF($RAND < 0)
            $RAND_mod=-$RAND
         else
            $RAND_mod=$RAND
         END_IF
         
         IF(INT($MOVE_step)-$MOVE_i > $RAND_mod)
            IF($WAVE>$MOVE_WAVE)
               IF(($RAND < $MOVE_AMPL)&($RAND > $MOVE_AMPL*(-1)))
                  $STEP=rnd(-1,1)
                  $RAND=$RAND+$STEP
               ELSE
                  IF($RAND = $MOVE_AMPL)
                     $STEP=rnd(-1,0)
                     $RAND=$RAND+$STEP
                  else
                     $STEP=rnd(0,1)
                     $RAND=$RAND+$STEP
                  END_IF
               END_IF
               $WAVE=0
            else
               inc($WAVE)
            END_IF
         ELSE
            IF($RAND < INT($MOVE_step)-$MOVE_i)
               $STEP=1
               $RAND=$RAND+$STEP
            ELSE
               $STEP=-1
               $RAND=$RAND+$STEP
            END_IF
         END_IF
         
         $MOVE_X = $MOVE_X + $MOVE_X_step
         $MOVE_Y = $MOVE_Y + $MOVE_Y_step
         MOVE(ROUND($MOVE_X,0)+$RAND, ROUND($MOVE_Y,0))
         WAITMS(1)
      END_CYC
   END_IF
   MOVE($MOVE_END_X,$MOVE_END_Y)
END_SUB

SUB (m-move2, $MOVE_E_X, $MOVE_E_Y)
   $raznx = ABS($_xmouse - $MOVE_E_X)
   $razny = ABS($_ymouse - $MOVE_E_Y)
   FOR($iter_move=20, $iter_move > 0, RND(-19,-6))
      $procx = INT($raznx/$iter_move)
      $procy = INT($razny/$iter_move)
      $ttx = $MOVE_E_X + RND(0,$procx)*RNDFROM(-1,1)
      $tty = $MOVE_E_Y + RND(0,$procy)*RNDFROM(-1,1)
      IF($ttx < 1)
         $ttx = RND(5,$procx)
      ELSE
         IF($ttx > ($_xmax-3))
            $ttx = $_xmax - RND(5,$procx)
         END_IF
      END_IF
      IF($tty < 1)
         $tty = RND(5,$procy)
      ELSE
         IF($tty > ($_ymax-3))
            $tty = $_ymax - RND(5,$procy)
         END_IF
      END_IF
      IF($iter_move=20)
         $SPEED = RND(16,20)
      ELSE
         $SPEED = 50
      END_IF
     
      m-move_s($ttx,$tty,$SPEED)
   END_CYC
   WAITMS(RND(50,300))
   m-move_s($MOVE_E_X, $MOVE_E_Y,0)
END_SUB

m-move2(150, 150)
WAITMS(500)
m-move2(1020, 370)
HALT
Title: Re: Реалистичное передвижение курсора
Post by: dramster on September 08, 2015, 07:58:28 PM
ABS()  :o :-\? такого в справке нету. всегда приходилось проверять условиями и присваивать значение другим переменным. может я еще чегото не знаю??
Title: Re: Реалистичное передвижение курсора
Post by: WHOIM on September 09, 2015, 12:51:58 AM
dramster, Vint, благодарю за помощь. Взял скрипт dramster. Vint, скрипт который ты отправил хорош, но чересчур нереалистичный. Прикреплю скрин из пеинта, дабы показать разницу.

Code: [Select]
LDOWN(185,197)
MOVE(165,391)
WAITMS(500)
MOVE(506,770)
LUP($_xmouse,$_ymouse)
WAIT(1)

LDOWN(385,197)
MOVE_SLOW(365,391)
WAITMS(500)
MOVE_SLOW(706,770)
LUP($_xmouse,$_ymouse)
WAIT(1)

LDOWN(585,197)
m-move2(565,391)
WAITMS(500)
m-move2(906,770)
LUP($_xmouse,$_ymouse)
HALT

Повторил код около 5 раз в разных цветах. Кружками обвел начало и конец линий. 1 линия скрипт MOVE. 2 линия скрипт dramster. 3 линия скрипт Vint. А в идеале должно быть как на 4 линии. Ее я нарисовал сам  :)

(http://s018.radikal.ru/i507/1509/a5/95d5b3c30d3ct.jpg) (http://radikal.ru/fp/ae565536970140aba248d3045473916d)
Title: Re: Реалистичное передвижение курсора
Post by: Oraven on September 09, 2015, 07:02:04 AM
Все оказалось куда проще  ;D Нужно просто добавить рандом в момент перемещения курсора.

Вот что вышло, надеюсь это реалистично?!
Code: (clickermann) [Select]
// подпрограмма обязательно выше вызова
SUB(mouse_move,$MOVE_END_X,$MOVE_END_Y)
   $MOVE_SPEED = 1  // множитель скорости
     
   $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) //Передвинуть окончательно в заданную точку
END_SUB



// образец строки MOVE
MOVE(520,380)  // точка 1

LDOWN(520,380) // рисуем

mouse_move(523,602)  // точка 2

mouse_move(637,834) // точка 3

LUP(637,834) // отпускаем

HALT // стоп

(http://savepic.net/7275518.png)

Вот еще вариант с промежуточной случайно отклоняющейся точкой
Code: (clickermann) [Select]
// подпрограмма обязательно выше вызова
SUB(mouse_move,$MOVE_END_X,$MOVE_END_Y)
   $MOVE_SPEED = 1  // множитель скорости
   
   $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(-2,2), ROUND($MOVE_Y,0)+RND(-2,2)) // добавляем рандом
      WAITMS(1)
   END_CYC
   
END_SUB

SUB(m_move,$M_X,$M_Y)
   $MOVE_MID_X = ($_xmouse+$M_X)/2
   $MOVE_MID_Y = ($_ymouse+$M_Y)/2
   mouse_move($MOVE_MID_X+RND(-30,30),$MOVE_MID_Y+RND(-30,30))
   mouse_move($M_X,$M_Y)
   MOVE($M_X,$M_Y) //Передвинуть окончательно в заданную точку
END_SUB



// образец строки MOVE
MOVE(520,380)  // точка 1

LDOWN(520,380) // рисуем

m_move(637,834) // передвигаем

LUP(637,834) // отпускаем

HALT // стоп
(http://savepic.net/7280625.png)
Title: Re: Реалистичное передвижение курсора
Post by: dramster on September 09, 2015, 10:39:32 AM
да, такие рандомные отклонения будут хорошо себя вести на максимальной скорости, где шаг перемещения 40-60пикс. но если поставить скорость на минимум, то курсор будет отклоняться не только со стороны в сторону, но и в зад в перед.
я себе еще ломал немного голову чтобы при перемещении по диагонали, смещятся также и по диагонали перпендикулярно нашему движению, чтобы не было перескоков через пиксели :D, но подумал, что это будет слишком.

хотя, пока писал этот пост, подумал что не так уж это и сложно. мы знаем катеты - корень из суммы квадратов $MOVE_X_step и Y_step это один катет(он у нас будет постоянным на все передвижение), второй это =1, узнаем гипотенузу, и както находим координаты точки в плоскости. и тогда при минимальной скорости передвижения, перескоков через пиксели не должно быть. но наверно это будет лишним.
Title: Re: Реалистичное передвижение курсора
Post by: Oraven on September 09, 2015, 01:17:13 PM
да, такие рандомные отклонения будут хорошо себя вести на максимальной скорости, где шаг перемещения 40-60пикс. но если поставить скорость на минимум, то курсор будет отклоняться не только со стороны в сторону, но и в зад в перед.

В том и смысл рандома! Все что нужно это добиться чтоб курсор ездил не как по линейке а немного коряво. Кроме того нужна именно высокая скорость, потому что ты там все коробки (в дарк орбит) пропустишь пока доведешь курсор куда нужно.
Title: Re: Реалистичное передвижение курсора
Post by: WHOIM on September 09, 2015, 03:19:45 PM
да, такие рандомные отклонения будут хорошо себя вести на максимальной скорости, где шаг перемещения 40-60пикс. но если поставить скорость на минимум, то курсор будет отклоняться не только со стороны в сторону, но и в зад в перед.

В том и смысл рандома! Все что нужно это добиться чтоб курсор ездил не как по линейке а немного коряво. Кроме того нужна именно высокая скорость, потому что ты там все коробки (в дарк орбит) пропустишь пока доведешь курсор куда нужно.

Очень хороший скрипт получился, за исключением скорости. Вы правы насчет того, что кликер пропустит много коробок. В моем скрипте он не попадает в коробку с первого раза, а кликает рядом, без всякого дополнения скрипта. Это происходит из-за небольшой скорости передвижения курсора.

Такой подход добавляет больше человечности в скрипт. Ведь люди тоже не попадают с первого раза, а иногда и со второго. Плюс скорость движения ни в коем случае не должна превышать "человеческую". Если в игре стоит тех анализ поведения игроков (а он скорее всего стоит), то скорость перемещения и клика будут самые основные показатели, выявляющие "читеров".  ;)

Если возможно заставить адекватно работать последний скрип на скорости от 6 до 8, дабы добавить рандом, буду премного благодарен.
Title: Re: Реалистичное передвижение курсора
Post by: Oraven on September 09, 2015, 04:46:18 PM
Вот последняя редакция с рандомом
Code: (clickermann) [Select]
// подпрограмма обязательно выше вызова
SUB(mouse_move,$MOVE_END_X,$MOVE_END_Y)
   $MOVE_SPEED = 1  // множитель скорости (отвечает за количество точек)
   
   $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(-2,2), ROUND($MOVE_Y,0)+RND(-2,2)) // добавляем рандом
      WAITMS($rnwait) // задержка при движении по точкам
   END_CYC
   
END_SUB

SUB(m_move,$M_X,$M_Y)
   $rnwait = RND(6,15) // случайная скорость
   $MOVE_MID_X = ($_xmouse+$M_X)/2
   $MOVE_MID_Y = ($_ymouse+$M_Y)/2
   mouse_move($MOVE_MID_X+RND(-30,30),$MOVE_MID_Y+RND(-30,30))
   mouse_move($M_X,$M_Y)
   MOVE($M_X,$M_Y) //Передвинуть окончательно в заданную точку
END_SUB

LDOWN(226,265) // рисуем
$MS = $_ms // засекаем время

m_move(839,989) // передвигаем

LUP(839,989) // отпускаем
LOGWRITE ($_ms-$MS, " - ", $rnwait)

HALT // стоп

Время передвижения на картинке занимает от 330 до 730 мс что вполне реалистично.
Code: [Select]
17:35:40 509 - 9
17:35:43 606 - 12
17:35:47 525 - 10
17:35:49 589 - 11
17:36:03 425 - 8
17:36:04 378 - 7
17:36:05 520 - 10
17:36:07 686 - 14
17:36:10 430 - 8
17:36:11 351 - 6
17:36:13 467 - 9
17:36:14 606 - 12
17:36:15 640 - 13
17:36:17 523 - 10
17:36:18 549 - 11
17:36:19 344 - 6
17:36:20 348 - 6
17:36:21 730 - 15

Title: Re: Реалистичное передвижение курсора
Post by: dramster on September 09, 2015, 06:05:20 PM
что то я загнался этим передвижением  :D . и чето подумал, а от чего же зависит скорость передвижения курсора в системе? как оказалось, она зависит только лиш (ну или почти) от шага $MOVE_step. а обновляться местоположение должно в пределах 4-7мс. в изначальном варианте стоит задержка 1мс ($rnwait), и это, как оказывается, маловато. и скорее всего менять эту задержку не желательно, а менять скорость передвижение только шагом $MOVE_step.
проверял так
Code: (clickermann) [Select]
wait(1)
print("бот")
m_move(910,540)
print("не бот")// начинаем дергать мышкай
wait(5)
halt


THREAD(thr_name)
   WHILE(1)
      $t=$_ms
      $x=$_xmouse
      $y=$_ymouse
      WHILE(($x=$_xmouse)&($y=$_ymouse))
         waitms(1)
      END_CYC
      print($_ms-$t)
   END_CYC
END_THREAD
у меня показало : там где бот - ($rnwait+-1);  там где не бот - в пределах 3-7 мс (в основном 4-6 мс), не зависимо от скорости дергания(конечно если не слишком медленно). возможно это только у меня так, а возможно что эта задержка и не играет никакой роли    :D
Title: Re: Реалистичное передвижение курсора
Post by: Oraven on September 09, 2015, 06:16:47 PM
Вряд ли игра снимает положение курсора каждую миллисекунду, это большая нагрузка. Достаточно это делать раз в несколько десятков мс. чтобы понять что курсором водят по экрану а не прыгают мгновенно из точки в точку.
Title: Re: Реалистичное передвижение курсора
Post by: Vint on September 10, 2015, 07:26:09 AM
что то я загнался этим передвижением  :D . и чето подумал, а от чего же зависит скорость передвижения курсора в системе? как оказалось, она зависит только лиш (ну или почти) от шага $MOVE_step.

Так я на основе этого и писал mouse_move. Скорость только шагом.
Title: Re: Реалистичное передвижение курсора
Post by: Vint on September 10, 2015, 07:38:56 AM
В последней версии всё хорошо, кроме...
($MOVE_MID_X+RND(-30,30),$MOVE_MID_Y+RND(-30,30))

При расстояниях близких или меньше 30 указатель пляшет чечётку.
В примере дистанция 948.654310062417, отклонение 30 это чуть больше 3%
Вот осталось заменить на 3% от дистанции, ну или 6% на половине дистанции. Ну или где то так.
Title: Re: Реалистичное передвижение курсора
Post by: Vint on September 10, 2015, 09:10:32 AM
Ну вот так попробовал
Code: (clickermann) [Select]
// подпрограмма обязательно выше вызова
SUB(mouse_move,$MOVE_END_X,$MOVE_END_Y)   
   $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_step = ($dist-1)/INT(SQRT($dist))
   $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(INT($MOVE_X) + RND(-2,2), INT($MOVE_Y) + RND(-2,2))
      WAITMS($rnwait) // задержка при движении по точкам
   END_CYC   
END_SUB

SUB(m_move,$M_X,$M_Y)
   $rnwait = RND(6,15) // случайная скорость
   $MOVE_MID_X = INT(($_xmouse+$M_X)/2)
   $MOVE_MID_Y = INT(($_ymouse+$M_Y)/2)
   $otx = INT(ABS($_xmouse - $M_X) * 0.12)
   $oty = INT(ABS($_ymouse - $M_Y) * 0.12)
   mouse_move($MOVE_MID_X+RND(-$otx,$otx), $MOVE_MID_Y+RND(-$oty,$oty))
   mouse_move($M_X,$M_Y)
   MOVE($M_X,$M_Y) //Передвинуть окончательно в заданную точку
END_SUB


LOGCLEAR

$MS = $_ms // засекаем время
LDOWN($_xmouse,$_ymouse) // рисуем
m_move(500,500) // передвигаем
LUP(500,500) // отпускаем
LOGWRITE ($_ms-$MS, " - ", $rnwait)

HALT
(https://i.ibb.co/XJH6ypj/2019-11-28-09-41-59.png) (https://ibb.co/XJH6ypj)
Title: Re: Реалистичное передвижение курсора
Post by: Flayka on October 21, 2015, 04:19:52 PM
Подстава.
Я чет и не думал, что можно движение мышки игрока снимать.) добавил рандома в клик по пикселям и радовался) надо теперь снова бота подпиливать) спасибо за кучу инфы!
Title: Re: Реалистичное передвижение курсора
Post by: Kedrick on October 22, 2015, 03:20:34 PM
А насколько реалистично такое предположение?
В браузерках это же невозможно (или тоже возможно уже?) и данный вопрос касается только клиентских приложений?
Title: Re: Реалистичное передвижение курсора
Post by: xDigital on December 14, 2015, 12:02:30 AM
кто поможет прикрутить к соединениям цифр?
Title: Re: Реалистичное передвижение курсора
Post by: xDigital on December 14, 2015, 11:49:18 PM
Всем спасиб разобрался, взял рандом от Vint
Title: Re: Реалистичное передвижение курсора
Post by: NewUserCM on April 01, 2016, 01:06:21 AM
Очень нужный код,только совершенно не понимаю как его вставлять в нужном месте
Title: Re: Реалистичное передвижение курсора
Post by: Oraven on August 14, 2016, 04:41:13 PM
Code: (clickermann) [Select]
// подпрограммы обязательно выше вызова
SUB(mouse_move,$MOVE_END_X,$MOVE_END_Y)   
   $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_step = ($dist-1)/INT(SQRT($dist))
   $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(INT($MOVE_X) + RND(-2,2), INT($MOVE_Y) + RND(-2,2))
      WAITMS(RND(3,9)) // задержка при движении по точкам случайная скорость
   END_CYC   
END_SUB
 
SUB(m_move,$M_X,$M_Y)
   $MOVE_MID_X = INT(($_xmouse+$M_X)/2)
   $MOVE_MID_Y = INT(($_ymouse+$M_Y)/2)
   $otx = INT(ABS($_xmouse - $M_X) * 0.12)
   $oty = INT(ABS($_ymouse - $M_Y) * 0.12)
   mouse_move($MOVE_MID_X+RND(-$otx,$otx), $MOVE_MID_Y+RND(-$oty,$oty))
   mouse_move($M_X,$M_Y)
   MOVE($M_X,$M_Y)
END_SUB

// вызов пишем вместо MOVE
m_move(500,500) // плавное перемещение мыши в заданную точку
 
HALT // стоп
Title: Re: Реалистичное передвижение курсора
Post by: squid on August 14, 2016, 06:25:07 PM
Кcтати я не знаю, насколько реалистично он выглядит при движении с одного угла в другой угол, но при горизонтальном движении (Y_START и Y_END равны) это выглядит вот так:

Code: [Select]
18:15:23 343, 783
18:15:23 350, 783
18:15:23 357, 783
18:15:23 367, 782
18:15:23 371, 782
18:15:23 379, 779
18:15:23 384, 783
18:15:23 396, 783
18:15:23 407, 780
18:15:23 416, 783
18:15:23 425, 781
18:15:23 433, 783
18:15:23 439, 783
18:15:23 452, 781
18:15:23 460, 782
18:15:23 467, 779
18:15:23 475, 780

Т.е. из всего этого навороченного алгоритма на выходе получаем простое:
Code: (clickermann) [Select]
FOR($X_START, $X_START<$X_END, RND(4,10))
    MOVE($X_START, $_ymouse+RND(-2,2)
    WAITMS(RND(3,9))

Хоть бы назад по X пару раз сдвинул...
Title: Re: Реалистичное передвижение курсора
Post by: Золотой on August 14, 2016, 07:29:10 PM
алгоритм проверен сотни раз и используется очень давно, не считай себя умнее всех, более вероятно обратное.
Title: Re: Реалистичное передвижение курсора
Post by: squid on August 15, 2016, 12:08:56 AM
алгоритм проверен сотни раз и используется очень давно, не считай себя умнее всех, более вероятно обратное.
Я вижу по координатам, а вы, видимо, не обратили как следует внимание на лог.
Title: Re: Реалистичное передвижение курсора
Post by: Золотой on August 15, 2016, 01:24:12 AM
а зачем лог, когда всё нагляднее графически.
Title: Re: Реалистичное передвижение курсора
Post by: squid on August 15, 2016, 03:21:48 AM
а зачем лог, когда всё нагляднее графически.
А... Поколение предпочитающее смотреть, а не читать. Ну вот смотрите видео (http://sendfile.su/1257499) (10 mb) с работы сего алгоритма на сайте реально следящим за автокликерами. Pac-man в результате означает о не понравившемуся движению мыши.  Последние две "проводки" уже в ручную (первый раз промахнулся) и результат "Ок"
Title: Re: Реалистичное передвижение курсора
Post by: Золотой on August 15, 2016, 09:48:22 AM
я ваше молодоепоколение удивлю, но технически грамотный человек должен уметь читать графическую информацию, а не знакомые буквы смотреть.
Title: Re: Реалистичное передвижение курсора
Post by: Vint on August 15, 2016, 11:44:37 AM
Т.е. из всего этого навороченного алгоритма на выходе получаем простое:
Code: (clickermann) [Select]
FOR($X_START, $X_START<$X_END, RND(4,10))
    MOVE($X_START, $_ymouse+RND(-2,2)
    WAITMS(RND(3,9))

Хоть бы назад по X пару раз сдвинул...

Никто и не говорил, что он супер реалистичный. Скрипт создавался не для Pak-man-ов... А для более-менее похожих на человека передвижений (без учёта кривой ускорения). Он нормально выглядит при любых передвижениях по экрану, при любых расстояниях и направлениях. Для игр, браузеров и пр.

А вот ты запусти свой FOR не на 130 пикселов и не по горизонтали и сразу поймёшь о чём речь. Цикл, кстати, не закрыт и скобок не хватает.
При просмотре первое что бросилось в глаза: почему даже скорость не настроена? При таких скоростях он и не пропустит.
Скорость подобрать под свой комп, чтобы курсор не летал как ужаленный.

Для решения этой капчи нужен индивидуальный подход, там условия свои.
А сделать выбор конечной точки с медленным прицеливанием туда-сюда разве сложно сделать? Нет.
Только это будет выглядеть мерзко при других условиях. Пробовали и такое, но получалась лажа, если честно.
Title: Re: Реалистичное передвижение курсора
Post by: squid on August 15, 2016, 02:14:17 PM
При просмотре первое что бросилось в глаза: почему даже скорость не настроена? При таких скоростях он и не пропустит.
Скорость подобрать под свой комп, чтобы курсор не летал как ужаленный.
Да менял я скорость и значения rnd. Один фиг.
Title: Re: Реалистичное передвижение курсора
Post by: Vint on August 15, 2016, 02:51:39 PM
Здесь вопрос больше не к реалистичности передвижения, а к решению конкретной капчи.
Алгоритм они меняли, реакция изменилась, нужно под них всё время подстраиваться.

У меня она и руками не всегда проходится. Не то, что с ответом "fail" когда мимо, а с ответом "forbidden", когда не понравилось. Китайцы...
Ещё замечания, которые увидел:
после нажатия сдвиг происходит почти мгновенно. Там ощутимая пауза нужна.
слишком точный конечный ответ.

Ты выложи код что уже есть, чтоб с нуля не делать, может покрутим .
Title: Re: Реалистичное передвижение курсора
Post by: squid on August 15, 2016, 03:06:43 PM
Здесь вопрос больше не к реалистичности передвижения, а к решению конкретной капчи.
Алгоритм они меняли, реакция изменилась, нужно под них всё время подстраиваться.
Изменил
Code: (clickermann) [Select]
MOVE(INT($MOVE_X) + RND(-2,2)на
Code: (clickermann) [Select]
MOVE(INT($MOVE_X) + RND(-15,2)Иногда дёргает по Х назад и вроде пока как работает уже 2 часа. Посмотрим...

после нажатия сдвиг происходит почти мгновенно. Там ощутимая пауза нужна.
Я писал свой (http://crapware.aidf.org/forum/index.php?topic=2510.msg15756#msg15756), но тот давно не работает.

P.S. Всё. Прекратил работать. У меня всё более стойкое ощущение, что они собирают базу движения мыши и анализируют. Поневоле о ИИ задумаешься.
Title: Re: Реалистичное передвижение курсора
Post by: Vint on August 15, 2016, 05:39:28 PM
Мучал часа два. Тоже пришёл к такому выводу. Делаешь один алгоритм, пока по нему отлаживаешь, они гады стату на тебя копят. Потом на этой же капче двигая руками но копируя алгоритм, результат  "fail". И после если капчу не сбросить, уже и не по алгоритму руками ничего не выходит. Раз 20 пробовал по разному.

Что интересно, на родном сайте капчи, где проверяется решение есть тоже образец
http://www.geetest.com/exp_embed
Так он решается автоматом даже при применении mouse_move. Но там как понятно нет привязки к юзеру и стата видать не собирается в демке.

А скрипт ты нигде не выкладывал. Нет его. Шифровка?
Title: Re: Реалистичное передвижение курсора
Post by: squid on August 15, 2016, 08:24:24 PM
А скрипт ты нигде не выкладывал. Нет его. Шифровка?
Деление на 5 отрезков. Первый и пятый медленные, а 2,3,4 побыстрее. Возможны ошибки в коде, но попался один из первых. Где-то так:

Code: (clickermann) [Select]
SUB(mouse_move, $X_END, $Y_END)
   $X_START = $_xmouse
   $X_TEMP = ($X_END - $X_START) / 5
   $VAR[0] = INT($X_TEMP)
   $VAR[1] = INT($X_TEMP * 3) + $X_TEMP/2
   $VAR[2] = INT($X_TEMP) - $X_TEMP/2
   FOR ($I = $X_START, $I < $X_START + $VAR[0], RND(0, 1))
      MOVE($I, $Y_END)
      WAITMS(RND(20, 35))
   END_CYC
   FOR ($I = $X_START + $VAR[0], $I < $X_START + $VAR[1] + $VAR[2], RND(1, 2))
      MOVE($I, $Y_END)
      WAITMS(RND(8, 15))
   END_CYC
   FOR ($I = $X_START + $VAR[1] + $VAR[2], $I < $X_END, RND(0, 1))
      MOVE($I, $Y_END)
      WAITMS(RND(20, 35))
   END_CYC
END_SUB
Title: Re: Реалистичное передвижение курсора
Post by: VGK on January 08, 2017, 11:24:08 PM
Плавное перемещение
Хоть и недавно зарегистрировался я на сайте, читал все и не один раз
видел, но не могу найти, пример движения мыши по траектории
Задача
Зажимаем лкм в координате 0, 10
двигаемся в $_xmax, 10
смещаемся в (например) в $_xmax, 50
двигаемся в 0, 50

смещаемся в в 0, 100
двигаемся в $_xmax, 100
отпускаем лкм
Title: Re: Реалистичное передвижение курсора
Post by: Oraven on January 09, 2017, 07:33:59 AM
Code: (clickermann) [Select]
// подпрограмма обязательно выше вызова
SUB(mouse_move, $MOVE_END_X,$MOVE_END_Y)
   $MOVE_SPEED = 3  // множитель скорости
   
   $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), ROUND($MOVE_Y,0))
      WAITMS(1)
   END_CYC
   
   MOVE($MOVE_END_X, $MOVE_END_Y)
END_SUB

LDOWN(0,10) // Зажимаем лкм в координате 0, 10
mouse_move($_xmax, 10) // двигаемся в $_xmax, 10
mouse_move($_xmax, 50) // смещаемся в (например) в $_xmax, 50
mouse_move(0, 50) // двигаемся в 0, 50
mouse_move(0, 100) // смещаемся в 0, 100
mouse_move($_xmax, 100) // двигаемся в $_xmax, 100
LUP(-1,-1) // отпускаем лкм

HALT // стоп
Title: Re: Реалистичное передвижение курсора
Post by: VGK on January 10, 2017, 08:18:21 PM
Спасибо
90 процентов проблемы закрыто
и вопрос
как сделать чтобы движение по отрезкам было медленнее типа один проход 3 секунды
Title: Re: Реалистичное передвижение курсора
Post by: VGK on January 10, 2017, 08:56:42 PM
менял
пока оптимального варианта не нашел
это сбор урожая и все время часть пропускает
Title: Re: Реалистичное передвижение курсора
Post by: ЦИТРИН on January 13, 2017, 12:05:17 AM
Вряд ли игра снимает положение курсора каждую миллисекунду, это большая нагрузка. Достаточно это делать раз в несколько десятков мс. чтобы понять что курсором водят по экрану а не прыгают мгновенно из точки в точку.
Вы правы.
Анализ поведения курсора , -  это уже  ближе к паранойе.
Никто из разработчиков не  будет тратить уйму  денег,  чтобы контролировать курсоры игроков.
Смысл?  Денег потратят кучу и допустим  отсеют  двух-трех вундеркиндов  из миллиона  пользователей.
Где  навар ?
Пока ни в одной игре (даже не приличные деньги с парой тыщ рублей на кону)  я не видел , чтоб мой курсор спалили.
Ясно, что везде рандомы кликам и паузам ставлю, но  это несложный прием в скрипте .
Например вот:
         WAITMS (rnd(50,150))
         LCLICK($X+ (rnd(0,39)) , $Y+ (rnd(0,5))
         WAITMS (rnd(50,150))
Title: Re: Реалистичное передвижение курсора
Post by: ЦИТРИН on January 13, 2017, 11:15:32 AM
Вот тут не согласен, есть такая штука Вебвизор. И пользуются ей действительно параноики, а ещё хуже сожают своих сотрудников на проверку, так вот индивидуальный бот им просто не с чем сравнивать и он пропускается, а даже минимально распостранённый, проверяется как совпадение картинок хоть скриптом нашего кликера. Были случаи, что люди проверяли 30 копеешные задания, лишь-бы только не оплачивать. Если есть техническая возможность проверить, и материальная заинтересованность проверяющего, то проверять будут.
Как Вы себе представляете  проверку движений курсоров миллиона пользователей  некой популярной игры типа Дак Орбит?
Тут ведь  речь изначально  шла о играх.
Но даже в денежных играх владелец ресурса  выгонит  админов, которые будут маяться  дурью и тратить приличное бабло ради экономии в "30 копеек" , как Вы предположили.
Допускаю  единичное  состязание, когда админам нечего делать и они от скуки просто ловят блох  , расходуя  приличные деньги хозяина игры. 
 
Title: Re: Реалистичное передвижение курсора
Post by: ЦИТРИН on January 13, 2017, 03:05:33 PM
... не стоит недооценивать жадность и возможности автоматизации различных проверок хозяевами сайтов.
Обычный рандом  на кликах и паузах  решает  все проблемы .
Меня ни разу не спалили, хотя пользуюсь кликерманом почти во всех играх и даже  денежных  приложениях типа ёбита. https://yobit.net/ru/freecoins/
Там раздают реальные деньги нахаляву . И все скрипты кликермана спокойно работают , вопреки запрету админов  использовать ботов.
Title: Re: Реалистичное передвижение курсора
Post by: squid on February 09, 2017, 02:53:14 PM
... не стоит недооценивать жадность и возможности автоматизации различных проверок хозяевами сайтов.
Обычный рандом  на кликах и паузах  решает  все проблемы .
Увы не все. (http://crapware.aidf.org/forum/index.php?topic=2112.msg16714#msg16714)
Title: Ну что, попробуем утереть гуглу нос?
Post by: ЦИТРИН on March 15, 2017, 12:41:04 AM
CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) — это технология, которая позволяет отличить бота от настоящего пользователя. Их использование позволяет уменьшить поток спама и защитить страницы. Наиболее популярны графические капчи — т. е. в которых пользователю предлагается разобрать текст, который якобы не может прочитать машина, или определить, что изображено на картинке.

Однако в последние годы технологии распознавания изображений продвинулись так далеко, что иногда компьютер улавливает зашифрованные смыслы лучше человеческого глаза: пользуясь этим, компьютерам доверяют, например, чтение едва заметных писмён на археологических находках или старых картинах. И с распознаванием изображений у машин всё обстоит довольно неплохо: учёные, правда, до сих пор просят граждан помочь в анализе больших массивов изображений, как в проекте Backyard Science, но с более простыми задачами программы справляются самостоятельно — Google и другие поисковики давно умеют искать по картинкам, недавно был запущен Shazam для картин, ИИ неплохо разгадывает даже очень плохие рисунки пользователей.

В условиях возрастающей мощи компьютера традиционная графическая капча перестаёт быть помехой для серьёзных злоумышленников и целеустремлённых спамеров. Поэтому Google отказался от традиционной интерактивной капчи и вместо этого будет анализировать поведение пользователя самостоятельно. В частности, программа будет фиксировать движения мышки и IP-адрес пользователя. Боты, как правило, передвигают курсор кратчайшим путём; человек так сделать, естественно, не может и не хочет.

Добавить новую reCAPTCHA на свой сайт можно здесь.

Новая капча отображается только в виде окошка, в котором программа сама ставит галочку и сообщает вам о том, что вы не робот. Спасибо, Google.
http://www.popmech.ru/technologies/339882-google-pridumal-nevidimuyu-kapchu-kotoraya-ne-razdrazhaet/
 

Кто-то уже попробовал кликерманом входить? ?
Title: Re: Реалистичное передвижение курсора
Post by: Vipz on March 15, 2017, 11:52:13 PM
А какой из этих скриптов самый правдивый по реалистичности ?

Есть что то , что двигалось плавными волнами , без дерганий каждые 5 px
и по мере проходимости набирало бы скорость... т.е. - медленное начало движения перед кликом ~500ms , а далее разгон до точки
все как в вебвизоре люди носятся , есть что то подобное ?
Title: Re: Реалистичное передвижение курсора
Post by: Vint on March 16, 2017, 09:33:47 AM
А какой из этих скриптов самый правдивый по реалистичности ?

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

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

Можешь взяться за это дело и внести вклад. Все будут благодарны, заработаешь уважение и дружеское похлопывание по плечу  :D ;D
Title: Re: Реалистичное передвижение курсора
Post by: RasDimday on December 17, 2017, 01:34:13 PM
Взял скипт от Oravenа. Первое перемещение срабатывает как нужно ведя курсор, а все последующие просто прыгает.
В чём может быть проблема?
Title: Re: Реалистичное передвижение курсора
Post by: RasDimday on December 17, 2017, 02:38:26 PM
автор скрипта всё таки Vint, попробуйте какую нибудь из авторских версий.
Спасибо, скрипты от Vinta работают как надо.
Title: Re: Реалистичное передвижение курсора
Post by: Тимофей on October 17, 2018, 01:13:23 AM
Тема передвижения курсора совершенно заглохла. Хотя со временем она становится все более актуальной и важной.
Любой ресурс, с которого можно поиметь хотя бы "шерсти клок", пытается выявить ботоводов. Казалось бы- соблюдай осторожность при работе с мультиаккаунтами и не жадничай, но не все так просто. Банан прилетает еще на стадии отладки скрипта. У меня возникали подозрения по поводу сканирования курсора, но без уверенности. И вот в качестве доказательства, попадает мне информация от админов проекта. Оказалось, что для обеспечения "правильного" ГСЧ- берется передвижение мыши, данные тысяч пользователей хешируются. Как следствие, генератор приобретает статус аппаратного (не вдавался в подробности, но видимо это важно).
Нет сомнений, что паралельно выявляются подозрительные скачки курсора.
Подскажите, кто знает, как зарандомить мышу? Идеальным вариантом конечно будет вшитая в программу инструкция.
Но это могут сделать только разработчики Clickermann.
Title: Re: Реалистичное передвижение курсора
Post by: Vint on October 17, 2018, 09:04:38 AM
Банан прилетает еще на стадии отладки скрипта.
В том то и дело. Отлаживать всё равно придётся на конкретном проекте.

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

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

Вот про гуглокапчу "Я не робот" понял, что она пишет передвижение мыши и отсылает хэш вместе с другими параметрами. Заметил что гугл или на сервере или в куках помнит несколько таких хэшей, сколько ХЗ. Позже прочитал, что отправляется инфа о передвижении за последнюю секунду перед кликом, но это не точно. Ну в любом случае нет смысла писать продолжительное время, это ведь уменьшает уникальность и смысл теряется. Понятно что пишет последний период в цикле. И при клике отправляет.
Там даже допуск пришит (а  это на другой капче подобной, но не суть). Старался в ручном режиме делать минимальные передвижения или вообще без них (нацеливался заранее) так меня без всяких ботов через раз стали не пропускать. Но то гуглокапча, в принципе знающий JavaScript  распотрошив скрипты может хотя бы определить главные параметры слежения, ведь иначе за мышью в браузере нечем следить. А вот что делать с клиентом игры где не доберёшся. Только косвенно выявлять на что агрится защита и пытаться подстроится.
Title: Re: Реалистичное передвижение курсора
Post by: Bitya on February 04, 2020, 05:55:14 PM
Тоже задался этим вопросом (да знаю, опять археология, но вопрос на сколько понимаю всё еще открытый). Задача поистине нетривиальная и комплексная, по этому решил решать её по частям, начиная с более простого.

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

Мне кажется, что авторы зачастую если и задаются данным вопросом, то решают его через рандом - задаётся конечная точка+-какоето расстояние по бокам. И в целом это не плохой подход, т.к. размазывает места кликов, но есть одно но - rand() генерирует равномерно распределённую случайную величину (https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D0%BF%D1%80%D0%B5%D1%80%D1%8B%D0%B2%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D0%B2%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5). Простыми словами для людей не особо знакомых с теорвером - в примере rand(1,10) шанс того что выпадет любой из возможных результатов одинаков(в данном случае 10%), т.е. получаем "1" с шансом в 10%, "2" с шансом в 10%, и т.д.

Когда же мы, люди, передвигаем кудато курсор, мы целимся априори в "центр" мишени. Но изза того что мы люди (а человеку свойственно ошибатся ;D), почти всегда промазываем попадая всё таки в некоторую окрестность центра. И при множественном повторении, случаев когда курсор в итоге оказался "ближе" к центру намного больше, чем тех где он в итоге оказался "дальше". И такое поведение очень хорошо, и в то же время довольно просто, моделируется нормальным распределением (https://ru.wikipedia.org/wiki/%D0%9D%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5). Для человека не знакомому с теорвером обьяснить его суть в двух словах наверное будет проблематично, но если просто и вкратце(на примере первого рисунка в вики, красный график) - по оси Х то куда по факту будет попадать курсор, центр мишени в данном случае - 0, по оси Y - вероятность того что мы получим соответствующее значение Х(конечную точку для курсора). Как видим - чем ближе к центру(в примере красного графика - 0), тем выше вероятность получить такое значение. Собственно то что нам и требуется - целимся в центр мишени, но в итоге получаем значение с некоторым отклонением, в то же время чем ближе к центру, тем выше вероятность получить данное значение.

На практике данный способ я реализовал через численный метод, описанный здесь (http://stratum.ac.ru/education/textbooks/modelir/lection25.html), "Метод генерации нормально распределенных чисел, использующий центральную предельную теорему"...вдруг ктото захочет ознакомится с первоисточником. Собственно, сам код:
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 или его веб-аналог (https://jspaint.app/), разворачиваем лист на весь экран, выбираем балончик спрея и запускаем скрипт. Мы будем чаще получать значения ближе к центру, что будет отображатся в свою очередь в более черном закрашивание этой области.

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

Еще важно: данный подход хорошо подходит для кликанья по статичным элементам, для которых заранее известны их размеры(чтобы знать какое отклонение брать). В случае же динамичных и\или движущихся целей эффективность его под вопросом:
1). Некоторый элемент случайности места нажатия задаётся самой случайностью местонахождения цели, т.е. мы уже по определению не кликаем в "одну и ту же точку на кнопке"
2). т.к. итоговую координату мы всё же получаем в некоторой окрестности, то в случае динамической цели невозможно точно расчитать отклонение чтобы оно со 100% попадало в пределы цели, и есть шанс кликнуть мимо (например если за "центр" a.k.a. мат. ожидание будет взята точка на краю мишени)
По этому в случаях динамичных целей применять данный метод нужно с осторожностью и полным пониманием того, что при неправильном выборе центра и отклонения, мы можем промазать.
В то же время, дабы не плодить лишний код, динамические случаи можно спокойно обрабатывать просто задавая "отклонение"(последний параметр, три "сигмы") равным нулю. При таком варианте получаем вырожденный случай, когда клик будет ровно в том месте, которое задано в качестве "центра мишени"(второй параметр, мат. ожидание "а")
Title: Re: Реалистичное передвижение курсора
Post by: Bitya on February 04, 2020, 07:05:52 PM
Графомания не имеющая отношения к теме и ценности при практическом применении.
любое реалистичное перемещение из точки А в точку Б по определению зависит от самих этих точек А и Б. т.к. начальная точка почти всегда известна, то остаётся конечная - другими словами: в основе реалистичного передвижения курсора лежит реалистичный выбор "конечного пункта назначения".
Title: Re: Реалистичное передвижение курсора
Post by: dramster 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

График красивый, прям как на рисунках по твоим ссылкам. Только почему-то наблюдается небольшой сдвиг влево.
(https://i.imgur.com/ZpCTDkR.png)


А вот что делает обычный рандом. Расчет по 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

График более остроугольный, без плавного перехода.
(https://i.imgur.com/jk85Vpk.png)

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


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

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

Вот так выглядят эти клики:
(https://i.imgur.com/OGMzD7w.png)

Title: Re: Реалистичное передвижение курсора
Post by: Bitya 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)
(https://i.imgur.com/agfZvO7.png)      (https://i.imgur.com/bfcTfiS.png)
2) $rnd_x= $x + rnd(rnd(-100, 0),rnd(0, 100))
(https://i.imgur.com/vr7Fo01.png)      (https://i.imgur.com/nsic94r.png)
3) NormalDistribution("$rnd_x",$x,100)
(https://i.imgur.com/OW04qac.png)      (https://i.imgur.com/oWf6Nai.png)

Как видно, по сравнению с явным "палевом" варианта 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, а именно -
(https://i.imgur.com/bfcTfiS.png)
Где тут реалистичность - я не знаю.
Title: hi!
Post by: Tatiana_ol on July 01, 2022, 08:49:55 AM
Quote
Можно конечно ещё заморочиться.Код: Clickermann

You it is serious?
Title: Re: Реалистичное передвижение курсора
Post by: Bereza on January 23, 2023, 12:03:29 AM
Всем привет!
Похоже самая первая версия наиболее удачна.
Только припаять сверху чутоку  рамдомного алгоритма от dramster
и включить мышиные функции в конечной точки траектории и все вполне пригодно.
Наглядная прогонка паинтом тоже идея отличная !
Подпрограмма правда разбухает до пяти параметров, но зато, по моему, пока на все случаи жизни.
Скрин:
https://ibb.co/mH9nFTD (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-той все кнопки совпадут с тестовым скриптом.
Title: Re: Реалистичное передвижение курсора
Post by: Bereza 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 (https://i.ibb.co/NF31nW6/2.png)