使用python编程自动玩手游

我们在玩手游的时候,会发现手游中有些步骤总是需要重复玩,每天都要重复,比如重复做日常任务啥的,一直肝个不停,但是其实很多东西都是固定玩法了,但是就是需要你机械的重复,我就没见过什么手游是不肝的,就算自诩全流程自动化的手游,总还是有些东西需要重复做的。

那么怎么让程序帮我们自动玩手游呢?接下来介绍怎么做

想想我们是怎么玩手游的,我们玩手游,是眼睛识别手游画面,然后大脑根据游戏画面指挥手指做出相应触摸,触控操作。

因此自动化玩手游的技术要点在于如下两点:

  • 可以向手机发送触摸,点击等事件
  • 能够识别手游的具体物体对象

其中第一点可以向手机发送触摸,点击事件,保证了让程序可以代替人类手指操作手游画面,第二点则是类似人类眼睛识别游戏画面了。

首先解决第一个技术要点,编程向手机发送触摸,点击等事件。

打开github项目 github.com/openatx/uiau

uiautomator2 这个项目可以使用python在电脑端控制连接到电脑的手机

安装uiautomator2

pip install --upgrade --pre uiautomator2

如果下载很慢,请使用国内的pip镜像站,这是由于大家都知道的原因。。。

pip install --upgrade --pre uiautomator2 -i https://pypi.tuna.tsinghua.edu.cn/simple

安装完成之后,连接手机或者打开电脑端的模拟器试试这个库怎么用的。

这里我用网易MuMu模拟器做测试,如果使用真机测试的话,请打开真机的usb调试模式

使用adb devices命令查看电脑连接的设备,执行命令后,显示已经有一个设备

adb devices

List of devices attached emulator-5554 device

接下来打开python终端

>>> import uiautomator2 as u2
>>> u2.connect("emulator-5554")
[W 210131 22:27:11 __init__:203] atx-agent has something wrong, auto recovering
[D 210131 22:27:11 __init__:287] device emulator-5554 is online
[I 210131 22:27:11 init:155] uiautomator2 version: 2.12.2
<uiautomator2.Device object at 0x7fba2815ac10>
>>> d = u2.connect("emulator-5554")
>>> print(d.info)
[D 210131 22:27:52 __init__:600] kill process(ps): uiautomator
[D 210131 22:27:53 __init__:619] uiautomator-v2 is starting ... left: 40.0s
[D 210131 22:27:54 __init__:619] uiautomator-v2 is starting ... left: 39.0s
[I 210131 22:27:54 __init__:583] uiautomator back to normal
{'currentPackageName': 'com.mumu.launcher', 'displayHeight': 936, 'displayRotation': 0, 'displaySizeDpX': 853, 'displaySizeDpY': 480, 'displayWidth': 1664, 'productName': 'cancro', 'screenOn': True, 'sdkInt': 23, 'naturalOrientation': True}

可以看到已经正常通过代码连接到设备了

执行一下点击事件,这里的click方法的参数是点的坐标,x和y

>>> d.click(0, 0)

这样子,我们有了可以往设备发送点击事件的能力了,触摸和双击,滑动这些都是可以支持的,具体可以看uiautomator2 项目的主页

接下来是解决如何识别手游物体的功能和技术要点,这一点uiautomator2也帮我们实现了。

也就是图像匹配,在使用这个功能之前需要先把依赖安装上

pip install -U "uiautomator2[image]" -i https://pypi.doubanio.com/simple

目前开放两个接口

imdata = "target.png" # 也可以是URL, PIL.Image或OpenCV打开的图像