插件 微信 自动 抢红包
先回顧一下?lián)尲t包的的流程:
以上是不在微信聊天界面時(shí)的流程.如果你所在的微信聊天窗口出現(xiàn)紅包,則不會(huì)執(zhí)行步驟1,而是直接執(zhí)行2,3,4.如果是在微信好友列表時(shí),收到紅包,則會(huì)在列表項(xiàng)中顯示[微信紅包],需要點(diǎn)即該列表項(xiàng),進(jìn)入聊天界面,隨后執(zhí)行2,3,4.為了方便演示,這里我們暫時(shí)不考慮好友列表時(shí)出現(xiàn)紅包的情況.
明白了搶紅包流程,之后我們通過(guò)AccessibilityService獲取通知欄信息及微信聊天窗口界面,繼而通過(guò)模擬點(diǎn)擊實(shí)現(xiàn)打開(kāi)紅包,搶紅包等操作.
AccessibilityService配置如下:
?
<?xml version="1.0" encoding="utf-8"?> <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged|typeWindowContentChanged"android:accessibilityFeedbackType="feedbackGeneric"android:accessibilityFlags="flagDefault"android:canRetrieveWindowContent="true"android:notificationTimeout="100"android:packageNames="com.tencent.mm" />具體實(shí)現(xiàn)代碼如下:
?
public class RobService extends AccessibilityService {@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {int eventType = event.getEventType();switch (eventType) {case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:handleNotification(event);break;case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED:String className = event.getClassName().toString();if (className.equals("com.tencent.mm.ui.LauncherUI")) {getPacket();} else if (className.equals("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI")) {openPacket();} else if (className.equals("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI")) {close();}break;}}/*** 處理通知欄信息** 如果是微信紅包的提示信息,則模擬點(diǎn)擊** @param event*/private void handleNotification(AccessibilityEvent event) {List<CharSequence> texts = event.getText();if (!texts.isEmpty()) {for (CharSequence text : texts) {String content = text.toString();//如果微信紅包的提示信息,則模擬點(diǎn)擊進(jìn)入相應(yīng)的聊天窗口if (content.contains("[微信紅包]")) {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();}}}}}}/*** 關(guān)閉紅包詳情界面,實(shí)現(xiàn)自動(dòng)返回聊天窗口*/@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)private void close() {AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();if (nodeInfo != null) {//為了演示,直接查看了關(guān)閉按鈕的idList<AccessibilityNodeInfo> infos = nodeInfo.findAccessibilityNodeInfosByViewId("@id/ez");nodeInfo.recycle();for (AccessibilityNodeInfo item : infos) {item.performAction(AccessibilityNodeInfo.ACTION_CLICK);}}}/*** 模擬點(diǎn)擊,拆開(kāi)紅包*/@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)private void openPacket() {AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();if (nodeInfo != null) {//為了演示,直接查看了紅包控件的idList<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByViewId("@id/b9m");nodeInfo.recycle();for (AccessibilityNodeInfo item : list) {item.performAction(AccessibilityNodeInfo.ACTION_CLICK);}}}/*** 模擬點(diǎn)擊,打開(kāi)搶紅包界面*/@TargetApi(Build.VERSION_CODES.JELLY_BEAN)private void getPacket() {AccessibilityNodeInfo rootNode = getRootInActiveWindow();AccessibilityNodeInfo node = recycle(rootNode);node.performAction(AccessibilityNodeInfo.ACTION_CLICK);AccessibilityNodeInfo parent = node.getParent();while (parent != null) {if (parent.isClickable()) {parent.performAction(AccessibilityNodeInfo.ACTION_CLICK);break;}parent = parent.getParent();}}/*** 遞歸查找當(dāng)前聊天窗口中的紅包信息** 聊天窗口中的紅包都存在"領(lǐng)取紅包"一詞,因此可根據(jù)該詞查找紅包* * @param node*/public AccessibilityNodeInfo recycle(AccessibilityNodeInfo node) {if (node.getChildCount() == 0) {if (node.getText() != null) {if ("領(lǐng)取紅包".equals(node.getText().toString())) {return node;}}} else {for (int i = 0; i < node.getChildCount(); i++) {if (node.getChild(i) != null) {recycle(node.getChild(i));}}}return node;}@Overridepublic void onInterrupt() {}@Overrideprotected void onServiceConnected() {super.onServiceConnected();}}上面的代碼簡(jiǎn)單演示了搶紅包的原理,為了方便起見(jiàn),我直接通過(guò)findAccessibilityNodeInfosByViewId()獲取制定id控件.在實(shí)際中,這種方法不太可靠,到目前為止,微信已經(jīng)改過(guò)幾次相關(guān)控件的id了.
有童鞋問(wèn),怎么樣知道該控件的id呢.其實(shí)很簡(jiǎn)單,android中已經(jīng)為我們提供了相關(guān)的工具:在Android Studio中開(kāi)啟Android Device Monitor,選擇設(shè)備后點(diǎn)擊Dump View Hierarchy for UI Automator,如下:
?
這里寫圖片描述
?
?
稍等片刻之后,便會(huì)出現(xiàn)當(dāng)前設(shè)備的窗口,在該窗口中點(diǎn)擊相關(guān)控件,便會(huì)顯示該控件的屬性.借助該工具,可以幫我們快速的分析界面結(jié)構(gòu),幫助我們從其他app布局策略中學(xué)習(xí)
這里寫圖片描述
我們用Dump View Hierarchy for UI Automator分析聊天界面微信紅包信息:
?
這里寫圖片描述
搶紅包界面:
?
這里寫圖片描述
?
總結(jié)
以上是生活随笔為你收集整理的插件 微信 自动 抢红包的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【python】hashlib.shas
- 下一篇: 【经验分享】工程开发与Coding规范