最开始做这个答题助手的思路来自微信的跳一跳助手,当时也是在 GitHub 上面抱着试一试的态度 ,试图寻找到合适的外挂程序来直接外挂答题。最开始我玩的是西瓜百万英雄,本以为都是些简单的 问题,最开始就自己答题,后来发现不是这回事,因为涉及很多方面的知识,除了基本的热点,还有 各个学科的知识,都是些常识性的东西,百度应该就是可以解决的,所以这个地方可以自动化起来。

找了一圈,发现了两个不错的项目,最开始找的项目是MillionHeroes, 这个项目不仅仅是 python 做的,而且还很简单,就一个脚本,作者还在那里抄了一个 BaiduSearch 来了,但是由于写的很粗糙,无论是使用体验还是工程化都很差,最开始我也是抱着重构的态度,给整个 架子出来。

当时我学习 Android 手机屏幕截图也是来自这个项目,这个项目给了一个最简单的封装,之前有开发 一两个玩具的 Android 项目,所以基本的 ADB 概念和使用还算熟悉。

手机允许 USB 调试模式

这个问题其实蛮简单的, ADB 的全称是 Android Debug Bridge,主要是用来连接手机,调试开发 的 Android 应用的,首先需要在手机的设置里面打开开发者模式,这个不同手机有不通的方法,百度下 应该就是没有问题的,然后在开发者模式里面有一项,允许 USB 调试,需要开启这个开关,手机与电脑 连接是通过 USB 的,所以这个地方需要打开。

ABD 需要提前安装在自己的电脑里面,能够通过 CMD 工具找到 ABD。 ABD 的下载连接请点这里。 解压到一个目录里面去,然后在系统的 path 路径下添加 ADB 所在的绝对路径。

通过 ADB 命令来截图

思路是首先通过 ABD 的截图命令,获取当前的手机屏幕截图,然后再把图片从手机通过 USB 下载到 电脑上面。

## 这句话的意思是通过 ADB shell 工具里面的 screencap 命令 截图,然后通过 -p 参数
## 指定了截屏的保存路径 /sdcard/screenshot.png
adb shell /system/bin/screencap -p /sdcard/screenshot.png
## 通过 pull 命令将 /sdcard/screenshot.png 下载到电脑的当前目录 screenshot.png 
## 文件
adb pull /sdcard/screenshot.png ./screenshot.png

图片下载到本地之后,就可以在电脑上使用 python 进行处理了。

使用 Python 来处理图片

我们通过截图,主要是是想要获得图片上面的 题目和答案,然后再使用 baidu 搜索,但是整个 屏幕的截图上面,肯定有其他的干扰信息,所以需要对截图做一定的处理,主要就是截取出只包含题目 的地方。

在 Python 里面有处理图片的工具,这里我比较推荐使用 Pillow 包,这是一个纯 Python 实现 的包,安装很方便,通过 pip 工具即可:

pip install pillow

接下来就是使用 pillow 来截图了,

from PIL import Image
## 导入图片对象
im = Image.open(r"./screenshot.png")   

## 获取图片的大小信息
img_size = im.size
w = im.size[0]
h = im.size[1]
print("width: ", w, "height: ", h)

## 对图片进行截图, 截图是一个矩阵,四个参数依次是:
## 左上角x,左上角y,右下角x,右下角y
region = im.crop((70,200, w-70,700))    #裁剪的区域

## 保存截图后面的图片
region.save(r"./screen_area.png")

这里我稍微讲一下我开发的这个助手程序里关于游戏配置的四个参数是什么意思, 由于大家使用的手机屏幕的分辨率是不一样的,常见的是 720p(1280 * 720) 和 1080p(1920 * 1080),其中截图之后的图片横向和纵向的像素点也是不一样的, 所以这个小数是大概的比例,通过比例可以大致抹去不通手机分辨率的问题。

举个例子来说,拿 1080p 的手机来适配百万英雄:

# --------------------------
# | (x1, y1)               |
# |                        |
# |                        |
# -------------------------- (x2, y2)

## 这四个参数与 crop 的四个参数一一对应
## 1080p 还原之后依次是:
## 0.05 * 1080 = 54
## 0.115 * 1920 = 220.8
## 0.949 * 1080 = 1024.92
## 0.656 * 1920 = 1259.52

## 720p 还原之后依次是:
## 0.05 * 720 = 36
## 0.115 * 1080 = 124.2
## 0.949 * 720 = 683.28
## 0.656 * 1080 = 708.48

- 0.05  # x1
- 0.115 # y1
- 0.949 # x2
- 0.656 # y2

获得了题目所在的区域之后,接下来就可以通过百度的 OCR 来识别图片上面的题目,这个内容 我们留在下节的精彩部分。