人生苦短,我用Python!
总是有些事情需要重复性机械性的操作,想要设计代码去做,有些程序又不给接口,这时最简单的方法就是,模拟鼠标操作!
除了不能生孩子,其他都能做的python! 一搜 果然有模拟鼠标键盘操作的库pynput
但是网上的各种关于这个库的资料几乎大部分都是从文档那抄过来或者翻译一下的没法直接使用,而且不是很好用.
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}}
记录了鼠标的所有行为,前面的序列号 1 2 3..是鼠标点击次数,每次点击会记录下点击的位置 x y值,button左键还是右键点击,click_count点击次数,time_interval相邻两次点击的时间差. 这样基本上就可以完全模拟一个鼠标的所有操作.
下面是完整代码
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字典
再对这个字典进行解析.循环即可达到循环操作的效果,如果感觉太慢也可以再去修改时间 ,不过建议不要太快毕竟这是模拟鼠标操作不是用接口操作.
下面是解析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设为一个定值并使用循环就可以了.