简书文章: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. 29 z-index

    这个东西非常简单,它有四大特性,每个特性你记住了,页面布局就不会出现找不到盒子的情况. z-index 值表示谁压着谁,数值大的压盖住数值小的, 只有定位了的元素,才能有z-index,也就是说,不管 ...

  2. 这个注解一次搞定限流与熔断降级:@SentinelResource

    在之前的<使用Sentinel实现接口限流>一文中,我们仅依靠引入Spring Cloud Alibaba对Sentinel的整合封装spring-cloud-starter-alibab ...

  3. spark 源码分析之四 -- TaskScheduler的创建和启动过程

    在 spark 源码分析之二 -- SparkContext 的初始化过程 中,第 14 步 和 16 步分别描述了 TaskScheduler的 初始化 和 启动过程. 话分两头,先说 TaskSc ...

  4. 【】input中 type=number 去掉箭头

    css中设置: input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { -webkit-appearance: non ...

  5. Oracle常用的一些 数据字典 转https://www.cnblogs.com/neozhu/archive/2008/07/22/1248422.html

    Oracle常用数据字典表   Oracle常用数据字典表      查看当前用户的缺省表空间 SQL>select username,default_tablespace from user_ ...

  6. 【POJ - 3669】Meteor Shower(bfs)

    -->Meteor Shower Descriptions: Bessie听说有场史无前例的流星雨即将来临:有谶言:陨星将落,徒留灰烬.为保生机,她誓将找寻安全之所(永避星坠之地).目前她正在平 ...

  7. Mybatis__模糊查询

    在一个Web工程中,查询功能几乎都要用到姓名模糊查询,,虽然学号,工号等可以最准确最快的定位,但如果清楚信息到连学号,工号都一个数不差,应该也没必要去查询了. 故需要用到一下语句实现模糊查询: sel ...

  8. Python解题技巧

    Python解题技巧 一直都是用C++和C解题,某题简单解完后便心血来潮想用Python解一次,发现一些问题,特写此篇随笔来记录. 一. 输入格式: 例:输入第1行给出正整数n和整数m:第2行给出n个 ...

  9. Python选修第00次作业:缘分

    先说一说我与Python的缘分吧.初识Python,是在高三上学期.从那位同学那里经过时,看到了他桌子上的一本书——<和小卡特一起学Python>,封面就很吸引人,便买来一本,累了不想做题 ...

  10. HTML表单部分学习笔记

    第一部分: <!-- action :指定处理提交表单的格式 method :指定提交表单的http方法 enctype:指明用来把表单提交给服务器时的互联网媒体形式 --> <fo ...