关闭

当前位置:首页 > 微信抢红包 » 正文

「捕鱼游戏」微信抢红包插件示例代码及其实现原理

这个Android插件可以帮助你在微信群聊抢红包时战无不胜。当检测到红包时,插件会自动点击屏幕,人工点击的速度无法比拟。

你正在查看的是dev分支,这个分支包含大量实验性的修改,不再更新。如果你希望有一个可以立即使用的插件请切换到stable分支

注: stable分支的插件只点击最新的红包,根据目前测试抢红包成功率100%。dev分支在stable分支的基础上尝试了大量修改和优化,能使用但无法保证稳定性。

下面的文档仅针对dev分支

预期特性

可以抢屏幕上显示的所有红包,同类插件往往只能获取最新的一个红包。

智能跳过已经戳过的红包,避免频繁点击影响正常使用。

红包日志 (默认未开启),方便查看抢过的红包内容。

性能优化,感受不到插件的存在,可一直后台开启,不影响日常聊天。

由于这是一份教学代码,项目的文档和注释都比较完整,代码适合阅读。

实现原理 1. 抢红包流程的逻辑控制

这个插件通过一个Stage类来记录当前对应的阶段。Stage类被设计成单例并惰性实例化,因为一个Service不需要也不应该处在不同的阶段。对外暴露阶段常量和entering和getCurrentStage两个方法,分别记录和获取当前的阶段。

public class Stage { private static Stage stageInstance; public static final int FETCHING_STAGE = 0, OPENING_STAGE = 1, FETCHED_STAGE = 2, OPENED_STAGE = 3; private int currentStage = FETCHED_STAGE; private Stage() {} public static Stage getInstance() { if (stageInstance == null) stageInstance = new Stage(); return stageInstance; } public void entering(int _stage) { stageInstance.currentStage = _stage; } public int getCurrentStage() { return stageInstance.currentStage; } }

1.1 阶段说明 阶段 说明
FETCHING_STAGE   正在读取屏幕上的红包,此时不应有别的操作  
FETCHED_STAGE   已经结束一个FETCH阶段,屏幕上的红包都已加入待抢队列  
OPENING_STAGE   正在拆红包,此时不应有别的操作  
OPENED_STAGE   红包成功抢到,进入红包详情页面  

1.程序以FETCHED_STAGE 开始,将屏幕上的红包加入待抢队列:

--> FETCHED_STAGE --> FETCHING_STAGE --> FETCHED_STAGE -->

2.处理待抢队列中的红包:

--> [CLICK] --> OPENING_STAGE --> [CLICK] --> OPENED_STAGE --> [BACK] --> FETCHED_STAGE -->(抢到) --> [CLICK] --> OPENING_STAGE --> [BACK] --> FETCHED_STAGE -->(没抢到)

3.不断重复流程1和2

1.2 根据阶段选择不同的入口

在每次窗体状态发生变化后,根据当前所在的阶段选择入口。

switch (Stage.getInstance().getCurrentStage()) { case Stage.OPENING_STAGE: // ....... Stage.getInstance().entering(Stage.FETCHED_STAGE); performGlobalAction(GLOBAL_ACTION_BACK); break; case Stage.OPENED_STAGE: Stage.getInstance().entering(Stage.FETCHED_STAGE); performGlobalAction(GLOBAL_ACTION_BACK); break; case Stage.FETCHED_STAGE: if (nodesToFetch.size() > 0) { AccessibilityNodeInfo node = nodesToFetch.remove(nodesToFetch.size() - 1); if (node.getParent() != null) { // ....... Stage.getInstance().entering(Stage.OPENING_STAGE); node.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK); } return; } Stage.getInstance().entering(Stage.FETCHING_STAGE); fetchHongbao(nodeInfo); Stage.getInstance().entering(Stage.FETCHED_STAGE); break; }

2. 屏幕内容检测和自动化点击的实现

和其他插件一样,这里使用的是Android API提供的AccessibilityService。这个类位于android.accessibilityservice包内,该包中的类用于开发无障碍服务,提供代替或增强的用户反馈。

AccessibilityService 服务在后台运行,等待系统在发生 AccessibilityEvent 事件时回调。这些事件指的是用户界面上发生的状态变化, 比如焦点变更、按钮按下等等。服务可以请求“查询当前窗口中内容”的能力。 开发辅助服务需要继承该类并实现其抽象方法。

2.1 配置AccessibilityService

在这个例子中,我们需要监听的事件是当红包来或者滑动屏幕时引起的屏幕内容变化,和点开红包时窗体状态的变化,因此我们只需要在配置XML的accessibility-service标签中加入一条

android:accessibilityEventTypes="typeWindowStateChanged|typeWindowContentChanged"

或在onAccessibilityEvent回调函数中对事件进行一次类型判断

final int eventType = event.getEventType(); if (eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED || eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) { // ... }

除此之外,由于我们只监听微信,还需要指定微信的包名

android:packageNames="com.tencent.mm"

为了获取窗口内容,我们还需要指定

android:canRetrieveWindowContent="true"

其他配置请看代码。

2.2 获取红包所在的节点

首先,我们要获取当前屏幕的根节点,下面两种方式效果是相同的:

AccessibilityNodeInfo nodeInfo = event.getSource(); AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();

上一篇:「扫雷」微信抢红包变赌场疯狂卷钱 庄家躲监管花样翻新
下一篇:「微信抢红包」微信竟有破解版:自动抢红包 查看撤回消息
说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!

猜你喜欢


二维码