微信自动抢红包

简介: github地址 :https://github.com/linhaosheng/WeChatHongBao_Master/tree/master 微信自动抢红包,目前只适配了6.3.32版本的,在android studio上导入,运行程序后点击开始检测,如果手机没有开启无障碍服务,则会调到设置页面进行打开无障碍服务,该app主要是用到了AccessibilityService


github地址 :https://github.com/linhaosheng/WeChatHongBao_Master/tree/master


微信自动抢红包,目前只适配了6.3.32版本的,在android studio上导入,运行程序后点击开始检测,如果手机没有开启无障碍服务,则会调到设置页面进行打开无障碍服务,该app主要是用到了AccessibilityService 界面的ui控件的检测使用的是Google自带的uiautomatorviewer。

打开服务后监听三种状态 :

AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED  和 AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED 和 

AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED 具体的代码如下:

switch (eventType) {
    //获取通知栏事件
    case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:
        if (isScreenBlock) {
            wakeLock();
        }
        List<CharSequence> text = event.getText();
        if (!text.isEmpty()) {
            for (CharSequence sequence : text) {
                String message = String.valueOf(sequence);
                if (message.contains("微信红包")) {
                    openNotify(event);
                }
            }
        }
        break;
    case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
        openHongBao(event);
        break;
    case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED:
        findHongBao(event);
        break;
}
当通知栏显示有微信红包是 将触发:

if (event.getParcelableData() == null || !(event.getParcelableData() instanceof Notification)) {
    return;
}
Notification notification = (Notification) event.getParcelableData();
PendingIntent contentIntent = notification.contentIntent;
try {
    contentIntent.send();
} catch (PendingIntent.CanceledException e) {
    e.printStackTrace();
}
进行点击,进入聊天页面后,找到有红包的View进行点击:


System.out.println("evenClass-----" + event.getClassName());
if ("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI".equals(event.getClassName())) {
    // 拆红包界面
    getPacket(this);;
} else if ("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI".equals(event.getClassName())) {
    // 拆完红包后,看红包金额的界面
    getMoney();
} else if ("com.tencent.mm.ui.LauncherUI".equals(event.getClassName())) {
    // 聊天界面
    openPacket(event);
}

点击红包

private void openPacket(AccessibilityEvent event) {
    System.out.println("openPacket----");
    AccessibilityNodeInfo rootInActiveWindow = getRootInActiveWindow();
    if (rootInActiveWindow == null) {
        return;
    }
    List<AccessibilityNodeInfo> listPacket = rootInActiveWindow.findAccessibilityNodeInfosByText("领取红包");
    if (listPacket != null) {
        for (int i = listPacket.size() - 1; i >= 0; i--) {
            AccessibilityNodeInfo parent = listPacket.get(i).getParent();
            if (parent != null) {
                PerformClickUtils.performClick(parent);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (!"com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI".equals(event.getClassName())) {
                    PerformClickUtils.performBack(this);
                    return;
                }
            }
        }
    }

拆红包 :

private void getPacket(AccessibilityService accessibilityService) {
    AccessibilityNodeInfo rootInActiveWindow = getRootInActiveWindow();
    if (rootInActiveWindow == null) {
        return;
    }
    //若出现 “该红包已超过24小时。如已领取,可在“我的红包”中查看" 则直接返回
    List<AccessibilityNodeInfo> back = rootInActiveWindow.findAccessibilityNodeInfosByViewId(hongbao_expire);
    if (back != null) {
        List<AccessibilityNodeInfo> nodeInfoId = rootInActiveWindow.findAccessibilityNodeInfosByViewId(hongbao_expire_close);  //关闭ID
        if (nodeInfoId != null && !nodeInfoId.isEmpty()) {
            PerformClickUtils.findViewIdAndClick(this, hongbao_expire_close);
        } else {
            PerformClickUtils.performBack(this);
        }
        PerformClickUtils.findTextAndClick(this, "聊天信息");
    }
    List<AccessibilityNodeInfo> hongbao = rootInActiveWindow.findAccessibilityNodeInfosByText("拆红包");
    if (hongbao != null && !hongbao.isEmpty()) {
        PerformClickUtils.findTextAndClick(accessibilityService, "拆红包");
    } else {
        List<AccessibilityNodeInfo> accessibilityNodeInfosByViewId = rootInActiveWindow.findAccessibilityNodeInfosByViewId(hongbao_open);//开红包的ID
        if (accessibilityNodeInfosByViewId != null && !accessibilityNodeInfosByViewId.isEmpty()) {
            PerformClickUtils.findViewIdAndClick(this, hongbao_open);
        }
    }
}

获取红包的金额

private void getMoney() {
    //获取当前时间
    date = new Date(System.currentTimeMillis());
    String time = dateFormat.format(date);
    Money money = new Money();
    money.setTime(time);
    System.out.println("time--" + time);
    AccessibilityNodeInfo rootInActiveWindow = getRootInActiveWindow();
    if (rootInActiveWindow == null) {
        return;
    }
    //获取钱包来源
    List<AccessibilityNodeInfo> accessibilityNodeInfosResource = rootInActiveWindow.findAccessibilityNodeInfosByViewId(hongbao_resource);
    if (accessibilityNodeInfosResource != null && accessibilityNodeInfosResource.size() > 0) {
        if (accessibilityNodeInfosResource.get(0) != null) {
            resource = accessibilityNodeInfosResource.get(0).getText().toString();
            money.setResource(resource);
        }
    }
    //获取钱包金额
    List<AccessibilityNodeInfo> accessibilityNodeInfosNumber = rootInActiveWindow.findAccessibilityNodeInfosByViewId(hongbao_number);
    if (accessibilityNodeInfosNumber != null && !accessibilityNodeInfosNumber.isEmpty()) {
        if (accessibilityNodeInfosNumber.get(0) != null) {
            number = accessibilityNodeInfosNumber.get(0).getText().toString();
            money.setMoney(number);
        }
    }
    System.out.println("money----" + money.getMoney());
    String objValue = Preferences.setObject(money);
    moneys.add(objValue);
    //点击返回按钮
    List<AccessibilityNodeInfo> back = rootInActiveWindow.findAccessibilityNodeInfosByText("返回");
    if (back != null) {
        PerformClickUtils.findTextAndClick(this, "返回");
    } else {
        PerformClickUtils.performBack(this);
    }
    PerformClickUtils.findTextAndClick(this, "聊天信息");
}



详细代码在github上,欢迎start和fork




目录
相关文章
|
3月前
|
测试技术
软件测试用例设计之微信群抢红包经典用例
作者在浏览招聘网站时遇到为微信群发和抢红包设计测试用例的问题,作为软件测试新手,作者通过实际体验并撰写测试案例来加深对业务的理解,并分享了测试案例表格。需要注意的是,该用例未考虑添加银行卡支付、红包类型选择及红包描述。
100 5
软件测试用例设计之微信群抢红包经典用例
|
3月前
|
算法 JavaScript 前端开发
切西瓜法实现微信抢红包功能
该文章介绍了使用“切西瓜法”和“栅栏法”两种算法来模拟微信抢红包的随机分配机制,并通过具体的JavaScript代码实现了红包金额的公平随机分配过程。
切西瓜法实现微信抢红包功能
|
7月前
|
NoSQL 算法 关系型数据库
Redis系列-16.腾讯经典面试题-如何做一个迷你版的微信抢红包呢?
Redis系列-16.腾讯经典面试题-如何做一个迷你版的微信抢红包呢?
157 0
|
算法 前端开发 JavaScript
【青训营】- 切西瓜法实现微信抢红包功能
那在下面的文章中呢,我们将来实现一个微信红包相关的分红包功能。一起来了解叭~
【青训营】- 切西瓜法实现微信抢红包功能
|
算法
为啥春节抢红包总不是手气最佳?看完微信抢红包算法你就明白了!
春节必不可少的活动就是抢红包啦,从以前的纸质红包到现在互联网红包(以微信红包为首),今天我们就来分析一下抢红包的算法,其中有一些是微信红包的算法,看完你就知道手气最佳是如何产生的啦!
471 0
为啥春节抢红包总不是手气最佳?看完微信抢红包算法你就明白了!
|
安全 算法
微信“抢红包”迅速火热:不费腾讯“一兵一卒”
随着5.2版微信在春节前的1月25日晚悄然上线,“抢红包”的小游戏迅速盖过“打飞机”,成为时下拇指族中最火的活动。 与投入数亿元、借嘀嘀打车等来培育用户习惯不同,微信红包几乎不费腾讯一兵一卒,就让用户在自娱自乐的同时,轻轻松松地“交出”了银行储蓄卡、加入了微信支付的大军。“确实!这种工具性的产品用社交的方法推广起来事半功倍。”一名腾讯内部人士感慨。
231 0
微信“抢红包”迅速火热:不费腾讯“一兵一卒”
微信抢红包小程序开发
        现在为大家介绍一款抢红包的微信小程序,叫做“红包店”并且觉得,其中应该蕴含着很大的商业价值,所以就想着介绍给大家 也许有人会问:什么是红包店啊?怎么抢红包啊?抢的红包怎么用啊?等一些问题,那么听我慢慢道来!        比如,小华在商城某商户买了一根烤肠,在收到5元支付消息的同时(没有时差,完全同步),收到了一条“你有到店红包可抢”的提醒。
5381 0
|
2月前
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
738 7
|
2月前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
770 1
|
2月前
|
小程序 前端开发 测试技术
微信小程序的开发完整流程是什么?
微信小程序的开发完整流程是什么?
160 7