web-dev-qa-db-ja.com

Pyautogui:ベジェ曲線によるマウスの動き

私はPyautoguiのベジェカーブモーションでマウスを動かして、次のように人間の動きをさらにシミュレートしようとしています: enter image description here

Pyautogui内にはいくつかのトゥイーン/イージング関数がありますが、どれもベジェカーブタイプの動きを表しません。最終的に目的地に到達する前にヒットするランダムな場所を計算する小さなスクリプトを作成しました。

デフォルトの「ロボット」線形パス: enter image description here

残念ながら、どの目的地でもマウスは一時的に停止します。

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

情報:

  • ウインドウズ10
  • Python 2.7
  • 他のライブラリを使用したいPython version if required

私はこの投稿を見ました: python random mouse Movements

しかし、「開始と停止」の位置を定義する方法を理解できません。答えは私が探しているものにかなり近いです。

これを達成する方法に関するアイデアはありますか?

14
hinteractive02

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

追伸:上記の例ではpublic moveToメソッドを使用していないため、これらの設定は必要ありません。

16
DJV

move_mouse((300,300))を使用すると、マウスが到着し(300,300)、変更することはできません。実装を確認してください。WIN32APIを呼び出すだけです_mouse_event_。それについて何かを読んでください。 「開始と停止」の位置はありません。ベジェ曲線の描き方がわかりません。

_    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)を書くことだけです

1
obgnaw