使用AccessibilityService实现微信自动抢红包

最近要实现微信自动抢红包的功能,使用AccessibilityService来开发,这里主要写一下逻辑以及注意点。

注意点

1、搜索关键字

我们实现某个功能比如点击等需要找到对应的对象然后模拟点击事件,所以首先就是怎么样找到对象,下面说三种方式:

(1)findAccessibilityNodeInfosByText通过文字来实现查找,返回的是List<AccessibilityNodeInfo>,所以需要通过for循环来具体判断需要的关键字的对象

(2)findAccessibilityNodeInfosByViewId通过控件的id来查询,返回的是List<AccessibilityNodeInfo>,虽然也是返回List但是一般只有一个,查找的准确性高,不过需要系统的版本API>=18

 (3)搭配findAccessibilityNodeInfosByText来查找,在微信中使用uiautomatorviewer查看布局,发现不同的手机相同的控件id是不一样的,比如我们需要查询获取红包的数量时,需要先查找'元',然后获取其父控件,然后查找金额所在的位置,这个是不变的。

2、对于返回功能

一般我们领取红包后进入红包详情界面,这时我们要返回到聊天界面使用uiautomatorviewer查看返回箭头,查看其属性他的clickable=false这样的话我们就无法通过

accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);来实现点击事件来实现返回的功能,不过查看AccessibilityService源码里面有对应的全局事件,下面说两种实现返回功能的方法
(1)查找界面上对应的返回按钮然后通过AccessibilityNodeInfo的
performAction(AccessibilityNodeInfo.ACTION_CLICK)实现点击,不过在操作之前先判断一下isCheckable()如果是false则无法实现其功能

(2)使用AccessibilityService的performGlobalAction的方法,介绍如下:
/**
     * Performs a global action. Such an action can be performed
     * at any moment regardless of the current application or user
     * location in that application. For example going back, going
     * home, opening recents, etc.
     *
     * @param action The action to perform.
     * @return Whether the action was successfully performed.
     *
     * @see #GLOBAL_ACTION_BACK
     * @see #GLOBAL_ACTION_HOME
     * @see #GLOBAL_ACTION_NOTIFICATIONS
     * @see #GLOBAL_ACTION_RECENTS
     */
    public final boolean performGlobalAction(int action) {
        IAccessibilityServiceConnection connection =
            AccessibilityInteractionClient.getInstance().getConnection(mConnectionId);
        if (connection != null) {
            try {
                return connection.performGlobalAction(action);
            } catch (RemoteException re) {
                Log.w(LOG_TAG, "Error while calling performGlobalAction", re);
            }
        }
        return false;
    }
所以要实现返回功能只需要调用performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);,当然如果想实现Home,通知,最近的应用换成对应的action就可以了

3、涉及微信界面的类

 /**
     * 微信的包名
     */
    static final String WECHAT_PACKAGENAME = "com.tencent.mm";
    /**
     * 拆红包类
     */
    static final String WECHAT_RECEIVER_CALSS = "com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI";
    /**
     * 红包详情类
     */
    static final String WECHAT_DETAIL = "com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI";
    /**
     * 微信主界面或者是聊天界面
     */
    static final String WECHAT_LAUNCHER = "com.tencent.mm.ui.LauncherUI";
这里需要注意的是WECHAT_LAUNCHER,微信主界面以及聊天界面应该采用的FragmentActivity+Fragment这样导致如果用户进入到微信主界面则会调用AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED,导致再次进入微信聊天界面不会再调用AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED,而会调用AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED,而AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED只要内容改变后都会调用,所以一般是使用AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED来作为监测事件的,所以解决这个问题的方式就是加入判断条件:
(1)触发AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED这个事件搜索列表界面是否有"领取红包"字样,如果没有则设置一个变量
(2)如果没有触发AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED而触发了AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED,则去判断之前设置的变量综合来判断

4、增加红包获取量避免重复金额

在聊天界面的红包虽然会有"领取红包"的字样,但是其实是已经拆过的,判断的标识就是是否有"拆红包",如果有拆红包则计算对应详情中的金额。

5、如何循环查询所有的子控件

/**
     * @param info 当前节点
     * @param matchFlag 需要匹配的文字
     * @param type  操作的类型
     */
    public void recycle(AccessibilityNodeInfo info, String matchFlag, int type) {
        if (info != null) {
            if (info.getChildCount() == 0) {
                CharSequence desrc = info.getContentDescription();
                switch (type) {
                    case ENVELOPE_RETURN://返回
                        if (desrc != null && matchFlag.equals(info.getContentDescription().toString().trim())) {
                            if (info.isCheckable()) {
                                info.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                            } else {
                                performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
                            }
                        }
                        break;
                }
            } else {
                int size = info.getChildCount();
                for (int i = 0; i < size; i++) {
                    AccessibilityNodeInfo childInfo = info.getChild(i);
                    if (childInfo != null) {
                        Log.e(TAG, "index: " + i + " info" + childInfo.getClassName() + " : " + childInfo.getContentDescription()+" : "+info.getText());
                        recycle(childInfo, matchFlag, type);
                    }
                }
            }
        }
    }
网上关于抢红包的源码比较多,由于其他原因我们这里的不会公布,可以根据网上的源码进行修改,能够实现功能:
(1)截取通知栏中有[微信红包]字样的通知,然后跳到微信红包界面
(2)进入群聊界面会自动查询当前界面所有"领取红包",然后循环点击查找增加红包的概率
(3)准确的保存领取的红包金额和日期


  • 18
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
### 回答1: Python 微信自动抢红包是指使用Python编程语言编写一个程序,可以自动检测并抢夺微信红包。下面我将简要介绍实现此功能的一种方法: 首先,我们需要使用Python中的自动化测试工具,例如Appium或PyAutoGUI,来模拟用户在微信中的操作。这些工具可以帮助我们自动化模拟用户的点击、滑动等操作。 其次,我们需要使用Python中的图像处理库,例如OpenCV,来识别微信红包页面。我们可以通过分析红包页面的特征,例如红包图标、文字提示等,来判断红包是否出现。 一旦检测到红包出现,我们就可以使用自动化测试工具模拟点击红包,并进入红包详情页面。在该页面,我们可以使用相同的方法判断红包是否已经被抢过。 如果红包尚未被抢过,我们可以模拟点击打开红包。如果红包已被抢过,则可以返回上一页,继续检测下一个红包。 需要注意的是,为了避免被微信检测出异常行为,我们应该设置一定的点击间隔,并在每次点击后进行适当的休眠。此外,我们还应该注意不要频繁的点击红包,以免引起他人的不适或麻烦。 总结起来,Python可以通过自动化测试工具和图像处理库实现微信自动抢红包的功能。当然,红包的识别和抢夺是一个复杂的过程,需要考虑到各种情况的处理。以上只是一种简要的实现思路,具体的代码编写需要根据实际情况进行调整和完善。 ### 回答2: Python 可以通过调用微信的接口来实现自动抢红包功能。首先,我们需要安装一些必要的库,如itchat、time、random等。然后,我们可以使用itchat库来登录微信,并注册好相应的消息处理函数。 当收到红包消息时,我们可以在消息处理函数中编写相应的逻辑来自动抢红包。通过itchat获取红包的发送者、红包的金额等信息,并编写自动点击红包、输入口令等操作的代码。可以使用模拟点击的方式来点击屏幕上的红包图标,并模拟输入口令等操作来自动领取红包。 为了避免被封号或者频繁出现验证码等问题,我们可以在代码中加入一些延时操作、随机等待时间,并合理设置红包的打开速度。同时,为了提高代码的稳定性和可靠性,可以加入异常处理机制来处理各种异常情况。 在实际使用中,我们还可以结合一些其他技术,如图像处理、OCR识别等来提高自动抢红包的成功率。例如,可以使用图像处理技术来识别屏幕上的红包图标,并自动点击红包。也可以使用OCR识别技术来自动识别红包口令并自动输入。 需要注意的是,使用Python自动抢红包属于一种自动化行为,可能涉及到一些法律和道德问题。在进行相关操作前,请务必了解相关规定,并确保自己的行为符合法律法规和道德规范。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值