>阅读原文:https://www.jianshu.com/p/5a44b6eaba20
快到年底了,又到了拼手速抢红包的时候了;其实很早之前就做过抢红包软件了,包括QQ和微信;但是大家都懂的,自己一个月前写的代码现在看起来都像是一坨shit一样;所以自己开始重新写一个抢红包的软件(其实是因为实在是太简单了),只做微信,因为QQ发红包的确用的太少了,而且QQ红包花样也太多了,什么唱歌、画画、成语接龙...
## 目标
1. 快,天下武功无坚不摧、唯快不破,肯定要比人的手速快
2. 准,只要你手机解锁了,在任意一个界面都可以快速抢到红包
3. 狠,其实狠不狠没什么关系了,最重要的是全自动,自己不用任何操作,不然怎么解放双手
4. 稳,肯定要能一直抢红包,来一个抢一个,来两个抢两个,抢红包一时爽,一直抢一直爽;
## 手机配置要求
1. Android系统 7.0及以上,辅助功能7.0以上支持模拟点击,模拟点击不是必须的,但是对于实现**快**很重要
2. 手机不能太垃圾了,手机慢有外挂也发挥不出来呀
## 实现原理
实现方法就是利用Android辅助功能,开启辅助功能相当于开启了一个服务,在手机界面改变的时候,就能监听到该页面的一些信息并且能拿到界面的一些控件,然后可以对控件进行模拟点击,从而实现我们想要的功能。
除此以外,不仅能够对获取到的控件进行模拟点击,在Android7.0及以上的版本,我们可以模拟任意位置的点击包括触摸、滑动等等,就是说我们可以实现任何**人能够进行的操作**,这个是很有用的,可以做出很多有意思的东西,如果再配上截图、录屏和图像识别,就更有意思了。
模拟点击,就是说我们的手机界面自己动,整个流程像是一只手在帮你操作一样的;其实我见过更牛逼的方法,连解锁都不需要直接就领了红包,界面没有任何变化的;感觉上是通过通信,发数据给微信服务器实现的,当然这种是需要root权限的,并且得去解析微信的通信协议,我自然没时间去搞(其实有时间也不一定能搞出来)。
## 具体实现
### 辅助功能
首先是辅助功能,新建一个**Service**继承**AccessibilityService**
```java
public class LuckMoneyService extends AccessibilityService
```
然后去**AndroidManifest**文件里面去注册一下这个Service
```xml
<service
android:name=".service.LuckMoneyService"
android:label="小圆脸的红包助手"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessible_service_wx_config" />
</service>
```
在`meta-data`节点下有个`resource`值,这是个xml文件,里面配置了该辅助的一些信息,在res目录下新建一个文件夹,名字叫xml,然后新建一个xml文件,名字和`resource`配置的一样就行了
```xml
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeWindowStateChanged|typeWindowContentChanged|typeNotificationStateChanged"
android:accessibilityFeedbackType="feedbackAllMask"
android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows|flagIncludeNotImportantViews|flagReportViewIds"
android:canRetrieveWindowContent="true"
android:canRequestFilterKeyEvents="true"
android:description="@string/wx_luck_money"
android:canRequestEnhancedWebAccessibility="true"
android:notificationTimeout="20"
android:packageNames="com.tencent.mm"
android:canPerformGestures="true" />
```
里面配置了一些参数,比如`notificationTimeout`是指定多少毫秒监听一次界面变化的,`packageNames`是指定监听哪个应用的,删掉这个配置就是监听全局,**建议一定要删除掉**,我这里只是展示用,`description`是对于该辅助的描述,其他配置不管也罢。
然后在LuckMoneyService里面重写一下onAccessibilityEvent方法
```java
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
//界面发生了变化
}
```
每当界面改变的时候就会回调这个方法,通过`event`我们就可以获取到界面的信息包括界面上的控件
#### 简单的用法
```java
//获取当前界面包名
String packageName = event.getPackageName().toString();
//获取当前类名
String className = event.getClassName().toString();
//获取当前界面父布局的控件
AccessibilityNodeInfo accessibilityNodeInfo = getRootInActiveWindow();
//在父布局里面根据子控件**显示的文字**找到该子控件
List<AccessibilityNodeInfo> nodeInfoList = accessibilityNodeInfo.findAccessibilityNodeInfosByText(text);
//在父布局里面根据子控件的**id**找到该子控件
List<AccessibilityNodeInfo> nodeInfoList = accessibilityNodeInfo.findAccessibilityNodeInfosByViewId(id);
//点击该控件
nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);
```
上面的操作都比较基础,根据控件显示的文字查找控件,找出来的肯定是TextView和Button了,根据ID查找控件,ID就是指的写布局文件的时候设置的控件的ID
#### 模拟触摸
模拟触摸就是可以模拟人的触摸动作,也比较简单
```java
protected void gestureOnScreen(Path path, long startTime, long duration,
AccessibilityService.GestureResultCallback callback) {
GestureDescription.Builder builde = new GestureDescription.Builder();
builde.addStroke(new GestureDescription.StrokeDescription(path, startTime, duration));
GestureDescription gestureDescription = builde.build();
dispatchGesture(gestureDescription, callback, null);
}
```
可以看到需要传入`path`就是一个路径嘛,模拟滑动的路径,用canvas画过画的都知道这东西还是比较简单的,不清楚也没关系,继续看,`startTime`就是多久后开始模拟事件,`duration`就是该滑动的时间,其他回调什么的为空就可以了;
辅助功能能做的东西大概就上面这些了,接下来看看
### 微信应用外的红包处理
首先实现在微信界面外怎么抢红包,在微信界面外有红包出现必然会在通知栏会显示微信红包(如果没开通知消息,那你自己开一下不就完事了吗),只需要在回调方法里面判断一下是不是通知消息,如果是通知消息,获取里面的信息,判断是不是微信红包通知消息,是就点击该消息,会自动跳转到聊天界面;
因为我们是监听界面变化来实现功能的,所以在一个界面触发了界面变化的时候,接下来的处理就应该交给下一个界面的方法了,所以微信界面外的操作就是这些了
```java
/**
* 红包标识字段
*/
public static final String HONG_BAO_TXT = "[微信红包]";
//通知栏消息,判断是不是红包消息
if (event.getParcelableData() != null && event.getParcelableData() instanceof Notification) {
Notification notification = (Notification) event.getParcelableData();
//获取通知消息详情
String content = notification.tickerText.toString();
//解析消息
String[] msg = content.split(":");
String text = msg[1].trim();
if (text.contains(HONG_BAO_TXT)) {
PendingIntent pendingIntent = notification.contentIntent;
try {
//点击消息,进入聊天界面
土豆片片
- 粉丝: 1856
- 资源: 5869
最新资源
- 大英赛冲奖必备资料,包含作文,单词等等
- 一种估算光伏功率测量全局水平辐照度的无监督方法
- Multisim更新:振幅调制器+解调器(含仿真程序+文档+原理图+PCB)
- 基于PLC的立体车库的设计,西门子S7-1200PLC程序及组态仿真,电路图,IO表,博途15.1
- Java毕设项目:基于spring+mybatis+maven+mysql实现的资源共享平台【含源码+数据库+毕业论文】
- 基于WebRTC的P2P在线媒体流传输与监控设计源码
- 基于Python的pygtide模块:地球引力潮计算设计源码
- 基于JavaScript的物流管理系统设计与源码分享
- 基于Qt5框架的LinpopLanIM局域网即时通讯软件设计源码
- UFS 3.0相关原文档
- 基于Vue框架的服装商店网页设计源码
- 基于Java语言开发的CRM项目源码设计
- IMG_20250105_001134.jpg
- 计算机前端后端数据库八股文笔记,涵盖编程语言、数据结构、算法、设计模式等基础知识
- 基于微信小程序的4S店服务预约与管理小程序设计源码
- IMG_20250105_001151.jpg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈