微信抢红包源代码

  • 格式:pdf
  • 大小:67.14 KB
  • 文档页数:3

微信抢红包源代码

1、在⾮微信消息列表界⾯,收到通知消息的事件,推断通知栏⾥的⽂本是否有[微信红包]的keyword,有则能够推断为⽤户收到红包的消息

(当然,你能够有益发⼀条包含这个keyword的⽂本消息去整蛊你的朋友)。然后,我们就⾃⼰主动化触发这个消息的意图事件(Intent);

2、在通知栏跳进微信界⾯后,是去到com.tencent.mm.ui.LauncherUI这个Activity界⾯。我们知道,红包的消息上,包含了keyword领取红包或

者View的id。那我们就依据这个keyword找到对应的View,然后再触发ACTION_CLICK(点击事件);

3、在点击红包后。会跳到com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI这个拆红包的Activity,当然⽼⽅法,找keyword拆红包或id,

然后触发⾃⼰主动化点击事件。

这样就能够完毕整个⾃⼰主动化完毕抢红包的流程了,所以核⼼就是找keyword。然后模拟⽤户点击事件,就这么简单。下⾯具体说⼀下代码

的实现。

下⾯是通过DDMS⼯具⾥的Dump View Hierarchy For UI Automator 去分析微信UI结构。

关键代码

package com.example.hook;

import java.util.List;

import android.accessibilityservice.AccessibilityService;

import android.accessibilityservice.AccessibilityServiceInfo;

import android.annotation.SuppressLint;

import android.annotation.TargetApi;

import android.app.Notification;

import android.app.PendingIntent;

import android.content.Context;

import android.content.Intent;

import android.os.Build;

import android.util.Log;

import android.view.accessibility.AccessibilityEvent;

import android.view.accessibility.AccessibilityNodeInfo;

@SuppressLint("NewApi")

public class HookService extends AccessibilityService {

private final String TAG = "HookService";

/**

* 当通知栏改变或界⾯改变时会触发该⽅法

*/

@Override

public void onAccessibilityEvent(AccessibilityEvent event) {

if (event == null)

return;

if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {

List texts = event.getText();

if (!texts.isEmpty()) {

for (CharSequence t : texts) {

String text = String.valueOf(t);

if (text.contains("[微信红包]")) {//获取通知栏字符,若包括 [微信红包] 则模拟⼿指点击事件

handleNotificationChange(event);

break;

}

}

}

}

/**

* 以下内容能够借助 Dump View Hierarchy For UI Automator 去分析微信UI结构 关于抢红包的流程 */

if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {

System.out.println("TYPE_WINDOW_STATE_CHANGED --> "+event.getClassName());

if ("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI"

.equals(event.getClassName())) {

// 点中了红包,下⼀步就是去拆红包

checkKey1();

} else if ("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI"

.equals(event.getClassName())) {

// 拆完红包后看具体的纪录界⾯

// nonething

} else if ("com.tencent.mm.ui.LauncherUI".equals(event

.getClassName())) {

// 在聊天界⾯,去点中红包

checkKey2();

}

}

}

private void checkKey1() {

AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();

if (nodeInfo == null) {

Log.w(TAG, "rootWindow为空");

return;

}

List list = nodeInfo

.findAccessibilityNodeInfosByText("拆红包"); //获取包括 拆红包 ⽂字的控件,模拟点击事件,拆开红包

for (AccessibilityNodeInfo n : list) {

n.performAction(AccessibilityNodeInfo.ACTION_CLICK);

}

}

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)

private void checkKey2() {

AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();

if (nodeInfo == null) {

Log.w(TAG, "rootWindow为空");

return;

}

List list = nodeInfo

.findAccessibilityNodeInfosByText("领取红包"); //找到聊天界⾯中包括 领取红包 字符的控件

if (list.isEmpty()) {

list = nodeInfo.findAccessibilityNodeInfosByText("[微信红包]");

for (AccessibilityNodeInfo n : list) {

Log.i(TAG, "-->微信红包:" + n);

n.performAction(AccessibilityNodeInfo.ACTION_CLICK);

break;

}

} else {

// 最新的红包领起

for (int i = list.size() - 1; i >= 0; i--) {

AccessibilityNodeInfo parent = list.get(i).getParent();

Log.i(TAG, "-->领取红包:" + parent);

if (parent != null) {

parent.performAction(AccessibilityNodeInfo.ACTION_CLICK);

try { //依据 Dump View Hierarchy For UI Automator 能够知道得到的控件的.getParent().getParent().getParent().getParent()

//才是要点击的根布局。 调⽤performAction(AccessibilityNodeInfo.ACTION_CLICK)触发点击事件

parent.getParent().getParent().getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);

System.out.println("click------");

} catch (Exception e) {

// TODO: handle exception

e.printStackTrace();

}

break;

}

}

}

}

public void handleNotificationChange(AccessibilityEvent event) {

if (event == null)

return;

if (event.getEventType() != AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {

return;

}

if (event.getParcelableData() instanceof Notification) {

Notification notification = (Notification) event

.getParcelableData();

if (!(event.getParcelableData() instanceof Notification)) {