欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-02-19 18:28:11
快到过农历年了,微信红包也越来越多了,出现了好多红包外挂程序,就很好奇如何实现的,于是自己研究了一番,亲自写了个微信抢红包的app。现在就一步一步来实现它。 实现思路...

快到过农历年了,微信红包也越来越多了,出现了好多红包外挂程序,就很好奇如何实现的,于是自己研究了一番,亲自写了个微信抢红包的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微信抢红包功能的实现原理浅析,希望对大家有所帮助