分享一下程序员会怎么玩:教你巧玩 [冲顶大会] 答题类游戏
如何评价冲顶大会这款 App? - Skye的回答 - https://www.zhihu.com
之前微信的跳一跳小游戏刷报朋友圈,已经有很多朋友写出了自动化的脚本辅助,一看到答题游戏就马上想到可以用类似的方式来写一个简单的脚本。我发现已经有朋友做了个调用百度 api 的,自己就再写个直接用识别库的吧,代码思路简单,可以用在各类答题游戏中。使用文字识别加搜索,只能辅助增加准确率,保证不了全对。
目前版本增加了截图传输效率,修改了识别参数,对图像进行灰度转化,去干扰增加了识别准确率。结果判断使用了三种方式,对不同问题可以参考不同结果
screenshot.PNG
具体代码和环境及使用请戳:https://github.com/Skyexu/TopSup
随手 Star ^ ^
灵感来自:具体做法
- adb shell screencap -p /sdcard/screenshot.png
- adb pull /sdcard/screenshot.png .
复制代码
- OCR 识别题目与选项文字
分别通过代码截取题目区域与选项区域,再进行文字识别
cut.png
文字识别两个方法:
- 谷歌 Tesseract ,安装软件即可,接下来主要使用这个方法
- 百度 OCR livc ,需要注册百度 API,每天调用次数有限
结果判断方式
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 去了。 |