zoukankan      html  css  js  c++  java
  • 微信抢红包源代码

    关于抢红包的流程

     

    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结构。






    关键代码 
    
    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


  • 相关阅读:
    内核学习<1>
    守护进程(Daemon进程)
    内核模块版本和内核版本不一致的处理方法
    下载,安装 Source Navigator(ubuntu 14.04)
    最新android NDK 下载地址 for Windows
    HTML5初学一 随机的骰子
    系统自带视频
    网络接口log打印
    recyclerView嵌套recycleView
    冒泡循环
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6888991.html
Copyright © 2011-2022 走看看