執行起來的同學,歡迎在評論區裡,貼出自己現在中心點的命中率。
如果有同學對Android無障礙服務熟悉並且有時間有精力,可以實現一個基於Android無障礙服務的外掛,那樣就不需要連線ADB與電腦了。
我沒有想到有那麼多同學問我如何匯入專案。主要的問題在於:
- 如何匯入專案?
- 為什麼不上傳wechat_jump_hack.iml檔案?
程式控制小人自動跳,幾乎每次命中中心點。
為了更好的展示執行效果,我貼一個剛剛錄製的視訊。v.youku.com/v_show/id_X…
如果你的執行效果,不像這個視訊中所示,請一定要認真閱讀“溫馨提示”這個章節。
附上 GitHub 地址: github.com/burningcl/w… 歡迎大家與我交流意見。破解過程,總共花了3個小時,不斷地調整演算法與引數,因此程式碼比較亂,還請見諒。
2018/01/04優化
根據同學們的反饋,我今天午休時,抽了20分鐘,優化了一下演算法。
提高瓶子的識別率。
由於瓶子的顏色比較接近,新實現了一種演算法用於瓶子的瓶蓋的識別。效果如下:
提高出現特殊盒子時,下步的計算。
特殊盒子,例如留聲機,他的動效時間很長,而且很大,對下一步的識別產生干擾。因此,改進了一下演算法,減少干擾的影響。效果如下:
新增加了HackTest.java檔案。大家在執行Hack.java後,會在
wechat_jump_hack/out/production/wechat_jump_hack/imgs/input/
目錄下存放截圖檔案。執行Hack.java結束後,再執行HackTest.java,會在wechat_jump_hack/out/production/wechat_jump_hack/imgs/output/
下生成input目錄中的截圖的位置標記。- 紅點表示玩家位置;
- 綠點表示下一個盒子的邊界點;
- 藍點表示下一個盒子的中心點;
如果覺得跳得不準的同學,請執行HackTest.java檔案,觀察標記的位置是否準確。如果準確的話,請自行調整彈跳係數。筆者無法做到我所用的彈跳係數適用於所有的裝置。
新增對命中中心點的統計
screenshot, file: /Users/chenliang/SkylineProjects/wechat_jump_hack_1/out/production/wechat_jump_hack_1/imgs/input/1092.png 438, 364 pos, x: 404, y: 1104 find myPos, succ, (404, 1104) 191, 217, 194 232, 258, 266 top, x: 732, y: 803 true left, x: 599, y: 880 right, x: 868, y: 880 whitePoint: 752, 715, 887, 866 find whitePoint, succ, (733, 876), centerHit: 901, total: 1093 find nextCenter, succ, (733, 876) distance: 554 /Users/chenliang/Library/Android/sdk/platform-tools/adb shell input swipe 400 400 400 400 554 複製程式碼
根據我的執行結果,命中中心點的概率,大約為82%~85%。因為微信也在改進,命中中心點的難度也在提高
對於最後的成績無法提交
一. 效果展示
二. 實現原理
具體識別的演算法,我現在沒有時間總結了(以後有時間我可以去總結一下),大家可以先看原始碼。原始碼中部分引數是在筆者的手機上進行除錯的(解析度為1080),大家可以根據自己手機,進行相應修改。
主要步驟
識別玩家位置
如下圖中白色空心方格所示:
識別目標方塊位置
如下圖中紅色實心方格所示,識別最上面的頂點,最左邊的點,與最右邊的點,從而計算出中心點:
識別目標方塊中心圓點的位置
如果你前一次踩中中心點,會有下一個中心點的提示(一個白色的圓點)。
流程
- 通過ADB截圖;
- 通過ADB將截圖儲存到電腦;
- 識別玩家位置;
- 識別目標方塊位置;
- 識別目標方塊中心圓點的位置;
- 如果第5步成功,則取第5步的中心點為下一步的位置;否則,取第4步的中心點為下一步的位置;
- 計算玩家位置與下一步的位置,乘以一定的係數,得到長按的時間;
- 通過ADB,觸發長按;
三. 執行條件
- 準備Java執行與編譯環境,使用Java8以上,IDE推薦使用Intellij;
- 安裝Android SDK;
- 使用 git工具clone專案,地址為 github.com/burningcl/w… ;
- 使用IDE(筆者使用Intellij)import該專案;
- 準備好一部已經開啟開發者模式的Android手機;
- 請確認是否adb已經聯接上你的手機;如果adb連線失敗,則會導致截圖與拉取截圖失敗,提示“find myPos, fail”或者找不到檔案“1.png (No such file or directory) ”;如果連著多個Android裝置的話,最好關到只有一個;
- 開啟開發者選項,找到“USB除錯(安全設定)允許通過USB除錯修改許可權或者模擬點選”(在mui上是這樣的,在其他手機上,應該也是差不多這樣)這個開關,開啟它;如果這個許可權沒有授予,則不能正常觸發彈跳;
- 修改com.skyline.wxjumphack.Hack中ADB_PATH,將其改為你自己的ADB位置;
- 開啟微信,開啟跳一跳遊戲,並點選開始;
- 執行程式(Hack.java中的main方法)吧,騷年,觀察它自動跳動;
四. 溫馨提示
- 有些同學反饋,程式報錯,提示找不到檔案或者“find myPos, fail”。請確認是否adb已經聯接上你的手機;如果adb連線失敗,則會導致截圖與拉取截圖失敗。
- 有些同學反饋,位置都計算出來了,但是沒有觸發彈跳。開啟開發者選項,找到“USB除錯(安全設定)允許通過USB除錯修改許可權或者模擬點選”(在mui上是這樣的,在其他手機上,應該也是差不多這樣)這個開關,開啟它。
- 這個小遊戲,後來騰訊好像加了一些干擾的動效,會干擾位置計算。後期可以優化。
- 因為我總共才花了3小時去破解,主要的時間都花了前期的識別演算法的優化上。程式碼中,還有很多魔法值什麼的,程式碼也比較亂。如果要閱讀的話,還請見諒。
- 至於位置計算,請執行MyPosFinder.java與NextCenterFinder.java中的main方法,觀察生成檔案,檢視標記的位置是否正確。