教你用android玩衝頂大會

何時夕發表於2018-02-02

本文首發於微信公眾號——世界上有意思的事,搬運轉載請註明出處,否則將追究版權責任。微訊號:a1018998632,交流qq群:859640274

最近答題類app比較火,玩了幾把之後想到為什麼不用技術來查詢答案呢?因此搞了一款輔助app,能夠幫助大家直接搜尋答案.經過兩天的開發和三天的測試,終於讓我的衝頂率達到了80%左右,先上幾個不錯的戰績裝個逼.

教你用android玩衝頂大會
教你用android玩衝頂大會
教你用android玩衝頂大會
教你用android玩衝頂大會

一.用app去衝頂

這一節是教大家如何使用app的,如果對使用app不感興趣,想了解技術的同學,可以直接去第二節,新建了一個輔助交流QQ群:314100393,大家有問題可以來這個群裡問。

1.讓app跑起來

  1. 安裝app。點選下載app
  2. 進入手機的檔案管理器,在本app的cache目錄下面新建 tessdata目錄 和 ShotImage目錄。例如我的小米Mix2的目錄是:Android/data/com.example.whensunet.chongdingdahui/cache
  3. 將chi_sim.traineddata檔案放入上面新建的tessdata資料夾中,這個檔案是ocr識別的語言庫,沒有的話就只能查詢題幹,不能查詢選項點選下載語言庫
  4. 在 設定—>無障礙/輔助功能—>WhenSunsetBaiWanYinXiongFuZhu中點選開啟,開啟app的服務。
  5. 下載夸克瀏覽器,這個瀏覽器比較輕便,能夠減少查詢答案的時間
  6. 開啟app,同意所有許可權要求,點選螢幕上的按鈕,選擇搜尋引擎
  7. 此時只要點選本app衝頂大會的app的任意按鈕,就會跳轉到夸克瀏覽器按鈕的內容或者題幹+按鈕內容進行搜尋 ,點選螢幕最底端螢幕最底端上升500畫素內的按鈕會直接搜尋題幹。
  8. 如果無效請 進入設定中找到 app的許可權介面,然後開啟所有許可權。
  9. 本app目前適配了mi5、mix2、谷歌nexus5和小米Max,適用於5.0以上的android系統,其他手機可能不能搜尋按鈕內容,但是題幹一般情況下所有手機都能搜尋。

2.舉個例子

以衝頂大會app來舉個例子

教你用android玩衝頂大會

  1. 點選2區域中任意選項按鈕,將會搜尋題目+選項內容
  2. 注意需要讓彈幕處於靜止狀態,要不然可能會搜尋到錯誤答案。
  3. 如果要單獨搜尋題幹,那麼需要在3區域點選右下角的按鈕,將3區域的輸入框喚出並將其限制在3區域中,最後點選輸入框,這樣就能搜尋題幹了。

3.衝頂經驗

經過3天的測試,我的衝頂率已經達到了80%左右,所以分享幾個使用輔助的經驗。

  1. 12道題目中一般會有10題是隻需要搜尋題乾的
  2. 一般來說可以準備兩隻手機,一隻執行速度快的手機進行答案的搜尋,再搜尋到答案之後先幫另一隻手機選擇答案,然後點選返回鍵回到本手機的衝頂大會選擇答案。
  3. 比較難的場次會有1-2道需要查詢選項的題目,此時需要兩到三個人,每個人查一個選項,這樣能夠確保總結出最後的正確答案。
  4. 一般來說ios系統的直播速度比android系統慢2-3秒,可以利用好這個時間差,延長找答案的時間。建議第二隻手機使用iphone或者ipad。
  5. 建議如果兩個人搜尋答案的話,可以一個人使用谷歌搜尋,一個人使用百度搜尋

二.app用到的技術解析

本節是對本app使用到的技術進行解析,沒有興趣的同學可以直接跳過.

1.需要實現的功能分析

  1. 監聽衝頂大會app在前臺的時候,我們點選按鈕的事件
  2. 獲取到被點選按鈕的文字內容。
  3. 如果不能獲取被點選按鈕的文字內容,需要使用ocr技術,對圖片進行文字解析
  4. 為了在3的情況下獲取到圖片,我們需要在執行後臺service的時候對螢幕進行截圖
  5. 獲取到查詢內容之後拼接搜尋引擎的url,調起瀏覽器

###2.確定了需求之後要使用的技術 1.使用android內建的無障礙服務可以實現監聽衝頂大會app的各種事件。 2.我測試的時候發現,衝頂大會做了某些處理,使得不能通過無障礙來獲取選項按鈕的文字內容,只能獲取該view的區域。此時我就想到額使用ocr技術,來識別該區域的文字。具體的庫是tess-two,這是一個c++的庫,需要開發者自己編譯出so檔案。然後呼叫java層的api,來實現ocr識別。 3.在執行在後臺的情況下,對螢幕進行截圖。這裡5.0起的android系統提供了MediaProjection這個api,能夠獲取當前螢幕的幀。至於5.0以下需要root才能在後臺進行螢幕截圖,所以就放棄了。 4.可以通過Intent和瀏覽器包名,調起指定瀏覽器。這裡我用了比較簡潔快速的夸克瀏覽器

3.程式碼詳解

因為某些原因,打算過一段時間之後再放出原始碼,所以這裡就講解一下,app整個執行流程.當然我放出的apk是debug版,大家如果會反編譯的話,還是能看見原始碼的

  1. 首先是在MainActivity中初始化一些東西
    1. 初始化tess-two的庫
    2. 向使用者請求無障礙螢幕截圖的許可權
    3. 執行無障礙service
  2. 1結束之後,此時無障礙service已經執行起來了,當我們點選衝頂大會的一個按鈕的時候
    1. 進入了**onAccessibilityEvent()**方法。
      onAccessibilityEvent
      1. 進入了按鈕點選的事件
      2. 獲取題幹資訊,這裡我們需要注意到的問題是,衝頂大會的題幹是不可點選的,所以在getQuestionRecursion方法中我會獲取到,當前介面的Root View樹的結構,然後遞迴尋找每個view中符合題幹特徵的文字.(這裡需要大家對 view的繪製原理和view樹的結構有一定的瞭解)
        getQuestionRecursion
        1. 方法傳入的getRootInActiveWindow()是獲取到當前螢幕上面window的view樹結構
        2. 可以看見方法內部就是對view樹進行遞迴查詢
      3. 判斷點選區域是否在只查詢題乾的區域,有了題幹資訊我們還需要判斷,查的是題幹還是選項。所以我規定了只要點選了螢幕上某個區域的按鈕,那麼就是要對題幹進行查詢。(細心的同學會發現,這個區域就是我前面提到的 螢幕底部 到 底部向上500畫素的區域。)getIsSearchQuestion方法內部如圖
        getIsSearchQuestion
        1. 內部的結構很簡單,僅僅是比較當前點選的view的區域,是否在我規定的區域內部
      4. 如果3中返回的字串不為空,就表示我們需要直接查詢題幹,此時直接調起夸克瀏覽器,否則就要識別點選的view區域的影象,來對選項進行查詢,這裡我們就只講ocr識別的部分。useOcrToSearch方法內部如圖
        useOcrToSearch
        1. 這裡的程式碼也很簡單,構造MediaProjection
        2. 通過MediaProjection獲取一個VirtualDisplay並將ImageReaderSurface放入。
        3. 此時ImageReader中每時每刻都會暫存一張當前螢幕的圖片。
        4. 接下來就是處理截圖,然後進行ocr識別了,這裡使用了AsyncTask在其他執行緒執行操作。
          1. 前面我們都知道了怎麼獲取view的區域—————一個Rect,使用這個我們就可以將點選的按鈕的區域變成一個bitmap
          2. 有了view區域的圖片,就可以直接呼叫tess-two的java api來進行ocr了。
          3. 最後我們終於獲取到了選項的內容,此時就可以調起瀏覽器進行搜尋了。速度挺快的,我的mi5識別起來在500毫秒內,網好的情況下從點選到顯示查詢介面不會超過1.5秒。

三.總結

  • 大家可能會問,為什麼這個app不是百萬英雄的輔助,其實有兩個原因:
    • 百萬英雄玩的人太多,每場能分的錢等級分化太嚴重。衝頂大會總的獎金少,但是獎金比較平均。
    • 其實上面一個原因是屁話,哈哈。最開始本app是針對百萬英雄的輔助,但是頭條畢竟是大廠,技術還是很好的。可能是為了防止作弊吧,西瓜視訊的無障礙功能被禁止了 ,所以只能先用衝頂大會試試水。但是目前我已經找到了百萬英雄的漏洞,或許下一次部落格就是百萬英雄的輔助介紹了,大家如果想知道的話,要多多關注我哈。
  • 在簡書上寫了一年多的部落格,終於混了一個簡書程式設計師優秀作者的稱號,還是多靠了大家的捧場,接下還會發表更多關於android的高質量文章,如果大家覺得有幫助希望能多多點贊。
  • 最後,用了本app的同學,如果衝頂成功了,別忘了發紅包哈,嘿嘿!

不販賣焦慮,也不標題黨。分享一些這個世界上有意思的事情。題材包括且不限於:科幻、科學、科技、網際網路、程式設計師、計算機程式設計。下面是我的微信公眾號:世界上有意思的事,乾貨多多等你來看。

世界上有意思的事

相關文章