這兩天沖頂大會之類的直播答題 APP 突然火了起來梅鹦,不得不佩服互聯(lián)網(wǎng)公司的想象力,那么程序員怎么用不同的方式玩轉(zhuǎn)答題游戲呢。之前微信的跳一跳小游戲刷爆朋友圈桑谍,已經(jīng)有很多朋友寫出了自動化的腳本輔助,一看到答題游戲就馬上想到可以用類似的方式來寫一個簡單的腳本祸挪。代碼思路簡單锣披,可以用在各類答題游戲中。因為時間贿条、搜索結(jié)果等原因雹仿,使用文字識別搜索,能提供的輔助作用有限整以。
具體代碼和環(huán)境及使用請戳:https://github.com/Skyexu/TopSup
隨手 Star ^ ^
靈感來自:
具體做法
- 使用 ADB 獲取手機截屏
adb shell screencap -p /sdcard/screenshot.png
adb pull /sdcard/screenshot.png .
-
OCR 識別題目與選項文字
分別通過代碼截取題目區(qū)域與選項區(qū)域,再進行文字識別
文字識別兩個方法:
- 搜索判斷
結(jié)果判斷方式
-
直接打開瀏覽器搜索問題
題目+每個選項都通過搜索引擎進行搜索奠骄,從網(wǎng)頁代碼中提取搜索結(jié)果的數(shù)目
只用題目進行搜索,統(tǒng)計結(jié)果頁面代碼中包含選項的詞頻
以下為兩個示例結(jié)果番刊,可以看出下面兩道題含鳞,兩個方法有不同的結(jié)果,可以根據(jù)問題類型進行不同的決策芹务。
參考了 I Hacked HQ Trivia But Here’s How They Can Stop Me
主要代碼
驗證思路的主要代碼是實現(xiàn)截圖蝉绷,識別,調(diào)用瀏覽器搜索枣抱。其實很簡單,具體可以參考我的 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, lang='chi_sim', config=tessdata_dir_config)
text = text.replace("\n", "")[2:]
print(text)
webbrowser.open('https://baidu.com/s?wd='+text)
總結(jié)
寫完簡單版本想一想,怕是還沒有 Hi ,Siri
來的方便佳晶,不過好在識別準(zhǔn)確桅狠,查詢快,后來又加了幾個方法輔助決策。文字識別加搜索中跌,在這類游戲中效果很有限咨堤,這類問答題想要實現(xiàn)完全對,可能得存儲題庫了漩符,不過這就太費時間了一喘。有了 ADB 截圖,怕是各種小輔助都可以玩了, 大家可以發(fā)揮想象力嗜暴。python 寫小腳本真的很方便凸克。接下來可以嘗試文字識別后 nlp 處理一下關(guān)系,然后搜索不同選擇結(jié)果闷沥,增加準(zhǔn)確率等等萎战。不玩了不玩了,得寫 paper 去了舆逃。