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)

当然,在这里模拟点击用不上键盘的输入,我也只是简单的看了下

现在进入正题

python3 键盘鼠标模拟 python模拟鼠标操作控制游戏_python3 键盘鼠标模拟


如上所示,动物餐厅这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)

一个简单的自动化就完成了,虽然非常简单,但学以致用