Pyautogui: Движение мыши с кривой Безье
Я пытаюсь переместить мышь в движение кривой Безье в Pyautogui, чтобы имитировать больше человеческого движения, как показано здесь:
![введите описание изображения здесь]()
Внутри pyautogui есть некоторые функции поворота/ослабления, но ни один из них не представляет собой движение типа кривой Безье. Я создал небольшой script, чтобы вычислить случайные места, в которые он попал, прежде чем, в конечном счете, достигнет цели.
По умолчанию линейный путь "Робот":
![введите описание изображения здесь]()
К сожалению, каждый пункт назначения временно останавливается.
import pyautogui
import time
import random
print "Randomized Mouse Started."
destx = 444;
desty = 631;
x, y = pyautogui.position() # Current Position
moves = random.randint(2,4)
pixelsx = destx-x
pixelsy = desty-y
if moves >= 4:
moves = random.randint(2,4)
avgpixelsx = pixelsx/moves
avgpixelsy = pixelsy/moves
print "Pixels to be moved X: ", pixelsx," Y: ",pixelsy, "Number of mouse movements: ", moves, "Avg Move X: ", avgpixelsx, " Y: ", avgpixelsy
while moves > 0:
offsetx = (avgpixelsx+random.randint(-8, random.randint(5,10)));
offsety = (avgpixelsy+random.randint(-8, random.randint(5,10)));
print x + offsetx, y + offsety, moves
pyautogui.moveTo(x + offsetx, y + offsety, duration=0.2)
moves = moves-1
avgpixelsx = pixelsx / moves
avgpixelsy = pixelsy / moves
Информация:
- Windows 10
- Python 2.7
- Желая использовать другие библиотеки, версия Python при необходимости
Я видел этот пост: случайные движения мыши python
но не может понять, как определить позицию "старт и стоп". Ответ довольно близок к тому, что я ищу.
Любые идеи о том, как это сделать?
Ответы
Ответ 1
Используя scipy
и все, что может просто перемещать курсор мыши:
import pyautogui
import random
import scipy
import time
from scipy import interpolate
cp = random.randint(3, 5) # Number of control points. Must be at least 2.
x1, y1 = pyautogui.position() # Starting position
x2, y2 = 444, 631 # Destination
# Distribute control points between start and destination evenly.
x = scipy.linspace(x1, x2, num=cp, dtype='int')
y = scipy.linspace(y1, y2, num=cp, dtype='int')
# Randomise inner points a bit (+-RND at most).
RND = 10
xr = scipy.random.randint(-RND, RND, size=cp)
yr = scipy.random.randint(-RND, RND, size=cp)
xr[0] = yr[0] = xr[-1] = yr[-1] = 0
x += xr
y += yr
# Approximate using Bezier spline.
degree = 3 if cp > 3 else cp - 1 # Degree of b-spline. 3 is recommended.
# Must be less than number of control points.
tck, u = scipy.interpolate.splprep([x, y], k=degree)
u = scipy.linspace(0, 1, num=max(pyautogui.size()))
points = scipy.interpolate.splev(u, tck)
# Move mouse.
duration = 0.2
timeout = duration / len(points[0])
for point in zip(*(i.astype(int) for i in points)):
pyautogui.platformModule._moveTo(*point)
time.sleep(timeout)
И вы можете удалить любую встроенную задержку в pyautogui
, установив:
# Any duration less than this is rounded to 0.0 to instantly move the mouse.
pyautogui.MINIMUM_DURATION = 0 # Default: 0.1
# Minimal number of seconds to sleep between mouse moves.
pyautogui.MINIMUM_SLEEP = 0 # Default: 0.05
# The number of seconds to pause after EVERY public function call.
pyautogui.PAUSE = 0 # Default: 0.1
P.S.: Пример выше не требует каких-либо из этих настроек, поскольку он не использует общедоступный метод moveTo
.
Ответ 2
вам просто нужно знать, что move_mouse((300,300))
позволит вам приходить (300,300), а затем никогда не менять .look в реализации, он просто вызывает WIN32 api mouse_event
. Прочитайте что-нибудь об этом, вы обнаружите, что есть no "start and stop" position.i не знаю, как рисовать кривую Безье.
while True:
pos = (random.randrange(*x_bound),random.randrange(*y_bound))
move_mouse(pos)
time.sleep(1.0/steps_per_second)
Посмотрите, это секрет анимации. Вам нужно сделать, это написать pos = draw_bezier_curve(t)