Android微信搶紅包功能的實(shí)現(xiàn)原理淺析
快到過(guò)農(nóng)歷年了,微信紅包也越來(lái)越多了,出現(xiàn)了好多紅包外掛程序,就很好奇如何實(shí)現(xiàn)的,于是自己研究了一番,親自寫(xiě)了個(gè)微信搶紅包的APP。現(xiàn)在就一步一步來(lái)實(shí)現(xiàn)它。
實(shí)現(xiàn)思路
微信搶紅包程序開(kāi)啟時(shí)候,他就可以隨時(shí)識(shí)別、捕獲紅包,服務(wù)可以實(shí)現(xiàn)正在功能,當(dāng)我們開(kāi)啟服務(wù)的時(shí)候,服務(wù)就不停的在后臺(tái)運(yùn)行,不停地輪詢(xún)著微信里面的消息,當(dāng)發(fā)現(xiàn)紅包時(shí)候就立即打開(kāi)微信紅包所在的界面。但是他怎識(shí)別紅包呢?需要找到微信搶紅包里面節(jié)點(diǎn)的view,當(dāng)找到對(duì)應(yīng)的view,在獲取view的關(guān)鍵字或者id,根據(jù)關(guān)鍵字或者id,自動(dòng)的模擬點(diǎn)擊,拆開(kāi)紅包。這里有一個(gè)AccessibilityService的服務(wù),他是一個(gè)輔助類(lèi),可以實(shí)現(xiàn)這些功能。
AccessibilityService輔助類(lèi)
AccessibilityService是一個(gè)輔助類(lèi),可以監(jiān)聽(tīng)我們手機(jī)的焦點(diǎn),窗口變化,按鈕點(diǎn)擊,聲音提示等等,但是必須手動(dòng)開(kāi)啟,不能通過(guò)代碼開(kāi)啟,存在于設(shè)置里面的輔助功能,開(kāi)啟他我們可以增強(qiáng)互動(dòng)性?,F(xiàn)在來(lái)來(lái)使用他實(shí)現(xiàn)搶紅包功能:
1、新建一個(gè)類(lèi)QiangHongBaoService繼承自AccessibilityService
@Override public void onAccessibilityEvent(AccessibilityEvent event) { //獲取事件類(lèi)型 int type = event.getEventType(); //在這里進(jìn)行事件過(guò)濾 }
2、注冊(cè)清單文件
<service android:name=".QiangHongBaoService" android:label="@string/app_name" android:enabled="true" android:exported="true" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter android:priority="1000"> <action android:name="android.accessibilityservice.AccessibilityService"/> </intent-filter> <meta-data android:name="android.accessibilityservice" android:resource="@xml/envelope_service_config"/> </service>
新建一個(gè)xml文件夾,創(chuàng)建envelope_service_config文件
<?xml version="1.0" encoding="utf-8"?> <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged" android:accessibilityFeedbackType="feedbackGeneric" android:accessibilityFlags="flagDefault" android:canRetrieveWindowContent="true" android:description="@string/accessibility_description" android:notificationTimeout="100" android:packageNames="com.tencent.mm" /> 記得加上網(wǎng)絡(luò)權(quán)限:<uses-permission Android:name="android.permission.VIBRATE" />
搶紅包業(yè)務(wù)邏輯處理
在微信搶紅包界面上只關(guān)心兩個(gè)事件類(lèi)型:
1、AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED//監(jiān)聽(tīng)通知欄消息
在監(jiān)聽(tīng)通知欄消息界面主要是監(jiān)聽(tīng)每次微信發(fā)過(guò)來(lái)的消息顯示在通知欄時(shí),獲取消息,當(dāng)發(fā)現(xiàn)獲取的消息含有“微信紅包”時(shí)就會(huì)立即打開(kāi) 紅包所顯示的界面。
/** * 從知消息欄打開(kāi)微信聊天界面 * @param event */ private void openNotification(AccessibilityEvent event) { if (event.getParcelableData() != null && event.getParcelableData() instanceof Notification) { Notification notification = (Notification) event.getParcelableData(); PendingIntent pendingIntent = notification.contentIntent; try { pendingIntent.send(); } catch (PendingIntent.CanceledException e) { e.printStackTrace(); } } }
2、AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED//當(dāng)前窗口變化,是否進(jìn)入微信聊天界面
在這里需要根據(jù)包名判斷是否是聊天界面,如果是則點(diǎn)中紅包,如果不是判斷是否是拆紅包界面,如果是則拆開(kāi),執(zhí)行拆紅包動(dòng)作。
聊天界面的包名:com.tencent.mm.ui.LauncherUI
拆紅包界面的包名:com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI
/** * 點(diǎn)中紅包 */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN) private void clickHongBao() { AccessibilityNodeInfo nodeInfo = getRootInActiveWindow(); if (nodeInfo == null) { return; } List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText(ENVLOP_OPEN_KEY); if (list.isEmpty()) { list = nodeInfo.findAccessibilityNodeInfosByText(ENVELOPE_TEXT_KEY); for (AccessibilityNodeInfo n : list) { n.performAction(AccessibilityNodeInfo.ACTION_CLICK); break; } } else { //最新的紅包領(lǐng)起 for (int i = list.size() - 1; i >= 0; i--) { AccessibilityNodeInfo parent = list.get(i).getParent(); if (parent != null) { parent.performAction(AccessibilityNodeInfo.ACTION_CLICK); break; } } } }
/** *拆紅包 */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) private void openHongBao() { AccessibilityNodeInfo rootInActiveWindow = getRootInActiveWindow(); if (rootInActiveWindow == null) { return; } List<AccessibilityNodeInfo> nodeInfos = rootInActiveWindow.findAccessibilityNodeInfosByViewId(ENVLOP_CHECKED_KEY); for (AccessibilityNodeInfo nodeInfo : nodeInfos) { nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK); } }
上例中的拆紅包是依據(jù)控件的id拆開(kāi)的,也可以按照關(guān)鍵字“拆紅包”執(zhí)行。但是效率略低于根據(jù)id拆紅包,這樣很可能影響搶紅包的效率,需要注意的是拆紅包的id在微信不同版本中是不一樣的,所以需要經(jīng)常改變,比較麻煩。此外當(dāng)AccessibilityService服務(wù)被關(guān)閉時(shí)會(huì)回調(diào)onInterrupt方法,當(dāng)連接上時(shí)會(huì)回調(diào)onServiceConnected方法,在這里可以做一些提示性的工作。
搶紅包功能的開(kāi)啟
微信搶紅包功能是通過(guò)手動(dòng)開(kāi)啟的,直接在設(shè)置里面找到輔助功能,點(diǎn)擊開(kāi)啟,為了方便,給activity設(shè)置一個(gè)按鈕,采用隱式意圖的方式,直接跳轉(zhuǎn)至服務(wù)功能。
//打開(kāi)系統(tǒng)設(shè)置中輔助功能 Intent intent = new Intent(android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS); startActivity(intent);
到了這里微信搶紅包的而核心功能介紹完了,搶紅包的效率還受網(wǎng)絡(luò),手機(jī)內(nèi)存大小,系統(tǒng)流暢度的影響,以及服務(wù)優(yōu)先級(jí)等等因素的影響。這里只是學(xué)習(xí)一下,千萬(wàn)別用來(lái)經(jīng)常外掛來(lái)?yè)尲t包,小心被封號(hào)哦!?。?br /> 源碼已經(jīng)上傳至github,需要的點(diǎn)擊打開(kāi)鏈接
https://github.com/yoonerloop/WebEnvelope
以上所述是小編給大家介紹的Android微信搶紅包功能的實(shí)現(xiàn)原理淺析,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Android中捕獲TTextView文本中的鏈接點(diǎn)擊事件方法
這篇文章主要介紹了Android中捕獲TTextView文本中的鏈接點(diǎn)擊事件方法,本文給出了實(shí)現(xiàn)代碼和使用方法以及實(shí)現(xiàn)自己控制的方法,需要的朋友可以參考下2015-01-01Android動(dòng)態(tài)添加碎片代碼實(shí)例
這篇文章主要介紹了Android動(dòng)態(tài)添加碎片代碼實(shí)例,2019-06-06Android入門(mén)之使用OKHttp多線(xiàn)程下載文件
OkHttp是一個(gè)神器。OkHttp分為異步、同步兩種調(diào)用。今天我們就會(huì)基于OkHttp的異步調(diào)用實(shí)現(xiàn)一個(gè)多線(xiàn)程并行下載文件并以進(jìn)度條展示總進(jìn)度的實(shí)用例子,需要的可以參考一下2023-01-01Android手機(jī)號(hào)注冊(cè)、綁定手機(jī)號(hào)獲取短信驗(yàn)證碼實(shí)例
這篇文章主要為大家詳細(xì)介紹了Android手機(jī)號(hào)注冊(cè)、綁定手機(jī)號(hào)獲取短信驗(yàn)證碼實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-04-04Android?flutter?Dio鎖的巧妙實(shí)現(xiàn)方法示例
這篇文章主要為大家介紹了Android?flutter?Dio鎖的巧妙實(shí)現(xiàn)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Android 仿微信發(fā)動(dòng)態(tài)九宮格拖拽、刪除功能
這篇文章主要介紹了Android 仿微信發(fā)動(dòng)態(tài)九宮格拖拽、刪除功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11Android動(dòng)畫(huà)工具類(lèi)的封裝實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了關(guān)于一次Android動(dòng)畫(huà)工具類(lèi)的封裝實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Android編程開(kāi)發(fā)錄音和播放錄音簡(jiǎn)單示例
這篇文章主要介紹了Android編程開(kāi)發(fā)錄音和播放錄音的方法,結(jié)合實(shí)例形式分析了Android多媒體開(kāi)發(fā)中音頻操作的相關(guān)技巧,需要的朋友可以參考下2016-08-08