美文网首页Android进阶Android知识Android开发
微信抢红包插件(实现全自动抢红包)

微信抢红包插件(实现全自动抢红包)

作者: SYfarming | 来源:发表于2017-07-25 15:25 被阅读1676次

    微信抢红包插件Android端1.0,目前支持通知栏自动弹起抢红包,列表自动监控(其他功能待改善)
    (PS:此项目是在网上copy的工程,由于微信更新已经停止更新的工程)
    以上仅供技术交流,工程持续更新(测试微信版本6.5.10)(目前7.0系统并不能完美支持,需要root功能,切在测试阶段)
    源码地址:https://github.com/AnyMarvel/WeChatLuckyMoney
    apk下载地址:https://github.com/AnyMarvel/WeChatLuckyMoney/releases/
    (请下载最新APK支持最新包)
    目前并不能对所有手机进行适配,有问题的童鞋还请留言,我尽量修复。(程序员有点穷,目前只是用我的华为荣耀6P进行了测试)有问题请及时留言,我尽量修改。。。。所以请有问题的童鞋勿喷。。。

    我们不联网,没有广告,没有内部数据收取,仅仅单单的实现抢红包功能

    先说说为什么要做这个东西:本人手太慢,朋友圈玩游戏过节老发红包,一不注意就错过了“一个亿”。下定决心搞一个,我自动化抢,随还能跟我抢/


    注意:项目中未使用网络连接权限,未做任何网络推广性的内容,仅做技术探讨,只实现基本抢红包功能。请勿作为商业用途,后果自负。本文原创,转载请简信。

    实现原理:
    这里参考:《你真的理解AccessibilityService吗》中对于AccessibilityService原理讲解
    http://www.jianshu.com/p/4cd8c109cdfb
    AccessibilityService实现原理及能力网上有很多的例子,这里就不在一一的进行介绍,篇文章中只阐述实现内容重点,及所遇到的坑。
    项目使用无障碍模式,不需要root手机,只需要运行该无障碍模式进行定向包监听。
    我们这里只针对微信包进行了监听功能。

    用户不用担心流氓软件,病毒等问题。源码是公开的,内部权限也是公开的。本着技术的原则进行对外公开,目的是为了技术交流。

    实现流程:
    一. 监听AccessibilityEvent,监听通知及界面变化。
    通过TYPE_WINDOW_STATE_CHANGED及TYPE_WINDOW_CONTENT_CHANGED对微信界面进行区别监听。这里遇到了坑,下面会详细介绍。
    二. 查找红包信息,查看聊天会话窗口,遍历节点匹配“领取红包”和"查看红包"
    三. 如果已经接收到红包并且还没有戳开则拆开红包
    四.戳开红包,红包还没抢完,遍历节点匹配“拆红包”,戳开红包,红包已被抢完,遍历节点匹配“红包详情”和“手慢了”,
    五.如果戳开但还未领取则领取红包,则领取红包
    六,全局返回,进行默认监听
    流程如下:

    所遇到的问题:

    问题一:TYPE_WINDOW_STATE_CHANGED和TYPE_WINDOW_CONTENT_CHANGED的区别

    这里需要注意的是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来作为监测事件的,所以解决这个问题的方式就是加入判断条件

    问题二:AccessibilityService.dispatchGesture模拟手势方法的使用

    由于performAction这个函数在SDK_INT <= 23时间才生效(这里指的是微信,不知道微信做了什么屏蔽,),在SDK_INT > 23时候模拟点击不起作用
    这个问题使用google了一些找不到好的解决方案,直接看代码吧(纠正下,以下代码目前在Android7.0上目前也只会执行到oncancle中,只能使用模拟点击,申请root权限进行屏幕坐标点点击)

    {
    
                    Path path = new Path();
                    if (640 == dpi) {
                        path.moveTo(720, 1575);
                    } else {
                        path.moveTo(540, 1060);
                    }
                    GestureDescription.Builder builder = new GestureDescription.Builder();
                    GestureDescription gestureDescription = builder.addStroke(new GestureDescription.StrokeDescription(path, 450, 50)).build();
                    dispatchGesture(gestureDescription, new GestureResultCallback() {
                        @Override
                        public void onCompleted(GestureDescription gestureDescription) {
                         .......
                    }, null);
    
                }
    
    问题三:息屏抢红包模式

    这个是我手机的一个坑。华为手机在息屏后会自动的将进程杀死已用来进行用电的节约,这里可以在手机里面进行手动的关闭,步骤如下:

    设置→应用管理→微信→电池→打开“屏幕关闭后保持运行”,就OK了。
    当然原有的通知设置也要打开
    截图如下:


    屏幕关闭后保持运行打开即可。
    ps:在后续的代码调用中这块也会进行更新,就不用手动的进行代码调用了。

    问题四:Android7.0以上支持

    感谢王洪贺提出的在小米7.0上不能正确使用
    这两天查看了下在我们的代码中

    //打开钱包后进行查找
        private AccessibilityNodeInfo findOpenButton(AccessibilityNodeInfo node) {
            if (node == null)
                return null;
    
            //layout元素,遍历找button
            for (int i = 0; i < node.getChildCount(); i++) {
                if ("android.widget.Button".equals(node.getChild(i).getClassName()))
                    return node.getChild(i);
            }
            return null;
        }
    

    不能正确的获取到 開 字的Node节点信息。尝试使用遍历的方法进行获取也不行

       private AccessibilityNodeInfo findOpenButton(AccessibilityNodeInfo node) {
            if (node == null)
                return null;
    
            //非layout元素
            if (node.getChildCount() == 0) {
                if ("android.widget.Button".equals(node.getClassName()))
                    return node;
                else
                    return null;
            }
    
            //layout元素,遍历找button
            AccessibilityNodeInfo button;
            for (int i = 0; i < node.getChildCount(); i++) {
                button = findOpenButton(node.getChild(i));
                if (button != null)
                    return button;
            }
            return null;
        }
    

    获得到的就是一堆的线性布局,这里不清楚是否是微信做了屏蔽还是Android7.0增加了Android安全的特点

    这里想到的方法,使用root 权限,使用模拟点击的方式进行屏幕内容点击。(ps代码需要重构,需要大家等待下,最近比较忙。。。)
    刚试了下Android6.0以下目前可以正常获取到開的节点信息,可以正常使用,有问题请及时联系,代码我努力更新。


    关注微信公众号 Android历练记 或扫一扫二维码:
    让我们一起来搞事情。

    Android历练记

    相关文章

      网友评论

        本文标题:微信抢红包插件(实现全自动抢红包)

        本文链接:https://www.haomeiwen.com/subject/magwkxtx.html