程序員給“沖頂大會”做了個外掛,輕松瓜分100萬獎金!
2018 年 1 月 3 日,王思聰被迫動用自己的微博,為一個誕生不到 10 天的 APP 打了廣告,“每天我都發(fā)獎金,今晚 9 點就發(fā) 10 萬”。
對他而言,這天的微博并非生日宴會,而是戰(zhàn)場。王思聰?shù)囊粍t微博開啟了“全民競答”類 APP 的爆紅之路。
一時間,直播巨頭們都跟上“王校長”的節(jié)奏,“沖頂大會”之外,映客旗下的“芝士超人”、今日頭條旗下的“百萬英雄”和花椒直播旗下的“百萬作戰(zhàn)”紛紛亮相,每天狂撒百萬現(xiàn)金。
“沖頂大會”、“芝士超人”、“百萬英雄”等知識競答游戲火了,獎金數(shù)額也從最初的人民幣 5 萬、10 萬漲到了 100 萬、甚至更高......
沖頂大會是直播答題游戲,每天指定時間開放,12 道題,每題 3 個選項,10 秒作答,所有通關者分享獎金(每場獎金五萬元或十萬元),邀請好友可以獲得復活資格,這類模式的鼻祖是美國去年 8 月上線的 HQ Trivia。
為了能夠全部答對 12 道題,平分數(shù)額如此龐大的獎金池,參賽者開始想方設法提高自己答題的正確率。
我們看看有哪些可以 Hack 的方法?
題目出現(xiàn)再去搜索肯定是來不及的(除非你單身 40 年的手速),廣大人民的作弊策略也是層出不窮。
最簡單的是一群人一起玩,可以利用網(wǎng)絡延遲有多幾秒的讀題時間,遇到不會的每個人分開選,這樣你只需要 3^12=531441 臺手機即可通關。
正如節(jié)目主持人介紹的一樣,許多答題者開始尋找身邊的朋友共同答題,以求覆蓋到更多類型的知識點,提高通關的幾率。
于是,各種各樣的微信、QQ 答題群誕生,每個人都在群聊里分享自己認為正確的答案。
還可以使用兩臺設備,一個手機等主播讀題,另一個利用百度的語音搜索也能查出答案,但是感覺這種速度要比較慢。
道高一尺,魔高一丈,讓你猜不到的是,答題游戲居然也有外掛了!已經(jīng)有程序員設計了“輔助程序”,用于快速檢索答案。
這個用 Python 程序可以修剪并識別圖片中的文字內(nèi)容(問題和選項),然后通過百度進行搜索關鍵字出現(xiàn)的次數(shù),***將統(tǒng)計的信息展示出來。
這樣一來,答題者就可以根據(jù)統(tǒng)計數(shù)據(jù)來選擇相應的答案,極大提高了答題的正確率。
那么程序員到底應該如何玩呢?
用 Python 玩轉(zhuǎn)《沖頂大會》
首先用 WDA 來獲取屏幕截圖,WDA 本是 Facebook 開發(fā)的一套 iOS 測試框架,前幾天看見大家都用來做微信“跳一跳”的外掛,便特意去了解了一下,發(fā)現(xiàn)也能用在沖頂大會上。
之后 crop 出題目所在的位置(可能需要適配手機屏幕),然后調(diào)用開放的 OCR 接口讀取出文字文本。
***調(diào)用搜索引擎,就可以達到之前 gif 圖的效果。這套環(huán)境是 iOS + Mac,如果是安卓應該有更方便的方法。
最初的想法是希望搜索+選擇答案全部自動化完成的,思路是 OCR 題目和候選答案,組成三個組合扔到百度或谷歌里搜索,然后哪個組合的結果出現(xiàn)次數(shù)最多就選擇哪個。
試了幾個問題后發(fā)現(xiàn)并不是這樣,比如上面圖片的“駱駝的駝峰是存儲什么的?”,可能多數(shù)人都會認為是水,因此出現(xiàn)的次數(shù)最多,其實是錯誤答案。
***還有兩個痛點:
- 免費 OCR 接口調(diào)用次數(shù)有限,所以不能一直去截屏識別,只能等題目出現(xiàn)時運行程序。
- 官方也很套路,有的問題是沒法搜索的。比如下圖中這種:
***附上代碼:
- # python3
- import wda
- import io
- import urllib.parse
- import webbrowser
- import requests
- import time
- import base64
- from PIL import Image
- c = wda.Client()
- # 百度OCR API
- api_key = ''
- api_secret = ''
- token = ''
- while True:
- time.sleep(0.5)
- c.screenshot('1.png')
- im = Image.open("./1.png")
- region = im.crop((75, 315, 1167, 789)) # iPhone 7P
- imgByteArr = io.BytesIO()
- region.save(imgByteArr, format='PNG')
- image_data = imgByteArr.getvalue()
- base64_data = base64.b64encode(image_data)
- r = requests.post('https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic',
- params={'access_token': token}, data={'image': base64_data})
- result = ''
- for i in r.json()['words_result']:
- result += i['words']
- result = urllib.parse.quote(result)
- webbrowser.open('https://baidu.com/s?wd='+result)
- break
用 Java 來玩百萬英雄
《百萬英雄》是一檔全民知識互動游戲,在《百萬英雄》里每場 12 道題目全部回答正確的人,將瓜分獎金。
Github 地址:https://github.com/lingfengsan/MillionHero
gitee 倉庫地址:https://gitee.com/lingfengsan/MillionHero
游戲模式
一共 12 道題,全部答對就可以平分獎金。
如果可以把直播中的問題和答案提取出來,然后百度,然后統(tǒng)計一下哪個更相關,就可以輔助你答題了。
當然也可以直接把百度出來的題目和答案都展示出來。算法還在優(yōu)化,以代碼中為準。
工具介紹
- Java8
- Android 手機
- adb 驅(qū)動
- idea
原理說明
- 將手機點擊到直播界面(在這里我們先打開一張圖片)。
- 用 adb 工具獲取當前手機截圖,并用 adb 將截圖 pull 上來。
adb shell screencap -p /sdcard/1.png
adb pull /sdcard/1.png .
- 用 tessOCR 進行圖像識別,提取文字。
- 將文字中的問題和答案提取出來。
- 使用百度搜索并統(tǒng)計搜索得到結果數(shù)量。
問題+各個答案count(q&a)
問題 count(q)
答案 count(a)
- 計算匹配值 pmi: pmi[i]=count(q&a[i])/(count(q)*count(a[i]))。
- 選擇 pmi 值***的為答案。
操作步驟
- 安卓手機打開 USB 調(diào)試,設置》開發(fā)者選項》USB 調(diào)試。
- 電腦與手機 USB 線連接,確保執(zhí)行 adb devices 可以找到設備 id。
- 打開百萬直播。
- 運行我們的 Java 程序,當彈出題目時,輸入 1 回車。
注意程序中的 adb 驅(qū)動目錄要更換成自己的目錄,我的屏幕是 1920*1080,如果是別的分辨率,暫時需要修改一下代碼中的圖片參數(shù)等。
實驗結果
PS:無奈本人在出差,筆記本速度和網(wǎng)速都比較慢,比較好的電腦和網(wǎng)速肯定能有很大的提升。
TODO
可以增加一個圖形化界面,分別對題目和答案進行搜索并進行展示。
常見問題
- 項目構建問題:IDE 建議用 idea,從 Github 導入后,在右側的 Maven project 中添加目錄根部的 pom.xml 文件即可。
- tessOCR:只是調(diào)用了一下,在 pom 已經(jīng)導入了使用的工具包,訓練機在 tessdata 里面,不需要配置。
- adb 驅(qū)動相關:使用 adb 需要對應的手機驅(qū)動的。最簡單驗證 adb 的方法是在 adb 目錄里面打開命令行輸入 adb devices 看下有沒有設備,有的話即可。
由此可見,程序員是這個世界上最厲害、最單純的一個群體,他們總是能把世界上所有的問題用程序員的方法去解決。大家還有什么其他的玩法嗎?歡迎留言分享~