自己寫一個不會被微信封掉的Android搶紅包助手

weixin_34290000發表於2017-02-06

轉載請註明出處:http://www.jianshu.com/p/19ddd41aa349

最近才剛開始用簡書來寫部落格,富文字編輯器用的太不習慣了,文字格式大家多包含吧!後面會改用Markdown編輯器。同時在編碼的過程中,參考了lendylongli關於搶紅包的演算法,感興趣的同學可以去看一下:https://github.com/lendylongli/qianghongbao。

又到年末,公司微信群裡各種紅包飛。對於我等手慢黨來說,如果有一個能在第一時間開啟紅包的輔助程式,那將是最大的福音。雖然第一個搶到的人,並不一定能搶到最大的紅包。但是,本著”生死看淡,不服就幹“的原則,let's do something!

一、前期準備

這裡主要用到兩個類:NotificationListenerService和AccessibilityService。還有一個工具:uiautomatorviewer。

NotificationListenerService

從API 18開始,用來監聽過濾通知欄中的資訊。當微信處於後臺,或者當前介面處於聊天列表的時候,有新訊息到來的時候,微信會已Notification的形式彈出。這裡我們要監聽微信彈出的Notification,並從中過濾出是“微信紅包”的資訊。如果是微信紅包,那麼就自動點開這條訊息,並把紅包開啟。

AccessibilityService

搶紅包主要用到的就是這個類。用來監聽介面變化,並執行本應該由使用者來執行的操作,比如點開聊天訊息,開啟紅包等。AccessibilityService,本是Android對於那些由於視力、聽力或其它身體原因導致不能方便使用Android智慧手機的使用者,提供的幫助這些使用者更加簡單地操作裝置,包括文字轉語音(不支援中文)、觸覺反饋、手勢操作、軌跡球和手柄操作的一個工具。只不過,我們們都用來做了一些更方便的事情。

uiautomatorviewer

這是Android SDK下的一個工具。用來掃描和分析 Android 裝置上當前顯示的 UI 元件。使用此工具檢查佈局層次結構,並檢視在裝置前臺顯示的 UI 元件屬性。主要用來在編寫自動化測試程式碼的時候,定位目標控制元件。

二、思路

先來看下手動搶紅包的流程:①從聊天列表中點選進入聊天詳情,然後點選微信紅包的訊息,彈出一個紅包的dialog,最後點選dialog中間的“開”完成搶紅包;②當微信在後臺時,有紅包訊息通知Notification彈出,點選通知,進入聊天詳情,然後和上一種方式一樣。

再來說下紅包助手的大致思路:開啟一個AccessibilityService來監聽手機介面的變化。如果有微信紅包,就用AccessibilityService模擬手動搶紅包的流程去完成搶紅包。如果微信彈出的Notification訊息是一條“微信紅包”的訊息,那麼去點選這個Notification,然後和上面一樣,模擬點選,完成搶紅包的整個過程。

三、動手開幹

1、先寫一個主介面,用來引導使用者初始化一些Service的一些操作,以及統計一下幫助使用者搶到的紅包數量。直接上圖

2、配置我們的AccessibilityService。主要分為3步:

①繼承AccessibilityService,並重寫onAccessibilityEvent方法。當服務啟動後,手機介面發上變化就會回撥這個方法。然後我們根據新介面中的內容來判斷是否有微信紅包,如果有的話就去模擬點選,去搶紅包。程式碼有些多,但都註釋的很清楚。

②在res下新建一個xml資料夾,然後新建一個名為luckymoney_service_config.xml的檔案,加上下面的程式碼

1993550-5ae7ea713a67f3f9.png

這裡主要的幾個引數:

accessibilityEventTypes是配置響應哪些操作包括單擊、長按、滑動等,這裡是響應全部型別的事件。

accessibilityFeedbackType是反饋給使用者的方式,比如語音和震動等。

notificationTimeout是相同型別的兩個事件之間的最小時間傳送到該服務。

packageNames是響應的程式的包名,這裡響應微信和QQ。

③在AndroidManifest中配置這個Service。下面的meta-data要指定上一步中定義的配置檔案

1993550-ee3c833ede219416.png
配置AccessibilityService

3、配置NotificationService

①繼承NotificationListenerService,並實現onNotificationPosted和onNotificationRemoved這個方法;

②在AndroidManifest中配置這個Service

1993550-47a2a04f562ec31b.png
配置NotificationListenerService

4、至此基本配置就已經完成了。下面開始監聽微信紅包,並搶紅包。下面說一下從微信聊天列表中篩選出有紅包的聊天,以及聊天詳情中識別微信訊息中有微信紅包,並開啟紅包的核心程式碼。完整版程式碼,可以從文末連結下載。


下面以聊天列表、聊天詳情中點選紅包訊息,並在彈出的dialog上拆開紅包為例:

1、開啟SDK→tools→uiautomatorviewer,去解析當前手機介面的佈局。下面這個是點選拆紅包的button,可以獲取id,後面就可以通過這個id來查詢到這個button,並執行點選操作。

1993550-149025de2758ea97.png

2、手機介面發生變化,比如收到一條紅包訊息。那麼AccessibilityService的onAccessibilityEvent會被回撥,並傳入一個AccessibilityEvent物件。通過這個物件中獲取當前手機螢幕的資訊。通過event.getClassName()獲取當前介面的類名,通過比對微信紅包介面的類名來確定當前進行到了搶紅包的第幾步,然後去執行相應的操作。微信紅包相關的類名如下:

          "com.tencent.mm.ui.LauncherUI"是最近聯絡人列表和聊天詳情。當出現這個的時候,我們去判斷是否有紅包。

          "com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI"是點選了紅包訊息,彈出了dialog,等待使用者點選“開”的介面。

          "com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI"是拆完紅包後的介面。

這些類名在筆者當前6.5.4版本的微信上是這樣的。如果後期微信新版做出了更換,大家可以通過檢視手機堆疊頂層的類名來重新獲取。

3、在最近聯絡人列表和聊天詳情中查詢紅包的程式碼

1993550-1ce579b1cff9ae01.png
過濾有紅包的訊息

4、點選彈出待拆的紅包dialog,去執行拆開的程式碼。這段程式碼有點多,而且微信不同版本下,拆開紅包的按鈕也不一樣。這裡大家可以去原始碼中檢視,註釋的很清楚。老版本中是“拆紅包”的文字,新版本是Button圖片。這裡從百度上找到一張圖片,引用一下,十分感謝。

1993550-4f4bcf9d0a8e7151.png

總結

其實,學會了AccessibilityService的用法,可以讓手機為你做更多的事情。比如筆者也寫了一個支付寶自動掃福字的程式,雖然後來支付寶限定了每天只能掃出一張福,自動掃也沒什麼軟用。後期我會分享更多自己的東西,希望大家喜歡,有不足之處,敬請指出。

原始碼下載

相關文章