AccessibilityService-微信自动抢红包

2018年02月01日 16:09:06

阅读数:1757

在领导发红包的时候,看到有些同事在1s、2s抢到红包,为什么他们能够这么快?一定是“开挂”的想法立马浮现出来。

做一个程序猿,为什么不自己写一个呢?

借助Android的辅助功能的AccessibilityService服务就能够做到。

  1. 检测当前界面是否有红包(未拆开的红包)
  2. 让手机自动点击发现的红包(未拆开的红包)
  3. 检测拆红包弹出窗口上那个“开”的按钮,并让手机自动点击
  4. 进入红包详情界面,检测到返回按钮,自动点击返回到聊天界面,继续抢红包
一、创建Android Project后,先来编辑AccessibilityService的配置accessible_service_config.xml
  1.  
    <?xml version="1.0" encoding="utf-8"?>
  2.  
    <accessibility-service
  3.  
    xmlns:android="http://schemas.android.com/apk/res/android"
  4.  
    android:description="@string/app_name"
  5.  
    android:accessibilityEventTypes="typeWindowStateChanged|typeWindowContentChanged"
  6.  
    android:accessibilityFeedbackType="feedbackGeneric"
  7.  
    android:accessibilityFlags="flagDefault"
  8.  
    android:canRetrieveWindowContent="true"
  9.  
    android:notificationTimeout="10"
  10.  
    android:packageNames="com.tencent.mm"
  11.  
    />
android:accessibilityEventTypes 辅助服务关注的事件类型
当前配置:typeWindowStateChanged|typeWindowContentChanged(对应等下需要使用到的事件)
android:accessibilityFeedbackType 事件的反馈给用户的方式
当前配置:feedbackGeneric(通用)
android:accessibilityFlags 辅助服务额外的flag信息
当前配置:flagDefault(默认)
android:canRetrieveWindowContent 是否可以获取窗口内容
当前配置:true
android:notificationTimeout 两个同样类型的辅助事件发给辅助服务的最小时间间隔
当前配置:10
android:packageNames 辅助服务监听的应用包名,可监听多个应用包名,使用逗号隔开。
当前配置:com.tencent.mm(监听微信发出的事件)

二、在AndroidManifest.xml中注册AccessibilityService服务

<uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />
  1.  
    <service
  2.  
    android:name=".LooterService"
  3.  
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
  4.  
    <intent-filter>
  5.  
    <action android:name="android.accessibilityservice.AccessibilityService" />
  6.  
    </intent-filter>
  7.  
    <meta-data
  8.  
    android:name="android.accessibilityservice"
  9.  
    android:resource="@xml/accessible_service_config" />
  10.  
    </service>
  1. AccessibilityService需要权限android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
  2. 添加intent-filter下的action android:name="android.accessibilityservice.AccessibilityService"
三、创建继承AccessibilityService的服务类LooterService(检测的id基于微信6.6.1版本)
在accessible_service_config.xml配置了android:accessibilityEventTypes="typeWindowStateChanged|typeWindowContentChanged",所以这里监听
窗口界面的内容是否改变当发生变化时(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED),就有进入到下面的if中:
//如果当前的事件类型是窗口内容出现了变化,那么判断是否有红包视图出现

    if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED){
        List<AccessibilityNodeInfo> hongbaoList = mRootNodeInfo.findAccessibilityNodeInfosByText("微信红包");
        List<AccessibilityNodeInfo> weikaiList = mRootNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/aeb");
        Log.e("looter","发现红包检测数量 : " + hongbaoList.size());
        for (int i = 0; i < weikaiList.size(); i++) {
            if (weikaiList.get(i).getText().equals("领取红包")){
                AccessibilityNodeInfo curNodeInfo = weikaiList.get(i);
                curNodeInfo.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);
            }
        }
    }

通过findAccessibilityNodeInfosByText("微信红包")获取红包数量list;

通过findAccessibilityNodeInfosByViewId("com.tencent.mm:id/aeb"),根据特定id获取到红包item节点list。(下面再说下怎么获取到对应微信版本的id)
在for循环里,通过条件 if (weikaiList.get(i).getText().equals("领取红包"))匹配未拆开的红包item节点,
getParent()拿到父节点,父节点.performAction(AccessibilityNodeInfo.ACTION_CLICK)进行模拟点击。
模拟点击后,弹出红包窗口,这时候监听到窗口的状态发生变化(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED)进入下面的if中:
if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED){
    List<AccessibilityNodeInfo> clickedWindowList = mRootNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/c2i");
    if (clickedWindowList.size() > 0){
        AccessibilityNodeInfo curNodeInfo1 = clickedWindowList.get(0);
        curNodeInfo1.performAction(AccessibilityNodeInfo.ACTION_CLICK);
    }
}

通过findAccessibilityNodeInfosByViewId("com.tencent.mm:id/c2i"),根据特定id获取到“開”控件的节点list。

这里就不用去getParent()拿父节点了,直接进行模拟点击,把红包拆开。
进入到红包详情界面,窗口状态发生变化,上下的if中的代码都会执行到,由于红包详情界面没有com.tencent.mm:id/c2i这个id,所以没有进行模拟点击(拆红包)。
检测到com.tencent.mm:id/ho这个的item节点,模拟点击,返回到聊天界面,继续检测是否未拆开的红包。
if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED){
    List<AccessibilityNodeInfo> backlist = mRootNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/ho");
    if (backlist.size() > 0){
        AccessibilityNodeInfo curNodeInfo1 = backlist.get(0);
        curNodeInfo1.performAction(AccessibilityNodeInfo.ACTION_CLICK);
    }
}

再说下怎么获取到对应微信版本的控件id

使用Android Studio内部的工具Android Device Monitor
点击Dump View Hierarchy for UI Automator这个按钮
这个dump界面截图上点击领取红包,在右侧resource-id一栏中出现这个控件的id。
后续的控件id,依样画葫芦就能获取到对应控件id。
在最后贴一下LooterService这个类的完整代码:
public class LooterService extends AccessibilityService {
    //该对象代表了整个窗口视图的快照
    private AccessibilityNodeInfo mRootNodeInfo = null;
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        mRootNodeInfo = event.getSource();
        if (mRootNodeInfo == null){
            return;
        }
        //如果当前的事件类型是窗口内容出现了变化,那么判断是否有红包视图出现
        try {
            if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED){
                List<AccessibilityNodeInfo> hongbaoList = mRootNodeInfo.findAccessibilityNodeInfosByText("微信红包");
                List<AccessibilityNodeInfo> weikaiList = mRootNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/aeb");
                Log.e("looter","发现红包检测数量 : " + hongbaoList.size());
                for (int i = 0; i < weikaiList.size(); i++) {
                    Log.e("looter","  ---  weikaiList.get(i).getText()  --- " + weikaiList.get(i).getText() );
                    if (weikaiList.get(i).getText().equals("领取红包")){
                        AccessibilityNodeInfo curNodeInfo = weikaiList.get(i);
                        curNodeInfo.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);
                    }
                }
            }
            if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED){
                List<AccessibilityNodeInfo> clickedWindowList = mRootNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/c2i");
                if (clickedWindowList.size() > 0){
                    AccessibilityNodeInfo curNodeInfo1 = clickedWindowList.get(0);
                    curNodeInfo1.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                }
            }
            if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED){
                List<AccessibilityNodeInfo> backlist = mRootNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/ho");
                if (backlist.size() > 0){
                    AccessibilityNodeInfo curNodeInfo1 = backlist.get(0);
                    curNodeInfo1.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                }
            }
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }
    @Override
    public void onInterrupt() {

    }
}
这是这个项目的导出apk包,之前上传的资源。下载分数感觉高,后面重新上传了一个,被拒了。

http://download.csdn.net/download/u014506842/10194630

微信自动抢红包android实现的更多相关文章

  1. 一步一步实现iOS微信自动抢红包

    微信红包 前言:最近笔者在研究iOS逆向工程,顺便拿微信来练手,在非越狱手机上实现了微信自动抢红包的功能.   此教程所需要的工具/文件 yololib class-dump dumpdecrypte ...

  2. iOS微信自动抢红包插件(支持后台和锁屏下抢红包)

    前言:本文主要讲述使用hook方式实现红包插件,涉及到tweak相关知识,如果你不想了解具体实现细节可直接到我的Github地址参考安装(包含越狱和非越狱两种方法)   转眼间2017即将过去,又到了 ...

  3. Android开发——Accessibility机制实现模拟点击(微信自动抢红包实现)

    1. 何为Accessibility机制 许多Android使用者因为各种情况导致他们要以不同的方式与手机交互.对于那些由于视力.听力或其它身体原因导致不能方便使用Android智能手机的用户,And ...

  4. 程序员过年必备 -- Auto.js微信自动抢红包

    打开微信就不用管了: - 自动打开未读消息 - 自动滑动屏幕检测红包 - 自动跳过无效红包 基于Auto JS,apk版本4.01: - 大多数动作均基于控件 - 极个别点击基于动态抓取的坐标 - 这 ...

  5. Python自动抢红包,超详细教程,再也不会错过微信红包了!

    目录: 0 引言 1 环境 2 需求分析 3 前置准备 4 抢红包流程回顾 5 代码梳理 6 后记 0 引言 提到抢红包,就不得不提Xposed框架,它简直是个抢红包的神器,但使用Xposed框架有一 ...

  6. android黑科技系列——防自动抢红包外挂原理解析

    一.前言 春节过年发个红包本来就是为了讨个喜庆,朋友亲戚之间的关系交流,但是现在随着技术变革,抢红包插件越来越多,导致现在不太愿意发红包了,特别是在一个多人群里,潜水的非常多,但是丢个红包瞬间就没了, ...

  7. 好推二维码如何通过应用宝微下载支持微信自动打开APP下载?

    好推二维码 官网 http://www.hotapp.cn 1. 为什么使用应用宝微下载? APP下载二维码,通过微信扫描下载的时候,微信目前只支持应用宝微下载,才能在微信里直接打开下载,否则就需要在 ...

  8. Android开发——自动生成Android屏幕适配的dimens.xml文件

    使用dimens.xml解决屏幕适配问题是Android官方解决方案,本文主要讲述了如何自动生成Android屏幕适配的dimens.xml,减少了工作量,在维护dimens.xml文件时更加省时省力 ...

  9. 微信5.0 Android版飞机大战破解无敌模式手记

    微信5.0 Android版飞机大战破解无敌模式手记 转载: http://www.blogjava.net/zh-weir/archive/2013/08/14/402821.html 微信5.0 ...

随机推荐

  1. JavaScript中常用的BOM属性

    window 窗口 window.open():打开窗口.返回一个指向新窗口的引用. window.close():关闭窗口. window.resizeTo():调整窗口尺寸到指定值 window. ...

  2. Nginx配置问题总结

    1.Nginx直接下载解压,有个nginx.exe文件,双击即开启Nginx服务(windows系统下).默认是80端口. 若服务无法启动,考虑以下三方面问题: (1)端口号80是否被占用 (2)防火 ...

  3. redis之(九)redis的事务机制

    [一]什么是redis的事务 --->redis的事务是一组命令的集合. --->redis的事务是保证一组命令,要么都执行,要么都不执行.但不支持一组命令中,其中一个或多个执行失败,不支 ...

  4. Zabbix历史数据库迁移 及分区

    https://blog.csdn.net/hkyw000/article/details/78971201?utm_source=blogxgwz6

  5. 深度理解onmouseover事件和onmouseout事件

    今天简单的讲解下onmouseover事件和onmouseout事件,一直以为它们只是简单的分别实现鼠标指针移动到元素上时触发事件和在鼠标指针移出指定的对象时触发事件,但是突然发现这些只是对它们简单的 ...

  6. AC日记——[SDOI2009]HH去散步 洛谷 P2151

    [SDOI2009]HH去散步 思路: 矩阵快速幂递推(类似弗洛伊德): 给大佬跪烂-- 代码: #include <bits/stdc++.h> using namespace std; ...

  7. 用谷歌浏览器Chrome浏览jQuery Mobile页面需要配置Tomcat服务器

    在浏览jQuery Mobile 页面中,除了 Chrome浏览器出错外,其他的浏览器都ok: 这里,是因为需要单独配置 Tomcat 服务: 1.先配置java jdk: 2.下载,安装,配置,To ...

  8. textbox获取当前光标位置,在光标后面插入字符串

    左侧输入要复制的字符串,点击复制btn,将左侧字符串复制到后侧, 示例: 输入框                复制后 12345 12345 (光标落在3后) aaa 123aaa45(光标落在4后 ...

  9. RabbitMQ (十五) 镜像集群 + HAProxy1.7.8 负载均衡

    RabbitMQ 默认的集群模式,也就是普通模式,最大的问题就在于存储队列完整数据的节点一旦宕机, 如果是非持久化队列,则消息丢失;如果是持久化队列+持久化消息,则必须等该节点恢复. 所以后来 Rab ...

  10. Html导出Pdf

    最近领导给了一个新的需求:给了我一个html页面,让我导出Pdf页面 由于以前没有搞过这方面的需求,所以查百度找资料,找了一大堆的好东西,像ItextSharp和wkhtmltopdf 废话不说,进入 ...