Android通过辅助功能实现抢微信红包原理简单介绍
简书文章: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如图:

代码实现
本例子使用到了'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)
}
测试效果

结语
以上就是实现微信自动抢红包的简单demo,你还可以做些优化做监听通知监听页面判断抢红包,以及延迟点击过滤口令,判断红包是否已抢等。
Demo完整代码地址
https://github.com/xbdcc/GrabRedEnvelope/tree/2.0.1/demo
抢红包APP下载地址:
http://xbdcc.cn/GrabRedEnvelope/index.html
Android通过辅助功能实现抢微信红包原理简单介绍的更多相关文章
- Python+Appium实现自动抢微信红包
前言 过年的时候总是少不了红包,不知从何时开始微信红包横空出世,对于网速和手速慢的人只能在一旁观望,做为python的学习者就是要运用编程解决生活和工作上的事情. 于是我用python解决我们的手速问 ...
- LDAP服务器的概念和原理简单介绍
LDAP服务器的概念和原理简单介绍 1. 目录服务 目录是一个为查询.浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好象Linux/Unix系统中的文件目录一样.目录数据库和关系数据库不 ...
- Android Design Support Library 中控件的使用简单介绍(一)
Android Design Support Library 中控件的使用简单介绍(一) 介绍 在这个 Lib 中主要包含了 8 个新的 material design 组件!最低支持 Android ...
- Docker系列之原理简单介绍
目录 1.1.Docker架构简介 1.2.Docker 两个主要部件 1.3.虚拟机和Docker对比: 1.4.Docker内部结构 Docker系列之原理简单介绍 @ Docker是一个开源的应 ...
- Android开发自学笔记(Android Studio)—4.界面编程与View组件简单介绍
一.引言 Android应用开发最重要的一份内容就是界面的开发,无论你程序包含的内容多么优秀,如若没有一个良好的用户交互界面,最终也只是会被用户所遗弃.Android SDK提供了大量功能丰富的UI组 ...
- CAS单点登录原理简单介绍
1. SSO简介 1.1 单点登录定义 单点登录(Single sign on),英文名称缩写SSO,SSO的意思就是在多系统的环境中,登录单方系统,就可以在不用再次登录的情况下访问相关受信任的系统. ...
- dubbo学习过程、使用经验分享及实现原理简单介绍
一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...
- 【Dubbo基础】dubbo学习过程、使用经验分享及实现原理简单介绍
一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...
- 快过年了,如何使用 AutoJS 自动化快速抢微信红包!
快过年了,群里一般会充斥着各种红包,你抢红包的手速怎么样呢?AutoJS 是一款 Android 端的应用软件,它可以基于无障碍服务主动或基于任务,完成一系列自动化操作 官网:https://pro. ...
随机推荐
- JAVA8之lambda表达式详解
原文:http://blog.csdn.net/jinzhencs/article/details/50748202 lambda表达式详解 一.问题 1.什么是lambda表达式? 2.lambda ...
- Babel是什么?
要是官方文档写得好的话,我也许就不用自己做个笔记. 官方文档 Babel 是一个工具链,主要用于将 ECMAScript 2015+ 版本的代码转换为向后兼容的 JavaScript 语法,以便能够运 ...
- RequestMappingHandlerAdapter和RequestParam原理分析
我们要使用定义了RequestMapping方法或者类是,需要先准备好所需要的参数.如何准备参数,我们应该考虑些上面问题. 都有哪些参数需要绑定? 除了方法确定的参数,还有两个方法的参数需要绑定,那就 ...
- Qemu搭建ARM vexpress开发环境(三)----NFS网络根文件系统
Qemu搭建ARM vexpress开发环境(三)----NFS网络根文件系统 标签(空格分隔): Qemu ARM Linux 经过上一篇<Qemu搭建ARM vexpress开发环境(二)- ...
- Spring Batch 入门级示例教程
Spring Batch 入门级示例教程 我将向您展示如何使用Spring Boot创建一个的Spring Batch的Hello World示例. (循序渐进) 因此,如果您是Spring Batc ...
- 多线程与高并发(三)synchronized关键字
上一篇中学习了线程安全相关的知识,知道了线程安全问题主要来自JMM的设计,集中在主内存和线程的工作内存而导致的内存可见性问题,及重排序导致的问题.上一篇也提到共享数据会出现可见性和竞争现象,如果多线程 ...
- java html中文汉字 反转义
import org.apache.commons.lang.StringEscapeUtils; public class EscapeHtml { /** * @param args */ pub ...
- os.path.join用法
os.path.join()函数:连接两个或更多的路径名组件 1.如果各组件名首字母不包含’/’,则函数会自动加上 2.如果有一个组件是一个绝对路径,则在它之前的所有组件均会被舍弃 3.如果最后一个组 ...
- 3.秋招复习简单整理之List、Map、Set三个接口存取元素时,各有什么特点?
List.Set都是单列元素的集合,它们有共同的父接口Collection. List存取有序可重复元素 存元素:调用add方法,存的元素先来后到,有顺序,当然也可以插队,指定存在某个位置,调用add ...
- 转: windows系统下mysql出现Error 1045(28000) Access Denied for user 'root'@'localhost'
windows系统下mysql出现Error 1045(28000) Access Denied for user 'root'@'localhost' 转自 http://zxy5241.space ...