背景
因为我手速慢,总是抢不到预约的机时。故写此脚本。
原理
因为网页是JavaScript生成。使用PyHook3监听鼠标和键盘事件;使用pyautogui控制鼠标键盘。
-
安装第三方库
建议Python 3使用PyHook3库。(我在上面走了很多弯路)
而pyHook易产生路径错误(TypeError: MouseSwitch() missing 8 required positional arguments: ‘msg’, ‘x’, ‘y’, ‘data’, ‘flags’, ‘time’, ‘hwnd’, and ‘window_name’),不推荐使用。安装PyHook3的教程:https://www.cnblogs.com/maybaco/p/13336851.html 其中我在安装时遇到需要有Microsoft Visual Studio C++ 14.0 is required的要求,所以还需要不断的配制环境。网络上直接装的包我也总是报错(安装包损坏...)最后按照这个乖乖下载...配制教程为:https://zhuanlan.zhihu.com/p/165008313
使用方法
运行程序,在需要拖拽确认的地方拟拖拽(拖拽前可进行简单的单击,以改变操作窗口),然后按F2键结束脚本监听学习的部分。后有5秒时间,简单调整鼠标的位置及状态。最后将重复循环鼠标拖拽。
代码
# -*- coding: utf-8 -*-
# @Author: Cheung Y.H.
# @Date : 2021/09/18
# version: Python 3.7.9
import PyHook3
import pythoncom
import win32api
import time
import pyautogui
def onKeyboardEvent(event):
if str(event.Key)=='F2': #按下F2后终止
win32api.PostQuitMessage()
time.sleep(5)
return True
def onm ouseEvent(event):
#print ("Position:", event.Position)
lp.append(event.Position) #点下和松开鼠标为两个事件,坐标以元组形式全部存储在lp里
return True
def click(lp):
loop = True
while(loop):
if lp[0] == lp[1]: #删除未拖拽的坐标
lp.pop(0)
lp.pop(0)
else:
loop = False
print("你的位置是{0}->{1}".format(lp[0], lp[1]))
x = lp[1][0] - lp[0][0]
y = lp[1][1] - lp[0][1] #计算相对坐标变化
pyautogui.moveTo(lp[0][0], lp[0][1]) #瞬间移动
pyautogui.dragRel(x, y, 0.1) #拖拽鼠标,数值为移动时间
time.sleep(0.1) #给网络反应时间
pyautogui.press('enter') #按下Enter键(我们的系统需要再点一次确认预约)
def main():
global lp
lp = []
hm = PyHook3.HookManager()
hm.KeyDown = onKeyboardEvent
hm.HookKeyboard()
hm.MouseAllButtonsDown = onm ouseEvent
hm.MouseAllButtonsUp = onm ouseEvent
hm.HookMouse()
pythoncom.PumpMessages()
hm.UnhookKeyboard() # 停止监听
hm.UnhookKeyboard()
for i in range (10):#进行循环
click(lp)
pyautogui.alert(text='Finished.', title='Auto Click Script')
main()