使用AccessibilityService实现微信自己主动抢红包
近期要实现微信自己主动抢红包的功能。使用AccessibilityService来开发,这里主要写一下逻辑以及注意点。
注意点
1、搜索keyword
我们实现某个功能比方点击等须要找到相应的对象然后模拟点击事件,所以首先就是怎么样找到对象,以下说三种方式:
(1)findAccessibilityNodeInfosByText通过文字来实现查找,返回的是List<AccessibilityNodeInfo>。所以须要通过for循环来详细推断须要的keyword的对象
(2)findAccessibilityNodeInfosByViewId通过控件的id来查询,返回的是List<AccessibilityNodeInfo>,尽管也是返回List可是一般仅仅有一个,查找的准确性高。只是须要系统的版本号API>=18
(3)搭配findAccessibilityNodeInfosByText来查找。在微信中使用uiautomatorviewer查看布局,发现不同的手机同样的控件id是不一样的,比方我们须要查询获取红包的数量时,须要先查找'元',然后获取其父控件。然后查找金额所在的位置。这个是不变的。
2、对于返回功能
一般我们领取红包后进入红包详情界面。这时我们要返回到聊天界面使用uiautomatorviewer查看返回箭头,查看其属性他的clickable=false这种话我们就无法通过
accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);来实现点击事件来实现返回的功能,只是查看AccessibilityService源代码里面有相应的全局事件,以下说两种实现返回功能的方法
(1)查找界面上相应的返回button然后通过AccessibilityNodeInfo的performAction(AccessibilityNodeInfo.ACTION_CLICK)实现点击,只是在操作之前先推断一下isCheckable()假设是false则无法实现其功能
(2)使用AccessibilityService的performGlobalAction的方法,介绍例如以下:/**
* Performs a global action. Such an action can be performed
* at any moment regardless of the current application or user
* location in that application. For example going back, going
* home, opening recents, etc.
*
* @param action The action to perform.
* @return Whether the action was successfully performed.
*
* @see #GLOBAL_ACTION_BACK
* @see #GLOBAL_ACTION_HOME
* @see #GLOBAL_ACTION_NOTIFICATIONS
* @see #GLOBAL_ACTION_RECENTS
*/
public final boolean performGlobalAction(int action) {
IAccessibilityServiceConnection connection =
AccessibilityInteractionClient.getInstance().getConnection(mConnectionId);
if (connection != null) {
try {
return connection.performGlobalAction(action);
} catch (RemoteException re) {
Log.w(LOG_TAG, "Error while calling performGlobalAction", re);
}
}
return false;
}所以要实现返回功能仅仅须要调用performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);。当然假设想实现Home,通知,近期的应用换成相应的action就能够了
3、涉及微信界面的类
/**
* 微信的包名
*/
static final String WECHAT_PACKAGENAME = "com.tencent.mm";
/**
* 拆红包类
*/
static final String WECHAT_RECEIVER_CALSS = "com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI";
/**
* 红包详情类
*/
static final String WECHAT_DETAIL = "com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI";
/**
* 微信主界面或者是聊天界面
*/
static final String WECHAT_LAUNCHER = "com.tencent.mm.ui.LauncherUI";这里须要注意的是WECHAT_LAUNCHER,微信主界面以及聊天界面应该採用的FragmentActivity+Fragment这样导致假设用户进入到微信主界面则会调用AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED,导致再次进入微信聊天界面不会再调用AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED,而会调用AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED,而AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED仅仅要内容改变后都会调用,所以通常是使用AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED来作为监測事件的。所以解决问题的方式就是添加推断条件:
(1)触发AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED这个事件搜索列表界面是否有"领取红包"字样,假设没有则设置一个变量(2)假设没有触发AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED而触发了AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED,则去推断之前设置的变量综合来推断4、添加红包获取量避免反复金额
在聊天界面的红包尽管会有"领取红包"的字样,可是事实上是已经拆过的,推断的标识就是是否有"拆红包",假设有拆红包则计算相应详情中的金额。5、怎样循环查询全部的子控件
/**
* @param info 当前节点
* @param matchFlag 须要匹配的文字
* @param type 操作的类型
*/
public void recycle(AccessibilityNodeInfo info, String matchFlag, int type) {
if (info != null) {
if (info.getChildCount() == 0) {
CharSequence desrc = info.getContentDescription();
switch (type) {
case ENVELOPE_RETURN://返回
if (desrc != null && matchFlag.equals(info.getContentDescription().toString().trim())) {
if (info.isCheckable()) {
info.performAction(AccessibilityNodeInfo.ACTION_CLICK);
} else {
performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
}
}
break;
}
} else {
int size = info.getChildCount();
for (int i = 0; i < size; i++) {
AccessibilityNodeInfo childInfo = info.getChild(i);
if (childInfo != null) {
Log.e(TAG, "index: " + i + " info" + childInfo.getClassName() + " : " + childInfo.getContentDescription()+" : "+info.getText());
recycle(childInfo, matchFlag, type);
}
}
}
}
}网上关于抢红包的源代码比較多,因为其它原因我们这里的不会发布。能够依据网上的源代码进行改动,能够实现功能:
(1)截取通知栏中有[微信红包]字样的通知,然后跳到微信红包界面(2)进入群聊界面会自己主动查询当前界面全部"领取红包",然后循环点击查找添加红包的概率(3)准确的保存领取的红包金额和日期
使用AccessibilityService实现微信自己主动抢红包的更多相关文章
- Android实现微信自己主动抢红包的程序
简单实现了微信自己主动抢红包的服务,原理就是依据keyword找到对应的View, 然后自己主动点击.主要是用到AccessibilityService这个辅助服务,基本能够满足自己主动抢红包的功能, ...
- 一步一步实现iOS微信自己主动抢红包(非越狱)
前言:近期笔者在研究iOS逆向project,顺便拿微信来练手,在非越狱手机上实现了微信自己主动抢红包的功能. 题外话:此教程是一篇严肃的学术探讨类文章,只用于学习研究,也请读者不要用于商业或其它非法 ...
- [Android进阶]学习AccessibilityService实现微信抢红包插件
在你的手机更多设置或者高级设置中,我们会发现有个无障碍的功能,很多人不知道这个功能具体是干嘛的,其实这个功能是为了增强用户界面以帮助残障人士,或者可能暂时无法与设备充分交互的人们 它的具体实现是通过A ...
- Android进阶——学习AccessibilityService实现微信抢红包插件
在你的手机更多设置或者高级设置中,我们会发现有个无障碍的功能,很多人不知道这个功能具体是干嘛的,其实这个功能是为了增强用户界面以帮助残障人士,或者可能暂时无法与设备充分交互的人们 它的具体实现是通过A ...
- class-dump 和 iOSOpenDev 的使用
class-dump 官网地址:这里 我这里下载的是 class-dump-3.5.dmg 版本号的. 双击.dmg 文件,将 拉倒 /usr / local / bin 文件夹下,这样就能够在终端 ...
- 利用AccessibilityService自动获取微信号(Android)
前言: 最近遇到一个需求,要求写一个小插件,能够自动在微信的页面弹出一个窗口,展示用户的相关信息(与我们公司有关的信息,方便运营快速了解用户信息). 当时我第一反应是不可能,如果能够在别的app中获取 ...
- java微信开发(wechat4j)——发送客服消息
微信支持主动发送客服消息.如果你要实现此功能,需要使用CustomerMsg类. 获得access_token access_token请求之后有一个过期时间,微信平台建议你使用一个中控服务器来定时刷 ...
- 以蓝牙开发的视觉解读微信Airsync协议
微信硬件平台使用蓝牙作为近场控制的连接件,并拟定了<微信蓝牙外设协议>.这份协议更像一个标准,用于规范微信和蓝牙外设之间的数据交互场景和接口.但从开发者来看,要完全读懂这份协议,恐怕需要熟 ...
- Protocol buffer序列化及其在微信蓝牙协议中的应用
Protocol buffer是Google出品的一种轻便高效的结构化数据存储格式,可对结构化数据进行序列化,并具有语言无关.平台无关等特点,在通信协议和数据存储等领域已经得到广泛的应用.目前其已经提 ...
随机推荐
- (转)NIO 内存映射文件
内存映射文件 I/O 是一种读和写文件数据的方法,它可以比常规的基于流或者基于通道的 I/O 快得多. 内存映射文件 I/O 是通过使文件中的数据神奇般地出现为内存数组的内容来完成的.这其初听起来似乎 ...
- 【转】-ECshop数据库表结构
-- 表的结构 `ecs_account_log`CREATE TABLE IF NOT EXISTS `ecs_account_log` (`log_id` mediumint(8) unsigne ...
- 实现淡入淡出效果的组件,继承自JComponent
由于仅贴出代码,供有缘人参考. import java.awt.AlphaComposite; import java.awt.Graphics; import java.awt.Graphics2D ...
- App服务端架构变迁
随着移动互联网时代的到来,移动技术也随之飞速发展.如今,App已然成为绝大多数互联网企业用来获取用户的核心渠道.以往以PC为主要承载平台的各业务线,源源不断集成加入到移动项目中来,原本以产品为中心快速 ...
- oc和swift混编 使用use_frameworks!后编译出错
Swift项目中同时使用OC的库和Swift的库时,用CocoaPods导入时添加use_frameworks! 如果在cocoapods 里面不使用use_frameworks!,则是通过stati ...
- 聊聊iOS中网络编程长连接的那些事
1.长连接在iOS开发中的应用 常见的短连接应用场景:一般的App的网络请求都是基于Http1.0进行的,使用的是NSURLConnection.NSURLSession或者是AFNetworking ...
- Ubuntu 下安装adobe reader
ctrl+alt+t打开终端 wget ftp://ftp.adobe.com/pub/adobe/reader/unix/9.x/9.5.5/enu/AdbeRdr9.5.5-1_i386linux ...
- vue - 条件语句
1.与小程序不同之处一,小程序无论变量还是常亮都可以用双向绑定来解决{{}},而vue一旦双(单)引号包起来以后就失效了. 2.注意一点,切记双引号注意不要混淆哈,这里是一排双引号包单引号,那里是一排 ...
- windows print 自定义字体颜色【python】
windows print 自定义字体颜色 import ctypes STD_INPUT_HANDLE = -10 STD_OUTPUT_HANDLE= -11 STD_ERROR_HANDLE = ...
- Load和CPU利用率是如何算出来的 (转发)
本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/system/how_to_cal ...