微信抢红包源代码
- 格式: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)) {