关于抢红包的流程

 

1、在非微信消息列表界面,收到通知消息的事件,推断通知栏里的文本是否有[微信红包]的keyword,有则能够推断为用户收到红包的消息(当然,你能够有益发一条包含这个keyword的文本消息去整蛊你的朋友)。然后,我们就自己主动化触发这个消息的意图事件(Intent);

2、在通知栏跳进微信界面后,是去到com.tencent.mm.ui.LauncherUI这个Activity界面。我们知道,红包的消息上,包含了keyword领取红包或者Viewid。那我们就依据这个keyword找到对应的View,然后再触发ACTION_CLICK(点击事件);

3、在点击红包后。会跳到com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI这个拆红包的Activity,当然老方法,找keyword拆红包id,然后触发自己主动化点击事件。

这样就能够完毕整个自己主动化完毕抢红包的流程了,所以核心就是找keyword。然后模拟用户点击事件,就这么简单。下面具体说一下代码的实现。

下面是通过DDMS工具里的Dump View Hierarchy For UI Automator 去分析微信UI结构。

微信抢红包源代码_控件

微信抢红包源代码_微信_02


微信抢红包源代码_ide_03


关键代码 

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<CharSequence> 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<AccessibilityNodeInfo> 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<AccessibilityNodeInfo> 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)) {
				return;
			}
			notification = (Notification) event.getParcelableData();
			PendingIntent pendingIntent = notification.contentIntent;
			try {
				pendingIntent.send();   //点击通知栏消息
				System.out.println("send....");
			} catch (PendingIntent.CanceledException e) {
				e.printStackTrace();
			}
		}
	}

 

	@Override
	public void onInterrupt() {
		// TODO Auto-generated method stub

	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		// TODO Auto-generated method stub
		return super.onStartCommand(intent, START_STICKY, startId);
	}
}


project下载链接   http://pan.baidu.com/s/1kTu4qAr