How to move the mouse automatically, realistically, using Python?

Asked

Viewed 1,035 times

4

How to make the mouse move automatically, realistically, using Python?

I was able to find and change a code that produces a "V" movement on the screen. However, I would like to move the mouse using non-linear movements.

I found some interesting ideas:

  1. Algorithm to mimic mouse movement as a human
  2. Moving the mouse realistically using C#
  3. Moving the mouse realistically using a Spline of Interpolation or of Approximating

I’m facing difficulties when it comes to incorporating the mathematical part of the non-linearity of motion into my code.

Code:

import sys
import time
import win32api

if (len(sys.argv) < 4):
    print "Como utilizar: python mousemove.py dx dy speed"
    sys.exit()

current = win32api.GetCursorPos()
cx = sx = current[0]
cy = sy = current[1]

mx = int(sys.argv[1])
my = int(sys.argv[2])
vx = vy = int(sys.argv[3])

print "Movendo", mx, my, "com", vx, "pixels por segundo"
print "Pressione 'q' para sair"

last = time.time()

while(True):
    if win32api.GetAsyncKeyState(ord('Q')):
        sys.exit()

    current = time.time()
    tick = current - last
    last = current

    if mx > 0:
        cx += vx * tick;
        if cx > mx + sx or cx < sx:
            vx = -vx;
            cx = max( sx, min( mx + sx, cx ) )
    if( my > 0 ):
        cy += vy * tick;
        if cy > my + sy or cy < sy:
            vy = -vy;
            cy = max( sy, min( my + sy, cy ) )

    win32api.SetCursorPos((int(cx),int(cy)))
    time.sleep(0.001)

Mathematical excerpt that draws a V:

if mx > 0:
    cx += vx * tick;
    if cx > mx + sx or cx < sx:
        vx = -vx;
        cx = max( sx, min( mx + sx, cx ) )
if( my > 0 ):
    cy += vy * tick;
    if cy > my + sy or cy < sy:
        vy = -vy;
        cy = max( sy, min( my + sy, cy ) )

Question:

How should I define the conditions to incorporate a certain randomness (non-linearity) in the mouse cursor movement?

1 answer

4

Quite interesting the problem. I believe that a good technique to improve would be to use the concepts already studied in UX (User Experience). For example, as quoted in Google Material, you can use the movements Arc Upward or Arc Downward, by checking the desired initial and final position difference.

If the final mouse position is above the initial position, use the Arc Upward movement.

inserir a descrição da imagem aqui

If the final mouse position is below the starting position, use the Arc Downward movement.

inserir a descrição da imagem aqui

Movements seem much more natural than linear.

Note: you can read some of the math here. I believe that the implementation of the equations is not complex. I will try to do it soon and, if it works out, I edit the answer with the codes.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.