Python模拟鼠标键盘点击自动化
首先在玩动物餐厅的时候发现他需要连续点击才能完成任务,而这有是一项枯燥而复杂的任务,所以我就想到用python的鼠标模拟来自动完成
Python中模拟键盘和鼠标最著名的模块是:pymouse和pykeyboard。一次安装两个模块比较麻烦,而有一个库整合了这两个模块,而且能支持跨平台操作,这个库叫PyUserInput,通过安装PyUserInput就可以直接得到pymouse和pykeyboard。
所以这里我直接安装了PyUserInput这个库,安装的时候发生了点小插曲,意识pip版本不是最新版本,使用python -m pip install --upgrade pip这条命令更新后提示已经没有这个库了,找了好多方法,最后重新导入pip(python3.5 -m ensurepip),使用另一种方法升的级
首先关于pymouse模块,这个模块主要的命令如下
# 鼠标操作
from pymouse import PyMouse
import time
# 初始化鼠标对象
m = PyMouse()
# 移动鼠标到(x,y)绝对地址
m.move(200 ,200)
# 鼠标中键垂直滚动 10 个单位
m.scroll(10 ,0)
# 鼠标点击(500,300),第三个参数代表键位,1是左键,2是右键,3是中键
m.click(500, 300, 1)
# 鼠标从当前位置拖拽到(500 , 300)
m.drag(500 , 300)
# 获得当前屏幕大小
m.screen_size()
# 获得鼠标当前位置
m.position()
然后是键盘操作,这个相对复杂一点
# 键盘操作
from pykeyboard import PyKeyboard
# 初始化键盘对象
k = PyKeyboard()
# 键入Hello,world!
k.type_string('Hello,world!')
# 按下按键与释放按键
k.press_key('H') # 按下H键
k.release_key('H') # 释放H键
# 使用tap_key函数直接实现按下和释放
k.tap_key('H')
k.tap_key('1',n=2,interval=5) #支持自定义按下次数和其间隔时间,单位:秒
#按住alt键
k.press_key(k.alt_key)
# tab键
k.tap_key(k.tab_key)
#释放alt键
k.release_key(k.alt_key)
#F5键
k.tap_key(k.function_keys[5])
#Home键
k.tap_key(k.numpad_keys[ " Home ' ])
#按数字5三次
k.tap_key(k.numpad_keys[5],n=3)
当然,在这里模拟点击用不上键盘的输入,我也只是简单的看了下
现在进入正题
如上所示,动物餐厅这7个点是最主要的7个点,所以我只要针对这7个点做模拟点击就行
首先使用m.position()找到鼠标要点击的位置,为了方便我将动物餐厅程序移到了左上角,通过一直循环对鼠标位置一直输出,找到点击的位置,并将其记录下来
for i in range(50000000):
print(m.position())
通过模拟点击测试,点击前使用sleep让他等5秒,让我有时间将动物餐厅程序调出来,使用sleep函数让它每间隔0.1秒点击一次,防止点击过快导致程序反应不过来
time.sleep(5)
for i in range(1000):
time.sleep(0.1)
m.click(914,702)
运行一段时间后我发现几个新问题,
1.程序一旦运行起来,不停止我没办法做任何其他操作,包括停止它都不可以;鼠标的位置只能固定在那一个位置疯狂点击,点击太慢了效率又不行,我看不上;
2.连续在同一个像素点点击,程序会自动检测异常,提示非法行为;
3.很多小事情也需要点击,但这个比较容易解决,只要后面将餐厅员工升级就好了;
随后我做了漫长的测试优化有了以下代码
问题解决:
1.每循环点击300次停下休息5秒,并作提示,我就有时间关闭程序等操作
2.找到每个点击位置的大致范围,用random随机库的随机函数让每次点击的位置在一个范围内,而不是一个点,这样被检测的概率就会小很多,甚至可以点击半小时停下一段时间
# 鼠标操作
from pymouse import PyMouse
import time
import random
# 初始化鼠标对象
m = PyMouse()
time.sleep(3)
for i in range(50000):
print(i)
time.sleep(0.05)#测试后改为0.05s点击一次效率提升
m.click(random.randrange(315,335),random.randrange(620,645)) # 招揽客人
if i%60 == 0 : # 每点击60次宣传按钮,就对每个桌子进行一轮上菜操作
m.click(random.randrange(100,120),random.randrange(305,330)) # 桌子1的位置点击
time.sleep(0.1) #间隔0.1s使点击合理化
m.click(random.randrange(180,200),random.randrange(305,330)) # 桌子2
time.sleep(0.1)
m.click(random.randrange(265,285),random.randrange(305,330)) # 桌子3
time.sleep(0.1)
m.click(random.randrange(100,120),random.randrange(425,445)) # 桌子4
time.sleep(0.1)
m.click(random.randrange(180,200),random.randrange(425,445)) # 桌子5
time.sleep(0.1)
m.click(random.randrange(265,285),random.randrange(425,445)) # 桌子6
time.sleep(0.1)
if i%300 == 0: # 每点击300次休息5秒让我能控制程序
print('休息5s')
time.sleep(5)
一个简单的自动化就完成了,虽然非常简单,但学以致用