Функция кругового движения мышью

Тестирование сайтов эмуляцией посещений пользователей
Ответить
Аватара пользователя
spaiker
Сообщения: 33
Зарегистрирован: 14 сен 2017, 02:01

Функция кругового движения мышью

Сообщение spaiker » 17 сен 2017, 20:38

Делюсь функцией кругового движения мышью.

$k1 - смещение окружности от полученного центра
$k2 - коэффициент для получения радиуса
$k3 - смещение точек на окружности

меняя эти коэффициенты будем получать каждый раз разные движения.
// круговое движение мышкой
function circle_run_mouse($full_emul = false)
{
	global $browser, $mouse;
	
	// коэффициент для центра окружности
	$k1 = rand(-200, 200);
	// коэффициент для радиуса окружности
	$k2 = rand(3, 5);
	// коэффициент для точек на окружности
	$k3 = rand(-20, 20);
	
	// получаем ширину и высоту окна браузера
	$page_width = $browser->get_window_width();
	$page_height = $browser->get_window_height();
	
	// вычисляем координаты центра окружности
	$x = $page_width/2 + $k1;
	$y = $page_height/2 + $k1;
	
	// вычисляем радиус окружности
	if ($page_width < $page_height)
	{
		$radius =  $page_width/$k2;
	}
	else
	{
		$radius =  $page_height/$k2;
	}
	
	// проверка если радиус больше ширины или длины окна
	while (($radius >= $page_width/2-abs($k1)) or ($radius >= $page_height/2-abs($k1)))
	{
		$radius -= 10;
	}
	$radius = floor($radius); 
	// чертим
	if ($full_emul)
	{
                // двигаемся по полученным точкам
		for ($angle = 0; $angle <= 360; $angle += 5, $k3 = rand(-10, 10))
		{
			$x1 = floor($x + cos(deg2rad($angle)) * $radius) + $k3;
			$y1 = floor($y + sin(deg2rad($angle)) * $radius) + $k3;
                        // двигаем реальную мышь
			$mouse->move($x1, $y1, false, 0, 5);
		}
	}
	else
	{
		for ($angle = 0; $angle <= 360; $angle += 5, $k3 = rand(-10, 10))
		{
			$x1 = floor($x + cos(deg2rad($angle)) * $radius) + $k3;
			$y1 = floor($y + sin(deg2rad($angle)) * $radius) + $k3;
                        // передаём только событие движения мышью
			$mouse->send_move($x1, $y, true);
		}
	}
}

indigo_77
Сообщения: 3
Зарегистрирован: 05 июл 2017, 02:00

Re: Функция кругового движения мышью

Сообщение indigo_77 » 18 сен 2017, 14:09

При запуске скрипта ничего не происходит.

Аватара пользователя
spaiker
Сообщения: 33
Зарегистрирован: 14 сен 2017, 02:01

Re: Функция кругового движения мышью

Сообщение spaiker » 18 сен 2017, 15:13

А как вызываете функцию?

indigo_77
Сообщения: 3
Зарегистрирован: 05 июл 2017, 02:00

Re: Функция кругового движения мышью

Сообщение indigo_77 » 18 сен 2017, 16:42

Вот так вот :
<?php

$xhe_host = "127.0.0.1:7012";

// The following code is required to properly run XWeb Human Emulator
require("../Templates/xweb_human_emulator.php");

circle_run_mouse();

// круговое движение мышкой
function circle_run_mouse($full_emul = false)
{
	global $browser, $mouse;
	
	// коэффициент для центра окружности
	$k1 = rand(-200, 200);
	// коэффициент для радиуса окружности
	$k2 = rand(3, 5);
	// коэффициент для точек на окружности
	$k3 = rand(-20, 20);
	
	// получаем ширину и высоту окна браузера
	$page_width = $browser->get_window_width();
	$page_height = $browser->get_window_height();
	
	// вычисляем координаты центра окружности
	$x = $page_width/2 + $k1;
	$y = $page_height/2 + $k1;
	
	// вычисляем радиус окружности
	if ($page_width < $page_height)
	{
		$radius =  $page_width/$k2;
	}
	else
	{
		$radius =  $page_height/$k2;
	}
	
	// проверка если радиус больше ширины или длины окна
	while (($radius >= $page_width/2-abs($k1)) or ($radius >= $page_height/2-abs($k1)))
	{
		$radius -= 10;
	}
	$radius = floor($radius); 
	// чертим
	if ($full_emul)
	{
                // двигаемся по полученным точкам
		for ($angle = 0; $angle <= 360; $angle += 5, $k3 = rand(-10, 10))
		{
			$x1 = floor($x + cos(deg2rad($angle)) * $radius) + $k3;
			$y1 = floor($y + sin(deg2rad($angle)) * $radius) + $k3;
                        // двигаем реальную мышь
			$mouse->move($x1, $y1, false, 0, 5);
		}
	}
	else
	{
		for ($angle = 0; $angle <= 360; $angle += 5, $k3 = rand(-10, 10))
		{
			$x1 = floor($x + cos(deg2rad($angle)) * $radius) + $k3;
			$y1 = floor($y + sin(deg2rad($angle)) * $radius) + $k3;
                        // передаём только событие движения мышью
			$mouse->send_move($x1, $y, true);
		}
	}
}
// Quit
$app->quit();
?>

Аватара пользователя
spaiker
Сообщения: 33
Зарегистрирован: 14 сен 2017, 02:01

Re: Функция кругового движения мышью

Сообщение spaiker » 18 сен 2017, 20:38

При таком вызове функции ни чего видно и не будет.

// круговое движение мышкой
function circle_run_mouse($full_emul = false)

Параметр $full_emul=false будет работать с передачей событий, а не с реальной мышью. Для того что бы видеть как мышь вращается нужно делать вызов так:

// круговое движение мышкой
function circle_run_mouse(true);
В нашей функции это выглядит :
   // чертим
	if ($full_emul)
	{
                 // ...... код выше
                // двигаемся по полученным точкам реальную мышь
	        $mouse->move($x1, $y1, false, 0, 5);
	}
	else
	{
                 // ......код выше
		 // передаём только событие движения мышью
	         $mouse->send_move($x1, $y, true);
	}

indigo_77
Сообщения: 3
Зарегистрирован: 05 июл 2017, 02:00

Re: Функция кругового движения мышью

Сообщение indigo_77 » 19 сен 2017, 16:19

Да. Вот так работает:
// круговое движение мышкой
function circle_run_mouse(true);

А как добавить задержки при движении мыши? То есть что бы можно было менять скорость перемещения её от одной точки к другой.

Аватара пользователя
Support
Site Admin
Сообщения: 1000
Зарегистрирован: 10 апр 2009, 17:45
Контактная информация:

Re: Функция кругового движения мышью

Сообщение Support » 20 сен 2017, 15:07

Читаем мануалы по программе:

move($x,$y,$scroll=true,$time=0,$tremble=5); - данная функция используется для полной эмуляции движения мыши в заданную точку браузера

Функция на вход принимает параметры:

$x – x - координата точки, куда нужно переместить курсор, относительно левого верхнего угла браузера. (int)
$y – y - координата точки, куда нужно переместить курсор, относительно левого верхнего угла браузера. (int)
$scroll – прокручивать ли скролл браузера до заданной точки. При false будет просто произведено перемещение в заданную точку, При true, будет произведено автоматическое скроллирование до заданной точки (boolean).
$time – время за которое будет сделано перемещение из текущей точки (параметр доступен с 4.6.9). (int)
$tremble – амплитуда дрожания траектории (для более человекоподобной эмуляции) (параметр доступен с 4.6.48). (int)

echo "5. Переместим мышь на на 2 ссылки за 2 секунды с дрожанием по пути в 5 пикселей : ";
$x=$anchor->get_x_by_number(110);
$y=$anchor->get_y_by_number(110);
echo $x." ".$y." ".$mouse->move($x+1,$y+1,true,2,5)." ";
$x=$anchor->get_x_by_number(100);
$y=$anchor->get_y_by_number(100);
echo $x." ".$y." ".$mouse->move($x+1,$y+1,true,2,5);


send_move($x,$y,$scroll=true,$time=0,$tremble=5,$buttons=""); - данная функция используется для передачи перемещения мыши в заданную точку браузера, даже если программа скрыта в трее.

Функция на вход принимает параметры:

$x – x - координата точки, до которой нужно передать перемещение мыши, относительно левого верхнего угла браузера. (int)
$y – y - координата точки, до которой нужно передать перемещение мыши, относительно левого верхнего угла браузера. (int)
$scroll – прокручивать ли скролл браузера до заданной точки. При false будет просто передано пермещение до заданной точки, При true, будет произведено автоматическое скроллирование до заданной точки (boolean).
$time – время за которое будет сделано перемещение из текущей точки (параметр доступен с 4.6.16). (int)
$tremble – амплитуда дрожания траектории (для более человекоподобной эмуляции) (параметр доступен с 4.6.48). (int)
$buttons - строка с набором кнопок (может быть зажато больше одной кнопки), которые будут держаться нажатыми при перемещении (доступен с 4.9.32) :
MK_CONTROL - Ctrl на клавиатуре
MK_LBUTTON - левая кнопка мыши
MK_MBUTTON - средняя кнопка мыши
MK_RBUTTON - парвая кнопка мыши
MK_SHIFT - Shift на клавиатуре
MK_XBUTTON1 - кнолпка мыши X1
MK_XBUTTON2 - кнолпка мыши X2
После отработки функция возвращает результат своей работы в скрипт :
true – успешно произвели перемещение в заданную точку (boolean)
false – операция не произведена (boolean)


echo "5. Переместим мышь на на 2 ссылки за 2 секунды с дрожанием по пути в 5 пикселей : ";
$x=$anchor->get_x_by_number(110);
$y=$anchor->get_y_by_number(110);
echo $x." ".$y." ".$mouse->send_move($x+1,$y+1,true,2,5)." ";
$x=$anchor->get_x_by_number(100);
$y=$anchor->get_y_by_number(100);
echo $x." ".$y." ".$mouse->send_move($x+1,$y+1,true,2,5);

Аватара пользователя
spaiker
Сообщения: 33
Зарегистрирован: 14 сен 2017, 02:01

Re: Функция кругового движения мышью

Сообщение spaiker » 20 сен 2017, 23:01

При этом эти дрожания и задержки реализованы в PHP шаблоне. Открываем файл Human Emulator Advanced 4.10.12\Templates\Objects\System\xhe_mouse.php и находим нужные нам функции

// передвинуть мышь в заданные координаты браузера
	function move($x,$y,$scroll=true,$time=0,$tremble=2,$buttons="")
	{
		if ($time==0)
		{
			$params = array( "x" => $x , "y" => $y , "scroll" => $scroll , "buttons" => $buttons  );
			return $this->call_boolean(__FUNCTION__,$params);
		}
		else
		{
			global $browser;
			$xc=$this->get_x(true);
			$yc=$this->get_y(true);
			if ($scroll)
			{
				$sc_x=$browser->get_horizontal_scroll_pos();
				$sc_y=$browser->get_vertical_scroll_pos();
				$xc+=$sc_x;
				$yc+=$sc_y;
			}
			$StepX=($x-$xc-0.0001)/$time/30;
			$StepY=($y-$yc-0.0001)/$time/30;
			$prevRandX=0;$prevRandY=0;
			for ($i=0;$i<30*$time-1;$i++)
			{
				$xc+=$StepX-$prevRandX;
				$yc+=$StepY-$prevRandY;
				$prevRandX=rand(-$tremble,$tremble);
				$prevRandY=rand(-$tremble,$tremble);
				$params = array( "x" => $xc , "y" => $yc , "scroll" => $scroll , "buttons" => $buttons );				
				$this->call_boolean(__FUNCTION__,$params);
				usleep(20000);
			}
			$params = array( "x" => $x , "y" => $y , "scroll" => $scroll , "buttons" => $buttons );
			return $this->call_boolean(__FUNCTION__,$params);
		}
	}

и

// отправить перемещение мыши в заданную точку
	function send_move($x,$y,$scroll=true,$time=0,$tremble=5,$buttons="")
	{
		if ($time==0)
		{
			$params = array( "x" => $x , "y" => $y , "scroll" => $scroll, "buttons" => $buttons);
			return $this->call_boolean(__FUNCTION__,$params);
		}
		else
		{
			global $browser;
			$xc=$this->get_x(true,true);
			$yc=$this->get_y(true,true);
			if ($scroll)
			{
				$sc_x=$browser->get_horizontal_scroll_pos();
				$sc_y=$browser->get_vertical_scroll_pos();
				$xc+=$sc_x;
				$yc+=$sc_y;
			}
			$StepX=($x-$xc-0.0001)/$time/50;
			$StepY=($y-$yc-0.0001)/$time/50;
			$prevRandX=0;$prevRandY=0;
			for ($i=0;$i<50*$time-1;$i++)
			{
				$xc+=$StepX-$prevRandX;
				$yc+=$StepY-$prevRandY;
				$prevRandX=rand(-$tremble,$tremble);
				$prevRandY=rand(-$tremble,$tremble);
				$params = array( "x" => $xc , "y" => $yc , "scroll" => $scroll, "buttons" => $buttons);
				$this->call_boolean(__FUNCTION__,$params);
				usleep(20000);
			}
			$params = array( "x" => $x , "y" => $y , "scroll" => $scroll, "buttons" => $buttons);
			return $this->call_boolean(__FUNCTION__,$params);
		}
	}

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

Ну, а если просто случайным образом задавать дрожание и задержки при каждом шаге от точки к точке на окружности, то надо поправить нашу функцию так:


// чертим
	if ($full_emul)
	{
                 // ...... код выше
                // двигаемся по полученным точкам реальную мышь
	        $mouse->move($x1, $y1, false, rand(0, 5),rand(0, 5));
	}
	else
	{
                 // ......код выше
		 // передаём только событие движения мышью
	         $mouse->send_move($x1, $y, true, rand(0, 5),rand(0, 5));
	}

Ответить