Android微信抢红包功能的实现原理浅析

发布时间 - 2026-01-10 22:24:27    点击率:

快到过农历年了,微信红包也越来越多了,出现了好多红包*程序,就很好奇如何实现的,于是自己研究了一番,亲自写了个微信抢红包的APP。现在就一步一步来实现它。

实现思路

微信抢红包程序开启时候,他就可以随时识别、捕获红包,服务可以实现正在功能,当我们开启服务的时候,服务就不停的在后台运行,不停地轮询着微信里面的消息,当发现红包时候就立即打开微信红包所在的界面。但是他怎识别红包呢?需要找到微信抢红包里面节点的view,当找到对应的view,在获取view的关键字或者id,根据关键字或者id,自动的模拟点击,拆开红包。这里有一个AccessibilityService的服务,他是一个辅助类,可以实现这些功能。

AccessibilityService辅助类

AccessibilityService是一个辅助类,可以监听我们手机的焦点,窗口变化,按钮点击,声音提示等等,但是必须手动开启,不能通过代码开启,存在于设置里面的辅助功能,开启他我们可以增强互动性。现在来来使用他实现抢红包功能:

1、新建一个类QiangHongBaoService继承自AccessibilityService

@Override 
public void onAccessibilityEvent(AccessibilityEvent event) { 
  //获取事件类型 
  int type = event.getEventType(); 
  //在这里进行事件过滤 
   
} 

2、注册清单文件

<service 
  android:name=".QiangHongBaoService" 
  android:label="@string/app_name" 
  android:enabled="true" 
  android:exported="true" 
  android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> 
  <intent-filter android:priority="1000"> 
    <action android:name="android.accessibilityservice.AccessibilityService"/> 
  </intent-filter> 
  <meta-data 
    android:name="android.accessibilityservice" 
    android:resource="@xml/envelope_service_config"/> 
</service> 

新建一个xml文件夹,创建envelope_service_config文件

<?xml version="1.0" encoding="utf-8"?> 
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" 
            android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged" 
            android:accessibilityFeedbackType="feedbackGeneric" 
            android:accessibilityFlags="flagDefault" 
            android:canRetrieveWindowContent="true" 
            android:description="@string/accessibility_description"            android:notificationTimeout="100"           android:packageNames="com.tencent.mm" /> 
记得加上网络权限:<uses-permission Android:name="android.permission.VIBRATE" />

抢红包业务逻辑处理

在微信抢红包界面上只关心两个事件类型:

1、AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED//监听通知栏消息

在监听通知栏消息界面主要是监听每次微信发过来的消息显示在通知栏时,获取消息,当发现获取的消息含有“微信红包”时就会立即打开 红包所显示的界面。

/** 
 * 从知消息栏打开微信聊天界面 
 * @param event 
 */ 
private void openNotification(AccessibilityEvent event) { 
  if (event.getParcelableData() != null && event.getParcelableData() instanceof Notification) { 
    Notification notification = (Notification) event.getParcelableData(); 
    PendingIntent pendingIntent = notification.contentIntent; 
    try { 
      pendingIntent.send(); 
    } catch (PendingIntent.CanceledException e) { 
      e.printStackTrace(); 
    } 
  } 
} 

2、AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED//当前窗口变化,是否进入微信聊天界面

在这里需要根据包名判断是否是聊天界面,如果是则点中红包,如果不是判断是否是拆红包界面,如果是则拆开,执行拆红包动作。

聊天界面的包名:com.tencent.mm.ui.LauncherUI

拆红包界面的包名:com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI

/** 
 * 点中红包 
 */ 
@TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
private void clickHongBao() { 
  AccessibilityNodeInfo nodeInfo = getRootInActiveWindow(); 
  if (nodeInfo == null) { 
    return; 
  } 
  List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText(ENVLOP_OPEN_KEY); 
  if (list.isEmpty()) { 
    list = nodeInfo.findAccessibilityNodeInfosByText(ENVELOPE_TEXT_KEY); 
    for (AccessibilityNodeInfo n : list) { 
      n.performAction(AccessibilityNodeInfo.ACTION_CLICK); 
      break; 
    } 
  } else { 
    //最新的红包领起 
    for (int i = list.size() - 1; i >= 0; i--) { 
      AccessibilityNodeInfo parent = list.get(i).getParent(); 
      if (parent != null) { 
        parent.performAction(AccessibilityNodeInfo.ACTION_CLICK); 
        break; 
      } 
    } 
  } 
} 
/** 
 *拆红包 
 */ 
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) 
private void openHongBao() { 
  AccessibilityNodeInfo rootInActiveWindow = getRootInActiveWindow(); 
  if (rootInActiveWindow == null) { 
    return; 
  } 
  List<AccessibilityNodeInfo> nodeInfos = rootInActiveWindow.findAccessibilityNodeInfosByViewId(ENVLOP_CHECKED_KEY); 
  for (AccessibilityNodeInfo nodeInfo : nodeInfos) { 
    nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK); 
  } 
} 

上例中的拆红包是依据控件的id拆开的,也可以按照关键字“拆红包”执行。但是效率略低于根据id拆红包,这样很可能影响抢红包的效率,需要注意的是拆红包的id在微信不同版本中是不一样的,所以需要经常改变,比较麻烦。此外当AccessibilityService服务被关闭时会回调onInterrupt方法,当连接上时会回调onServiceConnected方法,在这里可以做一些提示性的工作。

抢红包功能的开启

微信抢红包功能是通过手动开启的,直接在设置里面找到辅助功能,点击开启,为了方便,给activity设置一个按钮,采用隐式意图的方式,直接跳转至服务功能。

//打开系统设置中辅助功能 
Intent intent = new Intent(android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS); 
startActivity(intent); 

到了这里微信抢红包的而核心功能介绍完了,抢红包的效率还受网络,手机内存大小,系统流畅度的影响,以及服务优先级等等因素的影响。这里只是学习一下,千万别用来经常*来抢红包,小心被封号哦!!!
源码已经上传至github,需要的点击打开链接

https://github.com/yoonerloop/WebEnvelope

以上所述是小编给大家介绍的Android微信抢红包功能的实现原理浅析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# android  # 微信抢红包实现  # 抢红包实现  # Android AccessibilityService实现微信抢红包插件  # 教你一步步实现Android微信自动抢红包  # Android中微信抢红包插件原理解析及开发思路  # Android实现微信自动抢红包的程序  # 分享Android微信红包插件  # Android仿硬币转动微信红包动画效果  # 抢红包  # 在这里  # 辅助功能  # 可以实现  # 回调  # 小编  # 新建一个  # 的是  # 判断是否  # 是一个  # 在此  # 他就  # 我们可以  # 给大家  # 很可能  # 写了  # 如果不是  # 时就  # 当我们  # 到过 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: node.js报错:Cannot find module &#39;ejs&#39;的解决办法  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  Java解压缩zip - 解压缩多个文件或文件夹实例  Android仿QQ列表左滑删除操作  如何在万网开始建站?分步指南解析  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  高端云建站费用究竟需要多少预算?  如何用JavaScript实现文本编辑器_光标和选区怎么处理  Laravel如何处理和验证JSON类型的数据库字段  Android中AutoCompleteTextView自动提示  重庆市网站制作公司,重庆招聘网站哪个好?  大连网站制作公司哪家好一点,大连买房网站哪个好?  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  怎么用AI帮你设计一套个性化的手机App图标?  C#如何调用原生C++ COM对象详解  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  JS去除重复并统计数量的实现方法  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  详解Oracle修改字段类型方法总结  如何在建站之星网店版论坛获取技术支持?  如何利用DOS批处理实现定时关机操作详解  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  如何在建站宝盒中设置产品搜索功能?  Laravel storage目录权限问题_Laravel文件写入权限设置  如何用好域名打造高点击率的自主建站?  微信小程序 wx.uploadFile无法上传解决办法  JS碰撞运动实现方法详解  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  使用C语言编写圣诞表白程序  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  Bootstrap整体框架之JavaScript插件架构  python中快速进行多个字符替换的方法小结  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  如何在七牛云存储上搭建网站并设置自定义域名?  如何在IIS管理器中快速创建并配置网站?  如何在宝塔面板中修改默认建站目录?  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  常州企业网站制作公司,全国继续教育网怎么登录?  在线教育网站制作平台,山西立德教育官网?  Laravel如何处理CORS跨域请求?(配置示例)  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  Laravel如何实现API资源集合?(Resource Collection教程)  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  Laravel如何使用Blade组件和插槽?(Component代码示例)