使用AccessibilityService实现微信自动抢红包

最近要实现微信自动抢红包的功能,使用AccessibilityService来开发,这里主要写一下逻辑以及注意点。

注意点

1、搜索关键字

我们实现某个功能比如点击等需要找到对应的对象然后模拟点击事件,所以首先就是怎么样找到对象,下面说三种方式:

(1)findAccessibilityNodeInfosByText通过文字来实现查找,返回的是List<AccessibilityNodeInfo>,所以需要通过for循环来具体判断需要的关键字的对象

(2)findAccessibilityNodeInfosByViewId通过控件的id来查询,返回的是List<AccessibilityNodeInfo>,虽然也是返回List但是一般只有一个,查找的准确性高,不过需要系统的版本API>=18

(3)搭配findAccessibilityNodeInfosByText来查找,在微信中使用uiautomatorviewer查看布局,发现不同的手机相同的控件id是不一样的,比如我们需要查询获取红包的数量时,需要先查找‘元‘,然后获取其父控件,然后查找金额所在的位置,这个是不变的。

2、对于返回功能

一般我们领取红包后进入红包详情界面,这时我们要返回到聊天界面使用uiautomatorviewer查看返回箭头,查看其属性他的clickable=false这样的话我们就无法通过

accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);来实现点击事件来实现返回的功能,不过查看AccessibilityService源码里面有对应的全局事件,下面说两种实现返回功能的方法
(1)查找界面上对应的返回按钮然后通过AccessibilityNodeInfo的
performAction(AccessibilityNodeInfo.ACTION_CLICK)实现点击,不过在操作之前先判断一下isCheckable()如果是false则无法实现其功能

(2)使用AccessibilityService的performGlobalAction的方法,介绍如下:
/**
     * Performs a global action. Such an action can be performed
     * at any moment regardless of the current application or user
     * location in that application. For example going back, going
     * home, opening recents, etc.
     *
     * @param action The action to perform.
     * @return Whether the action was successfully performed.
     *
     * @see #GLOBAL_ACTION_BACK
     * @see #GLOBAL_ACTION_HOME
     * @see #GLOBAL_ACTION_NOTIFICATIONS
     * @see #GLOBAL_ACTION_RECENTS
     */
    public final boolean performGlobalAction(int action) {
        IAccessibilityServiceConnection connection =
            AccessibilityInteractionClient.getInstance().getConnection(mConnectionId);
        if (connection != null) {
            try {
                return connection.performGlobalAction(action);
            } catch (RemoteException re) {
                Log.w(LOG_TAG, "Error while calling performGlobalAction", re);
            }
        }
        return false;
    }

所以要实现返回功能只需要调用performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);,当然如果想实现Home,通知,最近的应用换成对应的action就可以了

3、涉及微信界面的类

 /**
     * 微信的包名
     */
    static final String WECHAT_PACKAGENAME = "com.tencent.mm";
    /**
     * 拆红包类
     */
    static final String WECHAT_RECEIVER_CALSS = "com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI";
    /**
     * 红包详情类
     */
    static final String WECHAT_DETAIL = "com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI";
    /**
     * 微信主界面或者是聊天界面
     */
    static final String WECHAT_LAUNCHER = "com.tencent.mm.ui.LauncherUI";

这里需要注意的是WECHAT_LAUNCHER,微信主界面以及聊天界面应该采用的FragmentActivity+Fragment这样导致如果用户进入到微信主界面则会调用AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED,导致再次进入微信聊天界面不会再调用AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED,而会调用AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED,而AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED只要内容改变后都会调用,所以一般是使用AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED来作为监测事件的,所以解决这个问题的方式就是加入判断条件:

(1)触发AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED这个事件搜索列表界面是否有"领取红包"字样,如果没有则设置一个变量
(2)如果没有触发AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED而触发了AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED,则去判断之前设置的变量综合来判断

4、增加红包获取量避免重复金额

在聊天界面的红包虽然会有"领取红包"的字样,但是其实是已经拆过的,判断的标识就是是否有"拆红包",如果有拆红包则计算对应详情中的金额。

5、如何循环查询所有的子控件

/**
     * @param info 当前节点
     * @param matchFlag 需要匹配的文字
     * @param type  操作的类型
     */
    public void recycle(AccessibilityNodeInfo info, String matchFlag, int type) {
        if (info != null) {
            if (info.getChildCount() == 0) {
                CharSequence desrc = info.getContentDescription();
                switch (type) {
                    case ENVELOPE_RETURN://返回
                        if (desrc != null && matchFlag.equals(info.getContentDescription().toString().trim())) {
                            if (info.isCheckable()) {
                                info.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                            } else {
                                performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
                            }
                        }
                        break;
                }
            } else {
                int size = info.getChildCount();
                for (int i = 0; i < size; i++) {
                    AccessibilityNodeInfo childInfo = info.getChild(i);
                    if (childInfo != null) {
                        Log.e(TAG, "index: " + i + " info" + childInfo.getClassName() + " : " + childInfo.getContentDescription()+" : "+info.getText());
                        recycle(childInfo, matchFlag, type);
                    }
                }
            }
        }
    }

网上关于抢红包的源码比较多,由于其他原因我们这里的不会公布,可以根据网上的源码进行修改,能够实现功能:

(1)截取通知栏中有[微信红包]字样的通知,然后跳到微信红包界面
(2)进入群聊界面会自动查询当前界面所有"领取红包",然后循环点击查找增加红包的概率
(3)准确的保存领取的红包金额和日期

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 05:48:25

使用AccessibilityService实现微信自动抢红包的相关文章

Android实现微信自动抢红包的程序

简单实现了微信自动抢红包的服务,原理就是根据关键字找到相应的View, 然后自动点击.主要是用到AccessibilityService这个辅助服务,基本可以满足自动抢红包的功能,但是有些逻辑需要优化,比如,拆完一个红包后,必须手动点击返回键,才能进行下一次自动抢红包. AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="h

安卓微信自动抢红包插件优化和实现

转载请注明作者AndroidMSky和链接http://blog.csdn.net/AndroidMsky/article/details/53490459 又是兴趣系列 网上有很多自动强红包的例子和代码,笔者也是做了一些优化. 先说说自己的两个个优势 1.可以在聊天界面自动强不依赖于通知栏推送 2.可以在屏幕熄灭的时候的时候点亮屏幕自动抢(目前只测过flyme) 先上图: 代码传送门: https://github.com/AndroidMsky/WXhongbao 欢迎点星星~ 原理: 通过

Android&quot;挂逼&quot;修炼之行---防自动抢红包外挂原理解析

一.前言 春节过年发个红包本来就是为了讨个喜庆,朋友亲戚之间的关系交流,但是现在随着技术变革,抢红包插件越来越多,导致现在不太愿意发红包了,特别是在一个多人群里,潜水的非常多,但是丢个红包瞬间就没了,感觉真的很不爽呀,然后造成的现象就是你用插件,我也用,结果抢红包就变得没有意思了.在这里我还是觉得尽量不要用这些所谓的抢红包插件.多读些书多好呀! 二.自动抢红包插件分析 本文就来应对那些自动抢红包插件功能的防护功能,我们知道现在自动抢红包主要有着三种方式: 第一种:利用辅助功能和通知栏消息拦截来做

微信自动加好友 模拟位置(二)

上篇没有上传demo 现在补上来 模拟位置 微信自动打招呼

微信自动播放音频的解决方案

微信自动播放音频的解决方案,亲测有效: wx.ready(function () {    wx.getNetworkType({        success: function (res) {            document.getElementById('ring').play()        }    })})

微信自动加人软件安装使用

微信自动加人软件安装使用 只要9.9元 指定资源版效果 附近的人版效果 安装视频教程 安装软件和运行环境 安装夜神模拟器 点击下载 打开夜神模拟器设置设置分辨率为720-1280.  安装微信 下载安装包拖进模拟器即可安装 微信下载地址 安装按键精灵 下载安装包拖进模拟器即可安装 按键精灵下载地址 付款接收脚本 选择你需要的脚本(附近的人版,指定资源版)都是9.9元,付款,我收到款之后将脚本发给你. 导入脚本到模拟器 将发给你的脚本拖入模拟器,并移动到按键精灵文件夹如下图 一次点击->打开手机文

解析大象跳转如何在线生成微信自动跳转第三方浏览器源码

源码使用场景: 1.用来实现微信自动跳转外部浏览器下载app2.用来实现微信内打开网页链接自动跳转浏览器访问指定页面3.防止网页链接由于被微信拦截,导致用户无法正常在微信内打开 源码说明: 适用安卓和苹果系统,支持任何网页链接.并且无论链接是否已经被微信拦截,均可实现微信内自动跳转浏览器打开. 生成的跳转链接具有极佳的防拦截效果. 源码体验: 1.复制分享链接(app下载页链接或网页链接),然后在浏览器中打开大象跳转地址:http://www.go51w.cn/ 2.在工具的输入框中粘贴我们刚才

有哪些api接口可以实现微信自动唤醒外部浏览器打开指定页面?

有哪些api接口可以实现微信自动唤醒外部浏览器打开任意网页url 经常看到贴吧上有人吐槽微信的检测系统太严格了,动不动就拦截第三方链接.怎么才能解决,怎么才能避免等等一系列的问题.因为平时我也会分享一些有趣的新闻或者广告链接给朋友,所以这个问题就成了我的心头大患.于是我去百度找各种解决方案,最终找到了几个在线生成微信跳转链接的api接口,用了以后感觉很方便,就分享给大家,希望能帮助到你. 1.Mindjump接口平台:http://www.mindjump.cn2.366API接口平台:http

微信自动加好友 模拟位置

周围朋友有做代购的想要自定义位置,并且能够搜索附近的人自动打招呼的功能. 原理其实比较简单,主要是通过地图SDK(百度,或者高德)获取对应位置经纬度,然后设置成当前位置(虚拟位置),在通过自动化测试工具自动去操作微信. 需求: 1 自定义当前位置 2 微信搜索附近的人,自动打招呼 3 可以自定义消息内容 需要的知识点: 1百度地图SDK 获取位置 设置当前位置 2robotium自动化测试库 3 城市位置数据库 程序框架: 1启动界面--选择城市---启动微信--自动化操作 技术预研 1 模拟位