教你巧玩 [沖頂大會] 答題類游戲
這兩天沖頂大會之類的直播答題 APP 突然火了起來,不得不佩服互聯網公司的想象力,那么程序員怎么用不同的方式玩轉答題游戲呢。之前微信的跳一跳小游戲刷爆朋友圈,已經有很多朋友寫出了自動化的腳本輔助,一看到答題游戲就馬上想到可以用類似的方式來寫一個簡單的腳本。我發現已經有朋友做了個調用百度 api 的,自己就再寫個直接用識別庫的吧,代碼思路簡單,可以用在各類答題游戲中。使用文字識別加搜索,只能起到輔助決策的作用,可以參考結果,增加準確率,也保證不了全對。
具體代碼和環境及使用請戳:https://github.com/Skyexu/TopSup
隨手 Star ^ ^
靈感來自:
- 微信跳一跳輔助
- 程序員如何玩轉《沖頂大會》?
具體做法
1.使用 ADB 獲取手機截屏
- adb shell screencap -p /sdcard/screenshot.png
- adb pull /sdcard/screenshot.png .
2.OCR 識別題目與選項文字
分別通過代碼截取題目區域與選項區域,再進行文字識別

文字識別兩個方法:
- 谷歌 Tesseract ,安裝軟件即可,接下來主要使用這個方法
- 百度 OCR livc ,需要注冊百度 API,每天調用次數有限
3.搜索判斷
結果判斷方式
1.直接打開瀏覽器搜索問題

2.題目+每個選項都通過搜索引擎進行搜索,從網頁代碼中提取搜索結果的數目
3.只用題目進行搜索,統計結果頁面代碼中包含選項的詞頻
以下為兩個示例結果,可以看出下面兩道題,兩個方法有不同的結果,可以根據問題類型進行不同的決策。


參考了 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,, 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 去了。