这两天冲顶大会之类的直播答题 APP 突然火了起来,不得不佩服互联网公司的想象力,那么程序员怎么用不同的方式玩转答题游戏呢。之前微信的跳一跳小游戏刷爆朋友圈,已经有很多朋友写出了自动化的脚本辅助,一看到答题游戏就马上想到可以用类似的方式来写一个简单的脚本。代码思路简单,可以用在各类答题游戏中。因为时间、搜索结果等原因,使用文字识别搜索,能提供的辅助作用有限。
screenshot.PNG具体代码和环境及使用请戳:https://github.com/Skyexu/TopSup
随手 Star ^ ^
灵感来自:
具体做法
- 使用 ADB 获取手机截屏
adb shell screencap -p /sdcard/screenshot.png
adb pull /sdcard/screenshot.png .
-
OCR 识别题目与选项文字
分别通过代码截取题目区域与选项区域,再进行文字识别
cut.png
文字识别两个方法:
- 搜索判断
结果判断方式
-
直接打开浏览器搜索问题
result.png -
题目+每个选项都通过搜索引擎进行搜索,从网页代码中提取搜索结果的数目
-
只用题目进行搜索,统计结果页面代码中包含选项的词频
以下为两个示例结果,可以看出下面两道题,两个方法有不同的结果,可以根据问题类型进行不同的决策。
result2.png result3.png参考了 I Hacked HQ Trivia But Here’s How They Can Stop Me
主要代码
验证思路的主要代码是实现截图,识别,调用浏览器搜索。其实很简单,具体可以参考我的 github 库中简单版本代码
def pull_screenshot():
os.system('adb shell screencap -p /sdcard/screenshot.png')
os.system('adb pull /sdcard/screenshot.png .')
pull_screenshot()
img = Image.open("./screenshot.png")
# 切割题目位置,左上角坐标和右下角坐标,自行测试分辨率
question = img.crop((50, 350, 1000, 560)) # 坚果 pro1
choices = img.crop((75, 535, 990, 1150))
#region = img.crop((75, 315, 1167, 789)) # iPhone 7P
# tesseract 路径
pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files (x86)\\Tesseract-OCR\\tesseract'
# 语言包目录
tessdata_dir_config = '--tessdata-dir "C:\\Program Files (x86)\\Tesseract-OCR\\tessdata"'
# lang 指定中文简体
text = pytesseract.image_to_string(question, lang='chi_sim', config=tessdata_dir_config)
text = text.replace("\n", "")[2:]
print(text)
webbrowser.open('https://baidu.com/s?wd='+text)
总结
写完简单版本想一想,怕是还没有 Hi ,Siri
来的方便,不过好在识别准确,查询快,后来又加了几个方法辅助决策。文字识别加搜索,在这类游戏中效果很有限,这类问答题想要实现完全对,可能得存储题库了,不过这就太费时间了。有了 ADB 截图,怕是各种小辅助都可以玩了, 大家可以发挥想象力。python 写小脚本真的很方便。接下来可以尝试文字识别后 nlp 处理一下关系,然后搜索不同选择结果,增加准确率等等。不玩了不玩了,得写 paper 去了。
网友评论
https://kuaishan.cloud.sensorsdata.cn:4006/r/Va
$ python GetQuestionAndroid.py
采用方式 3 获取截图
Traceback (most recent call last):
File "GetQuestionAndroid.py", line 35, in <module>
question, choices = ocr.ocr_img(img, config)
File "/Users/millions/Desktop/TopSup-master/common/ocr.py", line 90, in ocr_img
question = pytesseract.image_to_string(question_im, lang='chi_sim', config=tessdata_dir_config)
File "build/bdist.macosx-10.10-intel/egg/pytesseract/pytesseract.py", line 183, in image_to_string
File "build/bdist.macosx-10.10-intel/egg/pytesseract/pytesseract.py", line 130, in run_and_get_output
File "build/bdist.macosx-10.10-intel/egg/pytesseract/pytesseract.py", line 102, in run_tesseract
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 710, in __init__
errread, errwrite)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1335, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
Traceback (most recent call last):
File "GetQuestionTessAndroid.py", line 20, in <module>
question, choices = ocr.ocr_img(img)
File "F:\Python_workspace\wechat\TopSup-master\common\ocr.py", line 88, in ocr_img
if (choices[0].endswith('?')):
IndexError: list index out of range
我修改了ocr.py中的题目位置参数之后就报了这个错误,知道什么原因吗?
Traceback (most recent call last):
File "methods.py", line 89, in <module>
run_algorithm(1, question, choices)
File "methods.py", line 82, in run_algorithm
open_webbrowser_count(question, choices)
File "methods.py", line 35, in open_webbrowser_count
output(choices, counts)
File "methods.py", line 53, in output
counts = list(map(int, counts))
ValueError: invalid literal for int() with base 10: 'html><html><head><title></title></head><body><script type="text/javascript">var tn= \'98131360_hao_pg\'p=\'s\'from=\'1020499o\'w=[\'w\'\'wd\'\'word\']statis="http://be.st.wayayaya.com/baidu_sousuo.ht
楼主这个错误遇见过吗
Traceback (most recent call last):
File "H:\桌面\TopSup-master\1.py", line 9, in <module>
from common import screenshot, ocr, methods
File "H:\桌面\TopSup-master\common\ocr.py", line 8, in <module>
import pytesseract
ModuleNotFoundError: No module named 'pytesseract'
看看什么原因
File "GetQuestionTessAndroid.py", line 20, in <module>
question, choices = ocr.ocr_img(img)
File "C:\Program Files (x86)\ClockworkMod\Universal Adb Driver\common\ocr.py", line 64, in ocr_img
question = pytesseract.image_to_string(question_im, lang='chi_sim', config=tessdata_dir_config)
File "C:\Users\hj226\AppData\Local\Programs\Python\Python36\lib\site-packages\pytesseract\pytesseract.py", line 125, in image_to_string
raise TesseractError(status, errors)
pytesseract.pytesseract.TesseractError: (1, 'Error opening data file C:\\Program Files (x86)\\Tesseract-OCR\\tessdata/chi_sim.traineddata')
我的是这种问题,命令行直接ADB没反应,就把楼主的文件搬到了ADB文件夹下面了,能够得到手机截图,命令行报上面错误