浏览量: 87 次浏览

使用python pynput完全模拟鼠标操作

2020年2月24日 0 作者 Nie Hen

人生苦短,我用Python!
enter description here

前言

总是有些事情需要重复性机械性的操作,想要设计代码去做,有些程序又不给接口,这时最简单的方法就是,模拟鼠标操作!

 除了不能生孩子,其他都能做的python!  一搜 果然有模拟鼠标键盘操作的库pynput

### Pyput记录鼠标操作
网上的各种关于这个库的资料几乎大部分都是从文档那抄过来或者翻译一下的没法直接使用,而且不是很好用.

pynput 官方文档链接 https://pypi.org/project/pynput/

我写的这个代码最后会得到一个返回值 如下

会记录下来鼠标每次点击的位置 次数 以及两次点击相差的时间差

#path_clicked={1: {'x': 550, 'y': 856, 'button': 'Button_left', 'click_count': 1, 'time_interval': 0}, 2: {'x': 603, 'y': 853, 'button': 'Button_left', 'click_count': 1, 'time_interval': 1.53}, 3: {'x': 781, 'y': 853, 'button': 'Button_left', 'click_count': 1, 'time_interval': 2.32}, 4: {'x': 871, 'y': 853, 'button': 'Button_left', 'click_count': 1, 'time_interval': 1.54}, 5: {'x': 983, 'y': 852, 'button': 'Button_left', 'click_count': 1, 'time_interval': 2.25}, 6: {'x': 1087, 'y': 855, 'button': 'Button_left', 'click_count': 1, 'time_interval': 1.52}, 7: {'x': 923, 'y': 907, 'button': 'Button_left', 'click_count': 1, 'time_interval': 12.87}}  

完整代码

import time
from pynput import mouse
from  pynput.mouse import Button

click_time=[]
click_location=[]
click_count=1
path_clicked={}
time_difference=0
count=1
def on_click(x, y , button, pressed):

    if pressed:  #点击时为ture  如果不进行判断会调用两次这个函数 一次点击一次释放 这里不需要两次
        global count
        global click_count
        global time_difference  #把时间差设为全局变量 为的是退出这个循环
        #global t

        path_infor={}
        t=time.time()
        click_time.append(t) #添加时间
        click_location.append((x,y)) #添加位置
        #print('what happend')
        if len(click_location)!=1:  #这几个判断以及上面定义的click_ 都是为了得到双击还是单击  两个list长度都是2 第一个和第二个比较时间差
            time_difference=click_time[1]-click_time[0]  #定义时间差
            print(time_difference)
            if click_location[0]==click_location[1]:
                if time_difference<=0.3:  #如果两次点击时间小于0.3秒就会判断为双击 否则就是单击
                    click_count=2
                else:
                    click_count=1
            else:
                click_count=1
            click_time.pop(0)  #删去第一个
            click_location.pop(0)
            if click_count == 2:   #双击时 第一次击中的记录需要删去 否则执行的时候会是单击即使两个单击时间间隔很短 还有时间记录的得是上一次的
                time_difference = path_clicked[count-1]['time_interval']
                count=count-1
        if button == Button.left:  #判断左键还是右键还是中键
            button_name = 'Button_left'
        elif button == Button.middle:
            button_name = 'Button_middle'
        elif button == Button.right:
            button_name = 'Button_right'
        else:
            button_name = 'Unknown'

        path_infor['x']=x
        path_infor['y']=y
        path_infor['button']=button_name
        path_infor['click_count']=click_count
        path_infor['time_interval']= round(time_difference,2)
        print('{0} Pressed at {1}  点击次数{2}'.format(button_name, (x, y),click_count))
        path_clicked[count]=path_infor
        print(path_clicked)
        count=count+1
    # else:
    #     print('{0} Released at {1} at {2} 点击次数{3}'.format(button_name, x, y,click_count))


    if not pressed:
        return False

def get_path_clicked():
    while True:  # no_move = on_move,on_click = on_click,on_scroll = on_scroll,on_move 不需要scroll只能记录方向没用

        with mouse.Listener( on_click = on_click) as listener:
            listener.join()
        if time_difference>=10:
            if input('是否继续(y or n)')=='n':
                return path_clicked
                #break

if __name__=='__main__':
    print(get_path_clicked())

pynput这个库无法判断点击次数,所以我就使用两次点击的时间差,来判断是点击还是双击,并当无操作十秒后提示是否继续.

根据鼠标操作进行自动操作

对上面这个字典进行解析.循环即可达到循环操作的效果,如果感觉太慢也可以再去修改时间 ,不过建议不要太快毕竟这是模拟鼠标操作不是用接口操作.

下面是解析path_clicked字典的代码

from pynput.mouse import Button, Controller
import time
from pynput_text import *

mouse = Controller()
path_clicked=get_path_clicked()
print(len(path_clicked))
#os.system('netease-cloud-music')
for count in range(1,len(path_clicked)):

    path_infor=path_clicked[count]
    print(path_infor)
    time.sleep(path_infor['time_interval'])
    mouse.position=(path_infor['x'],path_infor['y'])
    if path_infor['button']=='Button_left':
        mouse.click(Button.left,path_infor['click_count'])
    if path_infor['button']=='Button_right':
        mouse.click(Button.right,path_infor['click_count'])
    else:
        mouse.click(Button.middle,path_infor['click_count'])

这里面我是直接把两个代码整合到一起,只会操作一遍,如果有需要重复操作的,把 path_clicked设为一个定值并使用循环就可以了.

结束语

类似于按键精灵 进行的操作
不过按键精灵有局限性, 可以自己学一下 自己动手操作

写于2018-12-13 10:52:27
原文链接