Android微信抢红包服务源码

基于Android AccessibilityService,配套微信7.0.9版本,主要使用控件ID来获取AccessibilityNodeInfo,亲测好用!

RedPacketService.java 实现抢红包功能

package com.example.snatch;import android.accessibilityservice.AccessibilityService;
import android.app.KeyguardManager;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.PowerManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.Toast;import java.util.List;/*** 抢红包Service,继承AccessibilityService*/
public class RedPacketService extends AccessibilityService {/*** 微信几个页面的包名+地址。用于判断在哪个页面* LAUCHER-微信聊天界面* LUCKEY_MONEY_RECEIVER-点击红包弹出的界面* LUCKEY_MONEY_DETAIL-红包领取后的详情界面*/private String LAUCHER = "com.tencent.mm.ui.LauncherUI";private String LUCKEY_MONEY_DETAIL = "com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI";private String LUCKEY_MONEY_RECEIVER = "com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyNotHookReceiveUI";private static final String TAG = "RedPacketService";//聊天界面“微信红包” TextView IDprivate String VIEW_ID_WXHB = "com.tencent.mm:id/aum";//聊天界面"已领取" TextView IDprivate String VIEW_ID_RECIEVED = "com.tencent.mm:id/aul";//打开红包界面“开” Button IDprivate String VIEW_ID_OPEN = "com.tencent.mm:id/dan";//得到的红包金额private String VIEW_ID_MONEY_AMOUNT = "com.tencent.mm:id/d62";//会话列表界面“微信红包” TextView IDprivate String VIEW_ID_CHET_LIST_WXHB = "com.tencent.mm:id/bal";//点击红包打开的界面 红包内容描述 TextView IDprivate String VIEW_ID_DESCRIPTION = "com.tencent.mm:id/dam";/*** 获取PowerManager.WakeLock对象*/private PowerManager.WakeLock wakeLock;/*** KeyguardManager.KeyguardLock对象*/private KeyguardManager.KeyguardLock keyguardLock;@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {if ((null == event.getPackageName())||(null == event.getClassName())){return;}String pkgName = event.getPackageName().toString();//如果不是微信if(!"com.tencent.mm".equals(pkgName)){return;}int eventType = event.getEventType();String className = event.getClassName().toString();Log.i(TAG, "onAccessibilityEvent eventType=" + eventType + " className=" + className);AccessibilityNodeInfo rootNode = getRootInActiveWindow();switch (eventType) {//通知栏来信息,判断是否含有微信红包字样,是的话跳转case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:List<CharSequence> texts = event.getText();for (CharSequence text : texts) {String content = text.toString();Log.i(TAG, "TYPE_NOTIFICATION_STATE_CHANGED content=" + content);if (!TextUtils.isEmpty(content)) {//判断是否含有[微信红包]字样if (content.contains("[微信红包]")) {if (!isScreenOn()) {wakeUpScreen();}//如果有则打开微信红包页面openWeChatPage(event);}}}break;//窗口内容变化监听case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED://进入开红包界面前会有一个loading界面,之后开界面才刷新出来findNodeInfosByViewId(rootNode,VIEW_ID_OPEN);//会话界面来了个红包,只有内容的刷新findNodeInfosByViewId(rootNode,VIEW_ID_WXHB);//会话列表来了个红包,只有文字内容的刷新findNodeInfosByViewId(rootNode,VIEW_ID_CHET_LIST_WXHB);findNodeInfosByViewId(rootNode,VIEW_ID_DESCRIPTION);break;//界面跳转的监听case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED://判断是否是红包领取后的详情界面if (LUCKEY_MONEY_DETAIL.equals(className)) {//获取到的红包金额//findNodeInfosByViewId(rootNode,VIEW_ID_MONEY_AMOUNT);performBackClick();//点微信红包后 开的那个界面} else if (LUCKEY_MONEY_RECEIVER.equals(className)){//判断是否是显示‘开’的那个红包界面int findResult = findNodeInfosByViewId(rootNode,VIEW_ID_OPEN);Log.i(TAG, "findNodeInfosByViewId findResult=" + findResult);//在开的界面但却没有找到开按钮,红包被别人抢光了if (0 == findResult){findNodeInfosByViewId(rootNode,VIEW_ID_DESCRIPTION);}} else {//微信聊天界面找微信红包findNodeInfosByViewId(rootNode,VIEW_ID_WXHB);//会话列表微信红包findNodeInfosByViewId(rootNode,VIEW_ID_CHET_LIST_WXHB);}break;}}/*** 模拟返回操作*/public void performBackClick() {try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}Log.i(TAG, "performBackClick");performGlobalAction(GLOBAL_ACTION_BACK);}private int findNodeInfosByViewId(AccessibilityNodeInfo rootNode, String viewID) {if (null == rootNode){return -1;}List<AccessibilityNodeInfo> nodeInfoList = rootNode.findAccessibilityNodeInfosByViewId(viewID);for (int i = nodeInfoList.size()-1; i>=0; i--) {AccessibilityNodeInfo nodeInfo = nodeInfoList.get(i);CharSequence className = nodeInfo.getClassName();CharSequence text = nodeInfo.getText();CharSequence contentDes = nodeInfo.getContentDescription();AccessibilityNodeInfo parent = nodeInfo.getParent();Log.i(TAG, "findNodeInfosByViewId viewID=" + viewID + " className=" + className + " text=" + text + " contentDes=" + contentDes);//开界面if(VIEW_ID_OPEN.equals(viewID)){nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);return 1;//微信红包字样} else if(VIEW_ID_WXHB.equals(viewID)){List<AccessibilityNodeInfo> recieved = null;if (null != parent){recieved = parent.getParent().findAccessibilityNodeInfosByViewId(VIEW_ID_RECIEVED);}//是否已经领过了if ((recieved != null) && recieved.size() > 0) {Log.i(TAG, "findNodeInfosByViewId 这个已经领过了, continue");continue;}Log.i(TAG, "VIEW_ID_WXHB 您有新的红包");//while循环,遍历"领取红包"的各个父布局,直至找到可点击的为止while (parent != null) {if (parent.isClickable()) {//模拟点击parent.performAction(AccessibilityNodeInfo.ACTION_CLICK);return 2;}parent = parent.getParent();}//红包金额
//            } else if (VIEW_ID_MONEY_AMOUNT.equals(viewID)){//                return true;} else if (VIEW_ID_CHET_LIST_WXHB.equals(viewID)){if (text.toString().contains("[微信红包]")){//while循环,遍历"领取红包"的各个父布局,直至找到可点击的为止Log.i(TAG, "VIEW_ID_CHET_LIST_WXHB 您有新的红包");while (parent != null) {if (parent.isClickable()) {//模拟点击parent.performAction(AccessibilityNodeInfo.ACTION_CLICK);return 3;}parent = parent.getParent();}}} else if (VIEW_ID_DESCRIPTION.equals(viewID)){if (text.toString().contains("该红包已被领取") || text.toString().contains("红包派完了")){performBackClick();}return 4;}}return  0;}/*** 开启红包所在的聊天页面*/private void openWeChatPage(AccessibilityEvent event) {if (event.getParcelableData() != null && event.getParcelableData() instanceof Notification) {Notification notification = (Notification) event.getParcelableData();//打开对应的聊天界面PendingIntent pendingIntent = notification.contentIntent;Log.i(TAG, "openWeChatPage");try {pendingIntent.send();} catch (PendingIntent.CanceledException e) {e.printStackTrace();}}}/*** 服务连接*/@Overrideprotected void onServiceConnected() {Toast.makeText(this, "抢红包服务开启", Toast.LENGTH_SHORT).show();super.onServiceConnected();}/*** 必须重写的方法:系统要中断此service返回的响应时会调用。在整个生命周期会被调用多次。*/@Overridepublic void onInterrupt() {Toast.makeText(this, "我快挂了啊---", Toast.LENGTH_SHORT).show();}/*** 服务断开*/@Overridepublic boolean onUnbind(Intent intent) {Toast.makeText(this, "抢红包服务关闭", Toast.LENGTH_SHORT).show();return super.onUnbind(intent);}/*** 返回桌面*/private void back2Home() {Intent home = new Intent(Intent.ACTION_MAIN);home.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);home.addCategory(Intent.CATEGORY_HOME);startActivity(home);}/** 是否为锁屏或黑屏状态*/public boolean isLockScreen() {KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);return km.inKeyguardRestrictedInputMode() || !isScreenOn();}/*** 判断是否处于亮屏状态** @return true-亮屏,false-暗屏*/public boolean isScreenOn() {PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {return pm.isInteractive();} else {return pm.isScreenOn();}}/*** 解锁屏幕*/private void wakeUpScreen() {//先将锁释放release();//获取电源管理器对象PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);//后面的参数|表示同时传入两个值,最后的是调试用的TagwakeLock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.FULL_WAKE_LOCK, "bright");//点亮屏幕wakeLock.acquire();//得到键盘锁管理器KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);keyguardLock = km.newKeyguardLock("unlock");//解锁keyguardLock.disableKeyguard();Log.i(TAG, "wakeUpScreen wakeLock=" + wakeLock + " keyguardLock=" + keyguardLock);}/*** 释放keyguardLock和wakeLock*/public void release() {if (keyguardLock != null) {keyguardLock.reenableKeyguard();keyguardLock = null;}if (wakeLock != null) {wakeLock.release();wakeLock = null;}}}

redpacket_service_config.xml RedPacketService配置文件

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"android:accessibilityEventTypes="typeAllMask"android:accessibilityFeedbackType="feedbackGeneric"android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows|flagIncludeNotImportantViews"android:canRetrieveWindowContent="true"android:description="@string/desc"android:notificationTimeout="100"
/>

AndroidManifest.xml 增加服务声明及权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.snatch"><!--解锁权限--><uses-permission android:name="android.permission.DISABLE_KEYGUARD"></uses-permission><!--亮屏权限--><uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activityandroid:name=".MainActivity"android:label="@string/app_name"android:theme="@style/AppTheme.NoActionBar"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity><!--抢红包服务--><serviceandroid:name=".RedPacketService"android:enabled="true"android:exported="true"android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"><intent-filter><action android:name="android.accessibilityservice.AccessibilityService" /></intent-filter><meta-dataandroid:name="android.accessibilityservice"android:resource="@xml/redpacket_service_config"></meta-data></service></application></manifest>

Android微信抢红包服务源码

Android微信抢红包服务源码相关推荐

  1. Android微信抢红包插件源码解析

    这个Android插件可以帮助你在微信群聊抢红包时战无不胜.当检测到红包时,插件会自动点击屏幕,人工点击的速度无法比拟. 你正在查看的是dev分支,这个分支包含大量实验性的修改,不再更新.如果你希望有 ...

  2. 拆红包robmoney.java,android 模拟微信抢红包 实例源码下载

    [实例简介]需要 开启该应用的 辅助功能 [实例截图] [核心代码] package krelve.demo.rob; import java.util.List; import android.ac ...

  3. 石头剪刀布代码android,微信小程序源码解说:石头剪刀布(附源码下载)

    var numAi = 0 var timer Page({ data:{ //控制按钮是否可点击 btnState:false, //记录获胜次数 winNum:0, //中间的话"Ho~ ...

  4. android源码大全 IOS游戏源代码打包下载 小游戏|视频教程 微信小程序源码带后台全套|公众号平台

    不断更新中,下面是2017-12-22更新部分 IOS_源码及视频一小部分: 开发环境:Xcode 基于cocos2d的tweejump跳跃游戏ios经典游戏源码.rar  https://pan.b ...

  5. Android 微信抢红包插件

    转载开源工程:https://github.com/geeeeeeeeek/WeChatLuckyMoney 这个Android插件可以帮助你在微信群聊抢红包时战无不胜.当检测到红包时,插件会自动点击 ...

  6. Android微信抢红包插件原理和实现 适配微信6.6.1版本

    Android微信抢红包插件原理和实现 适配微信6.6.1版本 一.前言 年关将至,小伙伴们又聊起了春节长假的旅行安排和各自家乡的年味习俗,不一而足.其中在各个微信群聊中抢红包也是为大家所津津乐道的. ...

  7. 1000套微信小程序源码源代码带后台带运行截图预览图学习资料网盘下载

    1000多套微信小程序源码带后台+教程+不同行业的源码集合 o2o行业 | - 盒马鲜生 | - 轻客洗衣 互联网行业 | - 云文档 | - 仿ofo共享单车 | - 仿美团外卖 | - 仿饿了么 ...

  8. Android上百实例源码分析以及开源分析集合打包

    感谢网友banketree的收集,压缩包的内容如下: 1.360新版特性界面源代码 实现了360新版特性界面的效果,主要涉及到Qt的一些事件处理与自定义控件.但源码好像是c++. 2.aidl跨进程调 ...

  9. Android短视频系统源码功能测试(个人总结完整版)

    Android短视频系统源码功能测试包含短视频系统源码的安装卸载测试,界面测试,业务功能测试,短视频系统源码特性测试,交叉事件测试,兼容性测试,升级更新测试,消息通知测试,功能键测试,手势测试等 1- ...

  10. 免费分享20套微信小程序源码 源码免费下载【强烈推荐】

    淘源码:国内知名的源码免费下载平台 微信小程序源码包括:商城系统源码.点餐外卖源码.垃圾分类识别源码.预约洗车源码.物业管理源码.校园跑腿源码.驾考学习源码.会议预约源码.图书管理源码.智能停车源码. ...

最新文章

  1. 利用GetPrivateProfileString读取配置文件(.ini)
  2. mysql 读写分离中间层
  3. python基础:并行遍历ZIP()函数介绍
  4. jmeter jdbc mysql_jmeter获取JDBC响应做接口关联(三)
  5. 【ESP8266】发送HTTP请求
  6. 计算机网络————P1 概念、组成、功能和分类
  7. 【实习之T100开发】T100 双档程序开发流程
  8. 【读书笔记】100个Switf必备tips
  9. [Scikit-learn教程] 03.02 文本处理:分类与优化
  10. Jupyter notebook、JypterLab的本地安装与使用
  11. PRAE插件开发遇到的一个坑
  12. 2021美赛MCM选题
  13. RN开发系列<8>--Redux(1)入门篇
  14. 中兴服务器默认用户名密码是什么,中兴路由器登录地址默认用户名密码
  15. 126邮箱手机登录服务器密码怎么办,魅族手机登录网易126邮箱提示账号密码或协议设置不正确解决办法...
  16. 用户行为分析的指标体系
  17. android_rooting_tools 项目介绍(CVE-2012-4220)
  18. 用Python实现班委竞选(屈婉玲 离散数学P45 29)
  19. 信道编码之纠删码编码
  20. iis不能启动站点,端口被占用.(解决办法)

热门文章

  1. 全套汽车标志,好不容易找到的哦
  2. HDOJ 4889 Scary Path Finding Algorithm 颠覆spfa slf优化
  3. Nuvoton I91200 SDS- AudioPlayback
  4. Leetcode #317:离建筑物最近的距离
  5. H3C模拟器安装及解决各种兼容性问题方法
  6. MTK6577+Android之音频(audio)移植
  7. Python每日一练——第5天:闰年问题升级版
  8. My Thirty-First Page - 翻转二叉树 - By Nicolas
  9. 886. 可能的二分法
  10. Win10系统下向MS Word2019中添加NoteExpress插件