最新消息:欢迎访问Android开发中文站!商务联系QQ:1304524325

微信抢红包源码

开发进阶 AndroidChina 11118浏览 1评论

关于抢红包的流程

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

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

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

这样就可以完成整个自动化完成抢红包的流程了,所以核心就是找关键字,然后模拟用户点击事件,就这么简单。以下详细说一下代码的实现。

以下是通过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);
      }
}

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

转载请注明:Android开发中文站 » 微信抢红包源码

您必须 登录 才能发表评论!

网友最新评论 (1)

  1. 感谢分享,分析的很棒
    wussrc2017-02-06 13:57