歡迎光臨
每天分享高質量文章

程式員給“沖頂大會”做了個外掛,輕鬆瓜分100萬獎金!

作者:李釗、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((753151167789)) # 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、資料庫、運維等。

贊(0)

分享創造快樂