自动玩微信跳一跳小游戏

利用MonkeyRunner(WebDriverAgent)和OpenCV在Android(iOS)设备上自动玩微信跳一跳小游戏。

效果:http://t.cn/RH939gQ

依赖

运行服务端

控制Android设备

控制iOS设备

原理说明

本项目通过图像处理的方式从屏幕截图中判断棋子当前位置和目标棋盘位置。

  1. 使用 Template Matching 的方式在截图中识别棋子当前位置。
  2. 对截图进行边缘检测,然后在合适的区域内自上而下寻找第一个形状的顶部中心点和最右点,再计算出目标跳跃位置。
  3. 计算棋子当前位置到目标跳跃位置的距离。
  4. 将距离映射为按压时间。
  5. 控制设备进行模拟点击操作。

项目结构说明

项目主要分为两部分:计算跳跃时间的服务端(server.py)和执行设备控制操作的客户端,分为控制Android设备的MonkeyRunner脚本(monkeyrunner.py)和控制iOS设备的WDA脚本(wda.py)。

执行设备控制操作的客户端首先对设备进行截图,然后将截图通过POST方式发送到服务端的HTTP接口上,计算跳跃时间的服务端对截图进行处理并返回对应的按压时间,客户端在设备上模拟点击操作。

操作步骤

Step 1 - 构建服务端C拓展(可选)

在项目根目录下运行 python setup.py build_ext --inplace 即可。该步骤可选,不执行该步骤则关键步骤使用纯Python实现,执行该步骤则使用Cython实现。

Step 2 - 启动服务端

在项目根目录下运行 python server.py 即可。服务端默认监听 127.0.0.1:5000。可选启动参数见 python server.py -h

Step 3 - 启动设备控制脚本

Android

  1. Android手机开启USB调试,通过USB线连接到电脑。
  2. 使用ADB列出连接的Android设备:adb devices,并记录设备ID如 WTKDU1670700000
  3. 启动MonkeyRunner:monkeyrunner monkeyrunner.py WTKDU1670700000 http://127.0.0.1:5000。注意将 WTKDU1670700000 替换为上一步记录的设备ID,如果启动服务端时修改了监听端口,则第二个参数也需要对应修改。
  4. MonkeyRunner提示 Press enter to start 后,在微信中打开跳一跳并开始游戏,然后在MonkeyRunner中按下回车键。

iOS

  1. 在手机上启动 WebDriverAgentRunner,并记录设备URL如 http://10.0.0.100:8100
  2. 启动脚本:python wda.py http://10.0.0.100:8100 http://127.0.0.1:5000。注意将 http://10.0.0.100:8100 替换为上一步记录的设备ID,如果启动服务端时修改了监听端口,则第二个参数也需要对应修改。
  3. 提示 Press enter to start 后,在微信中打开跳一跳并开始游戏,然后在脚本中按下回车键。

幺蛾子

本项目做了以下幺蛾子操作。

人工增加随机跳跃误差

monkeyrunner.pywda.py 均接受 --jitter JITTER 参数,若设置该值,则会将控制设备按压的时间乘以 [1 - JITTER, 1 + JITTER] 区间内的随机值。可以先尝试 0.01 然后再根据效果调整。

随机跳跃间隔

两次跳跃间的等待时间为固定 1.75s0.5s 内的随机值。

已知问题

TODO

FAQ

Android手机需要ROOT吗?

不需要ROOT。但需要电脑安装 Android SDK。只需要命令行工具即可,不需要Android Studio

提示 Broken Pipe 该如何处理?

Ctrl + C退出一次MonkeyRunner再重新启动即可。

MonkeyRunner提示 Press enter to start 后卡住

下载2.5.4rc1版本的Jython替换 Android SDK 中 tools/lib/jython-standalone-2.5.3.jar 文件。

会不会被封号?

这个……封号应该是不会的,并没有对微信做任何的hack。不过删榜倒是有可能的。另外刷分太多会没朋友喔。

可以多个设备同时操作吗?

可以,开一个服务端和多个MonkeyRunner即可。

iOS上运行时定位不准或服务端有大量 Ignored shape 提示

是WDA默认截图为有损格式所致。可以自行修改代码 WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.m- (NSData *)fb_screenshotWithError:(NSError*__autoreleasing*)error 函数里 quality 变量值为 0 。但可能会导致不稳定,原因见该变量注释。

服务端支持WSGI么?

支持,使用 server.py 中的 app 变量即可。配置可在 server_config.py 中修改。

比如用 gunicorn 跑:gunicorn -w 4 -k gevent server:appNOT PRODUCTION READY!