微信自动抢红包

来源:互联网 发布:2016西决g6知乎 编辑:程序博客网 时间:2024/04/30 00:53


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




1 0