作者:李釗、lingfengshan
來源:https://livc.io/blog/204
https://zhuanlan.zhihu.com/p/32754893
2018 年 1 月 3 日,王思聰被迫動用自己的微博,為一個誕生不到 10 天的 APP 打了廣告,“每天我都發獎金,今晚 9 點就發 10 萬”。
對他而言,這天的微博並非生日宴會,而是戰場。王思聰的一則微博開啟了“全民競答”類 APP 的爆紅之路。
一時間,直播巨頭們都跟上“王校長”的節奏,“沖頂大會”之外,映客旗下的“芝士超人”、今日頭條旗下的“百萬英雄”和花椒直播旗下的“百萬作戰”紛紛亮相,每天狂撒百萬現金。
“沖頂大會”、“芝士超人”、“百萬英雄”等知識競答遊戲火了,獎金數額也從最初的人民幣 5 萬、10 萬漲到了 100 萬、甚至更高……
沖頂大會是直播答題遊戲,每天指定時間開放,12 道題,每題 3 個選項,10 秒作答,所有通關者分享獎金(每場獎金五萬元或十萬元),邀請好友可以獲得複活資格,這類樣式的鼻祖是美國去年 8 月上線的 HQ Trivia。
為了能夠全部答對 12 道題,平分數額如此龐大的獎金池,參賽者開始想方設法提高自己答題的正確率。
我們看看有哪些可以 Hack 的方法?
題目出現再去搜索肯定是來不及的(除非你單身 40 年的手速),廣大人民的作弊策略也是層出不窮。
最簡單的是一群人一起玩,可以利用網路延遲有多幾秒的讀題時間,遇到不會的每個人分開選,這樣你只需要 3^12=531441 臺手機即可通關。
正如節目主持人介紹的一樣,許多答題者開始尋找身邊的朋友共同答題,以求改寫到更多型別的知識點,提高通關的機率。
於是,各種各樣的微信、QQ 答題群誕生,每個人都在群聊裡分享自己認為正確的答案。
還可以使用兩臺裝置,一個手機等主播讀題,另一個利用百度的語音搜尋也能查出答案,但是感覺這種速度要比較慢。
道高一尺,魔高一丈,讓你猜不到的是,答題遊戲居然也有外掛了!已經有程式員設計了“輔助程式”,用於快速檢索答案。
這個用 Python 程式可以修剪並識別圖片中的文字內容(問題和選項),然後透過百度進行搜尋關鍵字出現的次數,最後將統計的資訊展示出來。
這樣一來,答題者就可以根據統計資料來選擇相應的答案,極大提高了答題的正確率。
那麼程式員到底應該如何玩呢?
用 Python 玩轉《沖頂大會》
首先用 WDA 來獲取螢幕截圖,WDA 本是 Facebook 開發的一套 iOS 測試框架,前幾天看見大家都用來做微信“跳一跳”的外掛,便特意去瞭解了一下,發現也能用在沖頂大會上。
之後 crop 出題目所在的位置(可能需要適配手機螢幕),然後呼叫開放的 OCR 介面讀取出文字文字。
最後呼叫搜尋引擎,就可以達到之前 gif 圖的效果。這套環境是 iOS + Mac,如果是安卓應該有更方便的方法。
最初的想法是希望搜尋+選擇答案全部自動化完成的,思路是 OCR 題目和候選答案,組成三個組合扔到百度或谷歌裡搜尋,然後哪個組合的結果出現次數最多就選擇哪個。
試了幾個問題後發現並不是這樣,比如上面圖片的“駱駝的駝峰是儲存什麼的?”,可能多數人都會認為是水,因此出現的次數最多,其實是錯誤答案。
最後還有兩個痛點:
-
免費 OCR 介面呼叫次數有限,所以不能一直去截圖識別,只能等題目出現時執行程式。
-
官方也很套路,有的問題是沒法搜尋的。比如下圖中這種:
最後附上程式碼:
# 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 道題,全部答對就可以平分獎金。
如果可以把直播中的問題和答案提取出來,然後百度,然後統計一下哪個更相關,就可以輔助你答題了。
當然也可以直接把百度出來的題目和答案都展示出來。演演算法還在最佳化,以程式碼中為準。
工具介紹
-
Java8
-
Android 手機
-
adb 驅動
-
idea
原理說明
-
將手機點選到直播介面(在這裡我們先開啟一張圖片)。
-
用 adb 工具獲取當前手機截圖,並用 adb 將截圖 pull 上來。
adb shell screencap -p /sdcard/1.png adb pull /sdcard/1.png .
-
用 tessOCR 進行影象識別,提取文字。
-
將文字中的問題和答案提取出來。
-
使用百度搜索並統計搜尋得到結果數量。
問題+各個答案count(q&a;)
問題 count(q)
答案 count(a)
-
計算匹配值 pmi: pmi[i]=count(q&a;[i])/(count(q)*count(a[i]))。
-
選擇 pmi 值最高的為答案。
操作步驟
-
安卓手機開啟 USB 除錯,設定》開發者選項》USB 除錯。
-
電腦與手機 USB 線連線,確保執行 adb devices 可以找到裝置 id。
-
開啟百萬直播。
-
執行我們的 Java 程式,當彈出題目時,輸入 1 回車。
註意程式中的 adb 驅動目錄要更換成自己的目錄,我的螢幕是 1920*1080,如果是別的解析度,暫時需要修改一下程式碼中的圖片引數等。
實驗結果
PS:無奈本人在出差,筆記本速度和網速都比較慢,比較好的電腦和網速肯定能有很大的提升。
TODO
可以增加一個圖形化介面,分別對題目和答案進行搜尋併進行展示。
常見問題
-
專案構建問題:IDE 建議用 idea,從 Github 匯入後,在右側的 Maven project 中新增目錄根部的 pom.xml 檔案即可。
-
tessOCR:只是呼叫了一下,在 pom 已經匯入了使用的工具包,訓練機在 tessdata 裡面,不需要配置。
-
adb 驅動相關:使用 adb 需要對應的手機驅動的。最簡單驗證 adb 的方法是在 adb 目錄裡面開啟命令列輸入 adb devices 看下有沒有裝置,有的話即可。
由此可見,程式員是這個世界上最厲害、最單純的一個群體,他們總是能把世界上所有的問題用程式員的方法去解決。大家還有什麼其他的玩法嗎?歡迎留言分享~
●本文編號341,以後想閱讀這篇文章直接輸入341即可
●輸入m獲取到文章目錄
Java程式設計
更多推薦《18個技術類公眾微信》
涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。