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

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

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


參考了 I Hacked HQ Trivia But Here’s How They Can Stop Me
主要代碼
驗(yàn)證思路的主要代碼是實(shí)現(xiàn)截圖,識別,調(diào)用瀏覽器搜索。其實(shí)很簡單,具體可以參考我的 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")
- # 切割題目位置,左上角坐標(biāo)和右下角坐標(biāo),自行測試分辨率
- 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)
總結(jié)
寫完簡單版本想一想,怕是還沒有 Hi ,Siri來的方便,不過好在識別準(zhǔn)確,查詢快,后來又加了幾個方法輔助決策。文字識別加搜索,在這類游戲中并不能完全做對,想要實(shí)現(xiàn)完全對,可能還是得抓包? 或者存儲題庫,不過這就太費(fèi)時間了。有了 ADB 截圖,怕是各種小輔助都可以玩了,大家可以發(fā)揮想象力。python 寫小腳本真的很方便。接下來可以嘗試文字識別后 nlp 處理一下關(guān)系,然后搜索不同選擇結(jié)果,增加準(zhǔn)確率等等。不玩了不玩了,得寫 paper 去了。