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

所属分类: 软件编程 / Android 阅读数: 50
收藏 0 赞 0 分享

快到过农历年了,微信红包也越来越多了,出现了好多红包外挂程序,就很好奇如何实现的,于是自己研究了一番,亲自写了个微信抢红包的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样式和主题之选择器的实例讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

Android应用动态修改主题的方法示例

今天小编就为大家分享一篇关于Android应用动态修改主题的方法示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

Flutter 网络请求框架封装详解

这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Flutter倒计时/计时器的实现代码

这篇文章主要介绍了Flutter倒计时/计时器的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android使用google breakpad捕获分析native cash

这篇文章主要介绍了Android使用google breakpad捕获分析native cash 的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Flutter WebView与JS互相调用简易指南

这篇文章主要介绍了详解Flutter WebView与JS互相调用简易指南,分为JS调用Flutter和Flutter调用JS,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android开发实现ListView和adapter配合显示图片和文字列表功能示例

这篇文章主要介绍了Android开发实现ListView和adapter配合显示图片和文字列表功能,涉及Android使用ListView结合adapter适配器实现图文显示功能相关的布局、解析、权限控制等操作技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

Android文字基线Baseline算法的使用讲解

今天小编就为大家分享一篇关于Android文字基线Baseline算法的使用讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

Flutter自定义实现神奇动效的卡片切换视图的示例代码

这篇文章主要介绍了Flutter自定义实现神奇动效的卡片切换视图的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android实现自定义滑动刻度尺方法示例

这篇文章主要给大家介绍了关于Android实现自定义滑动刻度尺的相关资料,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享
查看更多