本文首發於微信公眾號——世界上有意思的事,搬運轉載請註明出處,否則將追究版權責任。微訊號:a1018998632,交流qq群:859640274
最近答題類app比較火,玩了幾把之後想到為什麼不用技術來查詢答案呢?因此搞了一款輔助app,能夠幫助大家直接搜尋答案.經過兩天的開發和三天的測試,終於讓我的衝頂率達到了80%左右,先上幾個不錯的戰績裝個逼.
一.用app去衝頂
這一節是教大家如何使用app的,如果對使用app不感興趣,想了解技術的同學,可以直接去第二節,新建了一個輔助交流QQ群:314100393,大家有問題可以來這個群裡問。
1.讓app跑起來
- 安裝app。點選下載app
- 進入手機的檔案管理器,在本app的cache目錄下面新建 tessdata目錄 和 ShotImage目錄。例如我的小米Mix2的目錄是:Android/data/com.example.whensunet.chongdingdahui/cache
- 將chi_sim.traineddata檔案放入上面新建的tessdata資料夾中,這個檔案是ocr識別的語言庫,沒有的話就只能查詢題幹,不能查詢選項。點選下載語言庫
- 在 設定—>無障礙/輔助功能—>WhenSunsetBaiWanYinXiongFuZhu中點選開啟,開啟app的服務。
- 下載夸克瀏覽器,這個瀏覽器比較輕便,能夠減少查詢答案的時間
- 開啟app,同意所有許可權要求,點選螢幕上的按鈕,選擇搜尋引擎
- 此時只要點選本app或衝頂大會的app的任意按鈕,就會跳轉到夸克瀏覽器對按鈕的內容或者題幹+按鈕內容進行搜尋 ,點選螢幕最底端到螢幕最底端上升500畫素內的按鈕會直接搜尋題幹。
- 如果無效請 進入設定中找到 app的許可權介面,然後開啟所有許可權。
- 本app目前適配了mi5、mix2、谷歌nexus5和小米Max,適用於5.0以上的android系統,其他手機可能不能搜尋按鈕內容,但是題幹一般情況下所有手機都能搜尋。
2.舉個例子
以衝頂大會app來舉個例子
- 點選2區域中任意選項按鈕,將會搜尋題目+選項內容
- 注意需要讓彈幕處於靜止狀態,要不然可能會搜尋到錯誤答案。
- 如果要單獨搜尋題幹,那麼需要在3區域點選右下角的按鈕,將3區域的輸入框喚出並將其限制在3區域中,最後點選輸入框,這樣就能搜尋題幹了。
3.衝頂經驗
經過3天的測試,我的衝頂率已經達到了80%左右,所以分享幾個使用輔助的經驗。
- 12道題目中一般會有10題是隻需要搜尋題乾的
- 一般來說可以準備兩隻手機,一隻執行速度快的手機進行答案的搜尋,再搜尋到答案之後先幫另一隻手機選擇答案,然後點選返回鍵回到本手機的衝頂大會選擇答案。
- 比較難的場次會有1-2道需要查詢選項的題目,此時需要兩到三個人,每個人查一個選項,這樣能夠確保總結出最後的正確答案。
- 一般來說ios系統的直播速度比android系統慢2-3秒,可以利用好這個時間差,延長找答案的時間。建議第二隻手機使用iphone或者ipad。
- 建議如果兩個人搜尋答案的話,可以一個人使用谷歌搜尋,一個人使用百度搜尋。
二.app用到的技術解析
本節是對本app使用到的技術進行解析,沒有興趣的同學可以直接跳過.
1.需要實現的功能分析
- 監聽衝頂大會app在前臺的時候,我們點選按鈕的事件
- 獲取到被點選按鈕的文字內容。
- 如果不能獲取被點選按鈕的文字內容,需要使用ocr技術,對圖片進行文字解析
- 為了在3的情況下獲取到圖片,我們需要在執行後臺service的時候對螢幕進行截圖
- 獲取到查詢內容之後拼接搜尋引擎的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版,大家如果會反編譯的話,還是能看見原始碼的
- 首先是在MainActivity中初始化一些東西
- 初始化tess-two的庫
- 向使用者請求無障礙和螢幕截圖的許可權
- 執行無障礙service
- 1結束之後,此時無障礙service已經執行起來了,當我們點選衝頂大會的一個按鈕的時候
- 進入了**onAccessibilityEvent()**方法。
- 進入了按鈕點選的事件
- 獲取題幹資訊,這裡我們需要注意到的問題是,衝頂大會的題幹是不可點選的,所以在getQuestionRecursion方法中我會獲取到,當前介面的Root View樹的結構,然後遞迴尋找每個view中符合題幹特徵的文字.(這裡需要大家對 view的繪製原理和view樹的結構有一定的瞭解)
- 方法傳入的getRootInActiveWindow()是獲取到當前螢幕上面window的view樹結構
- 可以看見方法內部就是對view樹進行遞迴查詢
- 判斷點選區域是否在只查詢題乾的區域,有了題幹資訊我們還需要判斷,查的是題幹還是選項。所以我規定了只要點選了螢幕上某個區域的按鈕,那麼就是要對題幹進行查詢。(細心的同學會發現,這個區域就是我前面提到的 螢幕底部 到 底部向上500畫素的區域。)getIsSearchQuestion方法內部如圖
- 內部的結構很簡單,僅僅是比較當前點選的view的區域,是否在我規定的區域內部
- 如果3中返回的字串不為空,就表示我們需要直接查詢題幹,此時直接調起夸克瀏覽器,否則就要識別點選的view區域的影象,來對選項進行查詢,這裡我們就只講ocr識別的部分。useOcrToSearch方法內部如圖
- 這裡的程式碼也很簡單,構造MediaProjection。
- 通過MediaProjection獲取一個VirtualDisplay並將ImageReader的Surface放入。
- 此時ImageReader中每時每刻都會暫存一張當前螢幕的圖片。
- 接下來就是處理截圖,然後進行ocr識別了,這裡使用了AsyncTask在其他執行緒執行操作。
- 前面我們都知道了怎麼獲取view的區域—————一個Rect,使用這個我們就可以將點選的按鈕的區域變成一個bitmap
- 有了view區域的圖片,就可以直接呼叫tess-two的java api來進行ocr了。
- 最後我們終於獲取到了選項的內容,此時就可以調起瀏覽器進行搜尋了。速度挺快的,我的mi5識別起來在500毫秒內,網好的情況下從點選到顯示查詢介面不會超過1.5秒。
- 進入了**onAccessibilityEvent()**方法。
三.總結
- 大家可能會問,為什麼這個app不是百萬英雄的輔助,其實有兩個原因:
- 百萬英雄玩的人太多,每場能分的錢等級分化太嚴重。衝頂大會總的獎金少,但是獎金比較平均。
- 其實上面一個原因是屁話,哈哈。最開始本app是針對百萬英雄的輔助,但是頭條畢竟是大廠,技術還是很好的。可能是為了防止作弊吧,西瓜視訊的無障礙功能被禁止了 ,所以只能先用衝頂大會試試水。但是目前我已經找到了百萬英雄的漏洞,或許下一次部落格就是百萬英雄的輔助介紹了,大家如果想知道的話,要多多關注我哈。
- 在簡書上寫了一年多的部落格,終於混了一個簡書程式設計師優秀作者的稱號,還是多靠了大家的捧場,接下還會發表更多關於android的高質量文章,如果大家覺得有幫助希望能多多點贊。
- 最後,用了本app的同學,如果衝頂成功了,別忘了發紅包哈,嘿嘿!
不販賣焦慮,也不標題黨。分享一些這個世界上有意思的事情。題材包括且不限於:科幻、科學、科技、網際網路、程式設計師、計算機程式設計。下面是我的微信公眾號:世界上有意思的事,乾貨多多等你來看。