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

 更新时间:2017年01月09日 16:25:36   作者:一杯清泉  
快到新年了,微信红包越来越多,那么基于程序是怎么实现的呢?今天小编给大家分享Android微信抢红包功能的实现原理浅析,一起看看吧

快到过农历年了,微信红包也越来越多了,出现了好多红包外挂程序,就很好奇如何实现的,于是自己研究了一番,亲自写了个微信抢红包的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手机屏幕横竖屏切换

    本篇文章主要介绍了解决Android手机屏幕横竖屏切换的方法,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • Flutter定时器、倒计时的快速上手及实战讲解

    Flutter定时器、倒计时的快速上手及实战讲解

    这篇文章主要给大家介绍了关于Flutter定时器、倒计时的快速上手及实战的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Flutter具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • Android观察者模式实例分析

    Android观察者模式实例分析

    这篇文章主要介绍了Android观察者模式,实例分析了Android观察者模式的原理与相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • 使用Android自定义控件实现滑动解锁九宫格

    使用Android自定义控件实现滑动解锁九宫格

    最近由于Android项目需要,要求做一个类似于支付宝的九宫格解锁组件,下面小编给大家分享了具体实现代码,需要的朋友可以参考下
    2015-10-10
  • Android实现GPS定位代码实例

    Android实现GPS定位代码实例

    这篇文章主要介绍了Android实现GPS定位实例,对关键操作部份给出代码示例并做了一定的注释,需要的朋友可以参考下
    2014-07-07
  • android仿爱奇艺加载动画实例

    android仿爱奇艺加载动画实例

    这篇文章主要介绍了android仿爱奇艺加载动画实例,小编觉得挺不错的,现在就分享给大家,也给大家做个参考。
    2016-10-10
  • Android绘制炫酷的引导界面

    Android绘制炫酷的引导界面

    这篇文章主要为大家详细介绍了Android绘制炫酷引导界面的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • 详解Android开发技巧之PagerAdapter实现类的封装

    详解Android开发技巧之PagerAdapter实现类的封装

    这篇文章主要介绍了详解Android开发技巧之PagerAdapter实现类的封装,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Android手机通过rtp发送aac数据给vlc播放的实现步骤

    Android手机通过rtp发送aac数据给vlc播放的实现步骤

    这篇文章主要介绍了Android手机通过rtp发送aac数据给vlc播放的实现步骤,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下
    2021-04-04
  • android 修改launcher行数和列数的方法

    android 修改launcher行数和列数的方法

    这篇文章主要介绍了android 修改launcher行数和列数的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07

最新评论