微信抢红包插件Android端1.0,目前支持通知栏自动弹起抢红包,列表自动监控(其他功能待改善)
(PS:此项目是在网上copy的工程,由于微信更新已经停止更新的工程)
以上仅供技术交流,工程持续更新(测试微信版本6.5.10)(目前7.0系统并不能完美支持,需要root功能,切在测试阶段)
源码地址:https://github.com/AnyMarvel/WeChatLuckyMoney
apk下载地址:https://github.com/AnyMarvel/WeChatLuckyMoney/releases/
(请下载最新APK支持最新包)
目前并不能对所有手机进行适配,有问题的童鞋还请留言,我尽量修复。(程序员有点穷,目前只是用我的华为荣耀6P进行了测试)有问题请及时留言,我尽量修改。。。。所以请有问题的童鞋勿喷。。。
我们不联网,没有广告,没有内部数据收取,仅仅单单的实现抢红包功能
先说说为什么要做这个东西:本人手太慢,朋友圈玩游戏过节老发红包,一不注意就错过了“一个亿”。下定决心搞一个,我自动化抢,随还能跟我抢/
注意:项目中未使用网络连接权限,未做任何网络推广性的内容,仅做技术探讨,只实现基本抢红包功能。请勿作为商业用途,后果自负。本文原创,转载请简信。
实现原理:
这里参考:《你真的理解AccessibilityService吗》中对于AccessibilityService原理讲解
http://www.jianshu.com/p/4cd8c109cdfb
AccessibilityService实现原理及能力网上有很多的例子,这里就不在一一的进行介绍,篇文章中只阐述实现内容重点,及所遇到的坑。
项目使用无障碍模式,不需要root手机,只需要运行该无障碍模式进行定向包监听。
我们这里只针对微信包进行了监听功能。
用户不用担心流氓软件,病毒等问题。源码是公开的,内部权限也是公开的。本着技术的原则进行对外公开,目的是为了技术交流。
实现流程:
一. 监听AccessibilityEvent,监听通知及界面变化。
通过TYPE_WINDOW_STATE_CHANGED及TYPE_WINDOW_CONTENT_CHANGED对微信界面进行区别监听。这里遇到了坑,下面会详细介绍。
二. 查找红包信息,查看聊天会话窗口,遍历节点匹配“领取红包”和"查看红包"
三. 如果已经接收到红包并且还没有戳开则拆开红包
四.戳开红包,红包还没抢完,遍历节点匹配“拆红包”,戳开红包,红包已被抢完,遍历节点匹配“红包详情”和“手慢了”,
五.如果戳开但还未领取则领取红包,则领取红包
六,全局返回,进行默认监听
流程如下:
所遇到的问题:
问题一:TYPE_WINDOW_STATE_CHANGED和TYPE_WINDOW_CONTENT_CHANGED的区别
这里需要注意的是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来作为监测事件的,所以解决这个问题的方式就是加入判断条件
问题二:AccessibilityService.dispatchGesture模拟手势方法的使用
由于performAction这个函数在SDK_INT <= 23时间才生效(这里指的是微信,不知道微信做了什么屏蔽,),在SDK_INT > 23时候模拟点击不起作用
这个问题使用google了一些找不到好的解决方案,直接看代码吧(纠正下,以下代码目前在Android7.0上目前也只会执行到oncancle中,只能使用模拟点击,申请root权限进行屏幕坐标点点击)
{
Path path = new Path();
if (640 == dpi) {
path.moveTo(720, 1575);
} else {
path.moveTo(540, 1060);
}
GestureDescription.Builder builder = new GestureDescription.Builder();
GestureDescription gestureDescription = builder.addStroke(new GestureDescription.StrokeDescription(path, 450, 50)).build();
dispatchGesture(gestureDescription, new GestureResultCallback() {
@Override
public void onCompleted(GestureDescription gestureDescription) {
.......
}, null);
}
问题三:息屏抢红包模式
这个是我手机的一个坑。华为手机在息屏后会自动的将进程杀死已用来进行用电的节约,这里可以在手机里面进行手动的关闭,步骤如下:
设置→应用管理→微信→电池→打开“屏幕关闭后保持运行”,就OK了。
当然原有的通知设置也要打开
截图如下:
屏幕关闭后保持运行打开即可。
ps:在后续的代码调用中这块也会进行更新,就不用手动的进行代码调用了。
问题四:Android7.0以上支持
感谢王洪贺提出的在小米7.0上不能正确使用
这两天查看了下在我们的代码中
//打开钱包后进行查找
private AccessibilityNodeInfo findOpenButton(AccessibilityNodeInfo node) {
if (node == null)
return null;
//layout元素,遍历找button
for (int i = 0; i < node.getChildCount(); i++) {
if ("android.widget.Button".equals(node.getChild(i).getClassName()))
return node.getChild(i);
}
return null;
}
不能正确的获取到 開 字的Node节点信息。尝试使用遍历的方法进行获取也不行
private AccessibilityNodeInfo findOpenButton(AccessibilityNodeInfo node) {
if (node == null)
return null;
//非layout元素
if (node.getChildCount() == 0) {
if ("android.widget.Button".equals(node.getClassName()))
return node;
else
return null;
}
//layout元素,遍历找button
AccessibilityNodeInfo button;
for (int i = 0; i < node.getChildCount(); i++) {
button = findOpenButton(node.getChild(i));
if (button != null)
return button;
}
return null;
}
获得到的就是一堆的线性布局,这里不清楚是否是微信做了屏蔽还是Android7.0增加了Android安全的特点
这里想到的方法,使用root 权限,使用模拟点击的方式进行屏幕内容点击。(ps代码需要重构,需要大家等待下,最近比较忙。。。)
刚试了下Android6.0以下目前可以正常获取到開的节点信息,可以正常使用,有问题请及时联系,代码我努力更新。
关注微信公众号 Android历练记 或扫一扫二维码:
让我们一起来搞事情。
网友评论