微信抢红包原理分析及实现(适配微信7.0.10版本)

前言:之前写过一篇软件推广的博客,有小伙伴留言问是否能提供下代码做参考,今天我就依据微信7.0.10版本来实现。

一、原理解析
关于AccessibilityService官网是这样介绍的

Accessibility services should only be used to assist users with disabilities in using Android devices and apps. They run in the backgro und and receive callbacks by the system when AccessibilityEvents are fired. Such events denote some state transition in the user interface, for example, the focus has changed, a button has been clicked, etc.

上面大概的意思就是AccessibilityService是一个辅助服务,可用来帮助残障人士使用Android设备,对页面的内容变化做出相应的处理等。

官网参考地址:https://developer.android.google.cn/reference/android/accessibilityservice/AccessibilityService.html

二、开发思路
通过注册AccessibilityService来监听通知栏和页面内容变化事件
通过系统提供的findAccessibilityNodeInfosByText和findAccessibilityNodeInfosByViewId来获取页面具体的控件对象
通过performAction(AccessibilityNodeInfo.ACTION_CLICK)方法来模拟点击事件

三、代码实现

1、编写一个类继承AccessibilityService

public class RedPacketService extends AccessibilityService {

    private static final String TAG = "RedPacketService";

    private static final String ENVELOPE_TEXT_KEY = "[微信红包]";//红包消息的关键字

    @Override
    public void onInterrupt() {
        //服务中断,如授权关闭或者将服务杀死
        Toast.makeText(this, "中断抢红包服务", Toast.LENGTH_SHORT).show();
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        //连接服务后,一般是在授权成功后会接收到
        Toast.makeText(this, "连接抢红包服务", Toast.LENGTH_SHORT).show();
    }

2.接收事件,拦截通知栏变化,界面变化

 @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        //接收事件,如触发了通知栏变化、界面变化等
        final int eventType = event.getEventType();

        try {
            String className = event.getClassName().toString();
            Log.w(TAG, "当前事件的类名:" + className + "  ---  eventType: " + eventType);

            if (eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {//32
                openEnvelope(event);
            } else if (eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) {//2048
                openEnvelope(event);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

3、对拦截的事件进行分析处理


    private void openEnvelope(AccessibilityEvent event) {
        if ("com.tencent.mm.ui.LauncherUI".equals(event.getClassName()) ||
                "android.widget.LinearLayout".equals(event.getClassName()) ||
                "android.widget.FrameLayout".equals(event.getClassName()) ||
                "android.widget.ListView".equals(event.getClassName()) ||
                "android.widget.TextView".equals(event.getClassName())) {
            checkKey();
        } else if ("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyNotHookReceiveUI".equals(event.getClassName())) {
            openPacket();
        }
    }

4、对微信用户列表的分析处理

见下图:

 

分析后发现微信聊天列表每个item对应的id为:com.tencent.mm:id/bah ,每个item里面文本信息的id为:com.tencent.mm:id/bal

所以根据两个id我们就可以写代码了:

        //微信界面列表
        List<AccessibilityNodeInfo> list2 = nodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/bah");
        for (AccessibilityNodeInfo n2 : list2) {
            //文本内容
            List<AccessibilityNodeInfo> list3 = n2.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/bal");
            if (list3.size() > 0) {
                String string = list3.get(0).getText().toString();
                if (string.contains(ENVELOPE_TEXT_KEY)) {
                    n2.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                    break;
                }
            }
        }

5、对微信聊天界面的分析处理

见下图:

分析后发现聊天界面每个用户发送红包内容的id为:com.tencent.mm:id/atb

所以根据这个id我们就可以写代码了:

        //聊天界面
        List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/atb");
        for (AccessibilityNodeInfo n : list) {
            List<AccessibilityNodeInfo> listape = n.findAccessibilityNodeInfosByText("已领取");
            if (listape.size() <= 0) {
                if (n.findAccessibilityNodeInfosByText("已过期").size() <= 0) {
                    if (n.findAccessibilityNodeInfosByText("已被领完").size() <= 0) {
                        n.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                    }
                }
            }
        }

6、对抢红包界面的分析处理

见下图:

分析后发现抢红包界面 “開”的id为:com.tencent.mm:id/dan

所以根据这个id我们就可以写代码了:

List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/dan");
Log.w(TAG, "程序来到了这里  集合大小: " + list.size());
for (AccessibilityNodeInfo info : list) {
    info.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}

代码下载链接:https://download.csdn.net/download/Abner_Crazy/12101642

软件下载链接:https://sj.qq.com/myapp/detail.htm?apkName=central.scjgt.utils 

声明:本文依据Android Accessbilityservice开发,无需root权限。本文内容仅供娱乐学习,切不可用于其它非法用途。如果有人利用本文技术进行非法操作带来的后果都是操作者自己承担,和本文以及本文作者没有任何关系。(抢红包本就是一种娱乐放松的行为,不要因为使用本软件伤了朋友间的情谊~)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等风起了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值