简书文章:https://www.jianshu.com/p/e1099a94b979

附抢红包开源项目地址,代码已全改为Kotlin了,已适配到最新微信7.0.5版本,如果对你有所帮助赏个star吧:https://github.com/xbdcc/GrabRedEnvelope

前言

相信很多人见过群里总会有人抢红包速度很快,也可能有人用过抢红包外挂,那么他们是什么原理实现的呢?

  • 目前一般用得最多的就是通过AccessibilityService无障碍服务监控UI模拟点击实现,此方法不需要手机Root.

  • 另外还有一种方式可以通过Xposed直接Hook微信的代码调用。通过Hook需要手机Root或者安装Xposed虚拟环境,并且要反编译结合源码分析,找到关键Hook点。

今天就简单介绍下不需要Root的方式实现Android抢微信红包,如果你用Uiautomator或Appium写过一些Android脚本应该知道实现的过程其实很简单。注:以下是基于Android版微信7.0.3版本。

知识点

本篇会用到的相关知识工具,如果有不了解的Google一下你就知道:
DDMS,AccessibilityService,Kotlin语言

UI分析

  • 首先我们打开安装的SDK目录,MAC下可以在Finlder按Shift+Command+G快捷键快速进入。
    如我的SDK目录是/Users/caochang/Library/Android/sdk。进入tool文件夹打开monitor分析工具。如果是Eclipse的话可以直接打开DDMS

  • 手机连接电脑打开USB调试,可以通过adb devices命令查看是否连接上,如果连接不成功可以试试adb kill-server然后adb start-server。

  • 手机连接上后选中要看当前页面视图的进程名,如下图选中的当前测试的APP,点击圈中的图标中间就会显示当前顶层Activity视图如下:

     
    Monitor主界面
  • 手机发个红包然后查看视图如下,我们可以找到id和text:

     
    微信群聊收到红包UI
  • 同理我们点击红包,进入红包弹框,可以找到点击拆的ID如图:

 
拆红包弹框UI

代码实现

本例子使用到了'com.github.xbdcc:Cutils:0.0.10'中的一些工具类,代码用Code Style-Kotlin格式化过。

  • 首先我们在自己写的继承AccessibilityService类实现的onAccessibilityEvent方法里面判断当前是通知还是界面还是内容改变了:
        when (event.eventType) {
AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED -> {
LogUtils.d("通知改变:$event")
}
AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED -> {
LogUtils.d("界面改变:$event")
openRedEnvelope(event)
}
AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED -> {
LogUtils.d("内容改变:$event")
clickRedEnvelope()
}
}
  • 找到相关的Activity类名和id或者text代码:
    private val WECHAT_PACKAGE = "com.tencent.mm"
private val WECHAT_LUCKYMONEY_ACTIVITY =
"$WECHAT_PACKAGE.plugin.luckymoney.ui.LuckyMoneyNotHookReceiveUI" //微信红包弹框 private val RED_ENVELOPE_FLAG_ID = "com.tencent.mm:id/aq7" //聊天页面区分红包id
private val RED_ENVELOPE_ID = "com.tencent.mm:id/aou" //聊天页面红包点击框控件id
private val RED_ENVELOPE_OPEN_ID = "com.tencent.mm:id/cyf" //抢红包页面点开控件id
  • 发现红包点击红包代码:
    private fun clickRedEnvelope() {
//如果没找到红包就不继续往下执行
if (!AccessibilityServiceUtils.isExistElementById(
RED_ENVELOPE_FLAG_ID,
rootInActiveWindow
)
) return
//点击红包
AccessibilityServiceUtils.findAndClickOneById(RED_ENVELOPE_ID, rootInActiveWindow)
}
  • 出现红包弹框页面拆开红包代码:
    private fun openRedEnvelope(event: AccessibilityEvent) {
//如果当前页面不是微信红包弹出框则不继续往下执行
if (WECHAT_LUCKYMONEY_ACTIVITY != event.className) return
AccessibilityServiceUtils.findAndClickOneById(RED_ENVELOPE_OPEN_ID, rootInActiveWindow)
}

测试效果

 
测试Gif

结语

以上就是实现微信自动抢红包的简单demo,你还可以做些优化做监听通知监听页面判断抢红包,以及延迟点击过滤口令,判断红包是否已抢等。

Demo完整代码地址

https://github.com/xbdcc/GrabRedEnvelope/tree/2.0.1/demo

抢红包APP下载地址:

http://xbdcc.cn/GrabRedEnvelope/index.html

Android通过辅助功能实现抢微信红包原理简单介绍的更多相关文章

  1. Python+Appium实现自动抢微信红包

    前言 过年的时候总是少不了红包,不知从何时开始微信红包横空出世,对于网速和手速慢的人只能在一旁观望,做为python的学习者就是要运用编程解决生活和工作上的事情. 于是我用python解决我们的手速问 ...

  2. LDAP服务器的概念和原理简单介绍

    LDAP服务器的概念和原理简单介绍 1. 目录服务 目录是一个为查询.浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好象Linux/Unix系统中的文件目录一样.目录数据库和关系数据库不 ...

  3. Android Design Support Library 中控件的使用简单介绍(一)

    Android Design Support Library 中控件的使用简单介绍(一) 介绍 在这个 Lib 中主要包含了 8 个新的 material design 组件!最低支持 Android ...

  4. Docker系列之原理简单介绍

    目录 1.1.Docker架构简介 1.2.Docker 两个主要部件 1.3.虚拟机和Docker对比: 1.4.Docker内部结构 Docker系列之原理简单介绍 @ Docker是一个开源的应 ...

  5. Android开发自学笔记(Android Studio)—4.界面编程与View组件简单介绍

    一.引言 Android应用开发最重要的一份内容就是界面的开发,无论你程序包含的内容多么优秀,如若没有一个良好的用户交互界面,最终也只是会被用户所遗弃.Android SDK提供了大量功能丰富的UI组 ...

  6. CAS单点登录原理简单介绍

    1. SSO简介 1.1 单点登录定义 单点登录(Single sign on),英文名称缩写SSO,SSO的意思就是在多系统的环境中,登录单方系统,就可以在不用再次登录的情况下访问相关受信任的系统. ...

  7. dubbo学习过程、使用经验分享及实现原理简单介绍

    一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...

  8. 【Dubbo基础】dubbo学习过程、使用经验分享及实现原理简单介绍

    一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...

  9. 快过年了,如何使用 AutoJS 自动化快速抢微信红包!

    快过年了,群里一般会充斥着各种红包,你抢红包的手速怎么样呢?AutoJS 是一款 Android 端的应用软件,它可以基于无障碍服务主动或基于任务,完成一系列自动化操作 官网:https://pro. ...

随机推荐

  1. SpringBoot从入门到精通二(SpringBoot整合myBatis的两种方式)

    前言 通过上一章的学习,我们已经对SpringBoot有简单的入门,接下来我们深入学习一下SpringBoot,我们知道任何一个网站的数据大多数都是动态的,也就是说数据是从数据库提取出来的,而非静态数 ...

  2. Scala 学习之路(十一)—— 模式匹配

    一.模式匹配 Scala支持模式匹配机制,可以代替swith语句.执行类型检查.以及支持析构表达式等. 1.1 更好的swith Scala不支持swith,可以使用模式匹配match...case语 ...

  3. Confluence迁移

    本次操作系统版本Centos7.3,Confluence版本5.9.9. 一.数据迁移 1.在旧Confluence上打包 “confluence和confluence-data”整个目录,默认安装的 ...

  4. Input标签中Type的类型及详细用法

    Input表示Form表单中的一种输入对象,其又随Type类型的不同而分文本输入框,密码输入框,单选/复选框,提交/重置按钮等,下面一一介绍.1,type=text输入类型是text,这是我们见的最多 ...

  5. 使用Minikube部署本地Kubernetes集群(二十八)

    前言 使用Minikube部署本地k8s集群相对比较简单,非常推荐将其用于本地k8s开发环境,唯一麻烦点的仅仅是网络问题. 在本篇教程中,我们使用了国内的镜像来完成本地k8s集群的搭建.如果搭建过程中 ...

  6. POI 身份证号码 手机号 日期值的处理方式

    private static SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); ...

  7. lambda匿名函数和他的小伙伴(处理大量数据的时候用到)

    lambda匿名函数 主要是为了解决一些简单的需求而设计的一句话函数 #计算n的n次方 def func(n): return n**n f = lambda n : n ** n 语法: 函数名 = ...

  8. C++20 的 Modules

    最近看了两篇关于 C++ 20 Modules 很有意思的文章,戳: <Understanding C++ Modules: Part 1: Hello Modules, and Module ...

  9. HTML连载22-序选择器(下)

    一.子元素选择器 1. (1)选中标签之中只有一个子元素的子元素,并且那个标签必须使我们格式中前面指定的标签才行 (2)格式: 标签:only-chirld{属性:值:} (3)举例: p:only- ...

  10. Java基础之回味finally

    平时大家try…catch…finally语句用的不少,知道finally块一定会在try…catch..执行结束时执行,但是具体是在什么时候执行呢,今天我们一起来看下. public static ...