Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python random mouse movements

I would like to make random mouse movements in specified rectangle area (limited with coordinates x1, y1, x2, y2, x3, y3, x4, y4). Movements should be smooth, random, not just straight lines, go randomly up/down/left/right/etc for specified time duration.

Could you give me a hand or working example I can learn from? many thanks

like image 876
peter Avatar asked Dec 13 '25 12:12

peter


2 Answers

This code works on Windows only. You can experiment with the parameters inside the random_movement function to get better results. Good luck!

import ctypes
import random
import time
import math

def move_mouse(pos):
    x_pos, y_pos = pos
    screen_size = ctypes.windll.user32.GetSystemMetrics(0), ctypes.windll.user32.GetSystemMetrics(1)
    x = 65536L * x_pos / screen_size[0] + 1
    y = 65536L * y_pos / screen_size[1] + 1
    return ctypes.windll.user32.mouse_event(32769, x, y, 0, 0)

def random_movement(top_left_corner, bottom_right_corner, min_speed=100, max_speed=200):
    '''speed is in pixels per second'''

    x_bound = top_left_corner[0], bottom_right_corner[0]
    y_bound = top_left_corner[1], bottom_right_corner[1]

    pos = (random.randrange(*x_bound),
                    random.randrange(*y_bound))

    speed = min_speed + random.random()*(max_speed-min_speed)
    direction = 2*math.pi*random.random()

    def get_new_val(min_val, max_val, val, delta=0.01):
        new_val = val + random.randrange(-1,2)*(max_val-min_val)*delta
        if new_val<min_val or new_val>max_val:
            return get_new_val(min_val, max_val, val, delta)
        return new_val

    steps_per_second = 35.0
    while True:
        move_mouse(pos)
        time.sleep(1.0/steps_per_second) 

        speed = get_new_val(min_speed, max_speed, speed)
        direction+=random.randrange(-1,2)*math.pi/5.0*random.random()

        new_pos = (int(round(pos[0]+speed*math.cos(direction)/steps_per_second)),
               int(round(pos[1]+speed*math.sin(direction)/steps_per_second)))

        while new_pos[0] not in xrange(*x_bound) or new_pos[1] not in xrange(*y_bound):
            direction  = 2*math.pi*random.random()
            new_pos = (int(round(pos[0]+speed*math.cos(direction)/steps_per_second)),
               int(round(pos[1]+speed*math.sin(direction)/steps_per_second)))
        pos=new_pos

Example:

random_movement((300,300),(600,600))
like image 51
Piotr Dabkowski Avatar answered Dec 16 '25 09:12

Piotr Dabkowski


Here is a demo of random X,Y positions you can play as your requirements:

from time import sleep
import pyautogui
import numpy as np

# Check your screen size
print(pyautogui.size())

count=0
while count<1000:
     x=np.random.randint(1,1792)
     y=np.random.randint(1,1120)
     pyautogui.moveTo(x, y)
     print(x)
     print(y)
     sleep(20)
     count+=1

Note: install first

pip3 install pyautogui

like image 39
Ricardo De Leon Avatar answered Dec 16 '25 09:12

Ricardo De Leon



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!