阅读该文章前,可以先阅读我前两篇文章
微信自动回复和自动抢红包实现原理(一):AccessibilityService的介绍和配置
微信自动回复和自动抢红包实现原理(二):自动回复


经过前两篇文章的阅读,我相信大家应该对AccessibilityService有一定的了解了,是不是已经按捺不住,想自己动手试试?先别急,可以再看完我这篇文章还不迟,相信你另有收获的。接下来我们来探索一下自动抢红包的实现原理。

看了我第二篇微信自动回复文章的朋友应该知道怎么做了,只是一些操作上不同:

  1. 监听TYPE_NOTIFICATION_STATE_CHANGED事件
  2. 根据Notification打开会话人聊天界面
  3. 搜索红包控件
  4. 点击红包控件,打开红包,如果红包已被抢,跳至第6步,否则执行第5步
  5. 点击红包界面的“开”按钮,抢红包
  6. 返回微信主界面

好吧,我们给测试手机微信发个红包,先打印log来看看,具体信息不贴了,直接看结果:

打开微信的界面
-------------------------------------------------------------
PackageName:com.tencent.mm
Source Class:com.tencent.mm.ui.LauncherUI
Description:null
Event Type(int):32
-------------------------------------------------------------
红包接收界面(不管红包还没抢光还是已被抢光都会打开这个界面)
-------------------------------------------------------------
PackageName:com.tencent.mm
Source Class:com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI
Description:null
Event Type(int):32
-------------------------------------------------------------
红包详情界面(也就是抢到红包以后的界面)
-------------------------------------------------------------
PackageName:com.tencent.mm
Source Class:com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI
Description:null
Event Type(int):32
-------------------------------------------------------------

经我测试,LauncherUI只有微信在后台才会触发,但微信在前台时也会有Notification,所以有LuckyMoneyReceiveUI、LuckyMoneyDetailUI两个界面我们已经足够了

接下来的工作是找到相应的控件了。先找红包这个控件,给测试机微信发多几次红包,找到每个红包的相同点。

红包.png

看到红色框框没,“领取红包”这个控件每次都不变了,可以根据其找到其父控件,再点击就可以打开红包了!

接下来就是红包界面的“开”按钮了。很遗憾,因为该按钮即每文本信息,也没特别的子控件,没办法,只能直接用控件的id了(但这种方法不好,因为据了解,控件的id经常会变,可能就会了防止这类插件的出现吧,哈哈),下面介绍如何获取控件的id。
1.打开DDMS,连接手机,打开一个红包,进入红包界面,点击下面按钮

DDMS.png

2.选中你需要的控件,例如这里我们是要查看“开”按钮这控件

开红包.png

3.在右边就可以查看控件的信息了,右下方可以查看id

QQ截图20160809224615.png

嗯,对的,红包的控件也可以这样获取,但我说过了,id是会变的,所以能不用就最好不要用。还有如果有朋友知道不用id获取“开”按钮的话,请告诉我一声哈。

好了,所有难点都解决了,接下来只要写代码处理下逻辑就好了,直接上代码吧。

*** 自动抢红包服务*/
public class AutoOpenLuckyMoneyService extends AccessibilityService{private static final String TAG = AutoOpenLuckyMoneyService.class.getSimpleName();private static final int MSG_BACK_HOME = 0;private static final int MSG_BACK_ONCE = 1;boolean hasNotify = false;boolean hasLuckyMoney = true;@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {int eventType = event.getEventType(); // 事件类型switch (eventType) {case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED: // 通知栏事件Log.i(TAG, "TYPE_NOTIFICATION_STATE_CHANGED");if(PhoneController.isLockScreen(this)) { // 锁屏PhoneController.wakeAndUnlockScreen(this);   // 唤醒点亮屏幕}openAppByNotification(event); // 打开微信hasNotify = true;break;default:Log.i(TAG, "DEFAULT");if(hasNotify) {AccessibilityNodeInfo rootNode = getRootInActiveWindow();clickLuckyMoney(rootNode); // 点击红包String className = event.getClassName().toString();if (className.equals(UI.LUCKY_MONEY_RECEIVE_UI)) { //红包接收界面if(!openLuckyMoney()) { // 如果红包被抢光了,就返回主界面backToHome();hasNotify = false;}hasLuckyMoney = true;} else if (className.equals(UI.LUCKY_MONEY_DETAIL_UI)) { // 抢到红包backToHome();hasNotify = false;hasLuckyMoney = true;} else { // 处理没红包的情况,直接返回主界面if(!hasLuckyMoney) {handler.sendEmptyMessage(MSG_BACK_ONCE);hasLuckyMoney = true;   // 防止后退多次}}}break;}}@Overridepublic void onInterrupt() {}/*** 打开微信* @param event 事件*/private void openAppByNotification(AccessibilityEvent event) {if (event.getParcelableData() != null  && event.getParcelableData() instanceof Notification) {Notification notification = (Notification) event.getParcelableData();try {PendingIntent pendingIntent = notification.contentIntent;pendingIntent.send();} catch (PendingIntent.CanceledException e) {e.printStackTrace();}}}/*** 搜索并点击红包*/private void clickLuckyMoney(AccessibilityNodeInfo rootNode) {if(rootNode != null) {int count = rootNode.getChildCount();for (int i = count - 1; i >= 0; i--) {  // 倒序查找最新的红包AccessibilityNodeInfo node = rootNode.getChild(i);if (node == null)continue;CharSequence text = node.getText();if (text != null && text.toString().equals("领取红包")) {AccessibilityNodeInfo parent = node.getParent();while (parent != null) {if (parent.isClickable()) {parent.performAction(AccessibilityNodeInfo.ACTION_CLICK);break;}parent = parent.getParent();}}clickLuckyMoney(node);}}}/*** 打开红包*/private boolean openLuckyMoney() {AccessibilityNodeInfo rootNode = getRootInActiveWindow();if(rootNode != null) {List<AccessibilityNodeInfo> nodes =rootNode.findAccessibilityNodeInfosByViewId(UI.OPEN_LUCKY_MONEY_BUTTON_ID);for(AccessibilityNodeInfo node : nodes) {if(node.isClickable()) {Log.i(TAG, "open LuckyMoney");node.performAction(AccessibilityNodeInfo.ACTION_CLICK);return true;}}}return false;}private void backToHome() {if(handler.hasMessages(MSG_BACK_HOME)) {handler.removeMessages(MSG_BACK_HOME);}handler.sendEmptyMessage(MSG_BACK_HOME);}Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {if(msg.what == MSG_BACK_HOME) {performGlobalAction(GLOBAL_ACTION_BACK);postDelayed(new Runnable() {@Overridepublic void run() {performGlobalAction(GLOBAL_ACTION_BACK);hasLuckyMoney = false;}}, 1500);} else if(msg.what == MSG_BACK_ONCE) {postDelayed(new Runnable() {@Overridepublic void run() {Log.i(TAG, "click back");performGlobalAction(GLOBAL_ACTION_BACK);hasLuckyMoney = false;hasNotify = false;}}, 1500);}}};
}

ok,到这里就全部讲完了,小伙伴们可以自己去实现更多更有趣、更新奇的功能了。这里我只是作为技术探索,容我再啰嗦两点:

  • 朋友是很重要的,有空的话还是好好回复吧
  • 红包只是一种噱头,一种娱乐方式,别当作谋财之道喔

源码下载

Source: http://www.jianshu.com/p/405330b2ecd8

微信自动回复和自动抢红包实现原理(三):自动抢红包相关推荐

  1. 小车自动往返工作原理_自动往返小汽车

    1.任务与要求 设计并制作一个能自动往返于起跑线与终点之间的小汽车.允许用玩具汽车改装,但不能用人工遥控(包括有线遥控和无线遥控). 赛道宽度为0.5 m,表面贴有白纸,两侧有挡板,挡板与地面垂直,其 ...

  2. springboot自动配置的原理_SpringBoot自动配置原理

    SpringBoot的启动入口就是一个非常简单的run方法,这个run方法会加载一个应用所需要的所有资源和配置,最后启动应用. 通过查看run方法的源码,我们发现,run方法首先启动了一个监听器,然后 ...

  3. 小车自动往返工作原理_自动往返小车

    摘要:设计了一个自动往返和智能控制的小车.采用MSP430F149为核心芯片,选用双全桥驱动芯片作为小车电机驱动,利用PWM技术动态控制电动机的转速,红外线光电传感器检测标识线,U型红外光电传感器测量 ...

  4. SpringBoot自动配置Redis原理

    SpringBoot自动配置Redis原理 目录 SpringBoot自动配置Redis原理 一.SpringBoot自动配置Redis原理 一.自动配置redis RedisAutoConfigur ...

  5. 微信自动回复和自动抢红包实现原理(二):自动回复

    阅读这篇文章前,你需要先了解AccessibilityService,可以先阅读我上一篇文章 微信自动回复和自动抢红包实现原理(一):AccessibilityService的介绍和配置 已经了解的朋 ...

  6. 微信自动回复和自动抢红包实现原理(一):AccessibilityService的介绍和配置

    1. AccessibilityService的介绍 前几天在浏览技术博客时,看到一篇文章自动抢红包,自动安装原理之AccessibilityService.发现了Android提供了一个很有趣的辅助 ...

  7. android黑科技系列——微信抢红包插件原理解析和开发实现

    一.前言 自从几年前微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导 ...

  8. Android微信抢红包插件原理和实现 适配微信6.6.1版本

    Android微信抢红包插件原理和实现 适配微信6.6.1版本 一.前言 年关将至,小伙伴们又聊起了春节长假的旅行安排和各自家乡的年味习俗,不一而足.其中在各个微信群聊中抢红包也是为大家所津津乐道的. ...

  9. Android挂逼修炼之行---防自动抢红包外挂原理解析

    一.前言 春节过年发个红包本来就是为了讨个喜庆,朋友亲戚之间的关系交流,但是现在随着技术变革,抢红包插件越来越多,导致现在不太愿意发红包了,特别是在一个多人群里,潜水的非常多,但是丢个红包瞬间就没了, ...

最新文章

  1. 模式的秘密-观察者模式(四)
  2. java常用注解汇总_Spring常用注解汇总
  3. zabbis监控mysql数据库
  4. HDU 1561 The more ,The Better
  5. JavaScript高级程序设计(第三版)学习笔记1~5章
  6. 如何使用Maven scope
  7. leetcode No.123 买卖股票的最佳时机 III
  8. Poor God Water【矩阵快速幂】
  9. 个人计算机网刻系统,全自动网刻后修改计算机配置信息(网管轻松方便)
  10. 隐藏html文本节点,javascript-D3-仅显示/隐藏单击节点的文本
  11. acs880变频器静态辨识_ACS880变频器PID控制参数设置
  12. movs 数据传送指令_1.数据传送指令中,错误的操作是()。 A.MOVSS[BX+DI],1000H B.......
  13. 为什么程序员大多数都会脱发?( ConcurrentHashMap 并发)
  14. ftp误删服务器文件恢复,ftp服务器文件误删
  15. FreeRTOS移植Error: L6218E: Undefined symbol xTaskGetCurrentTaskHandle (referred from stream_buffer.o).
  16. 荒野行动8月1日服务器维护,荒野行动手游12月21日服务器维护到几点 12月21日具体开服时间公告...
  17. Django restframework 认证
  18. findContours函数详细解析
  19. 数字媒体技术专业方向
  20. MATLAB仿真Gough-Stewart并联机器人斯图尔特6自由度并联机器人逆运动学仿真 动力学控制pid控制

热门文章

  1. 正式进驻1410实验室!
  2. Go报错:more than one character in rune literal
  3. C++ 中const的用法,特别是用在函数前面与后面的区别!
  4. 快慢指针寻找循环节点
  5. ImportError: No module named sklearn.metrics
  6. 《Neural network and deep learning》学习笔记(一)
  7. [云炬创业基础笔记]第十章企业的利润计划测试2
  8. [云炬创业基础笔记]第七张创业团队测试9
  9. [云炬创业基础笔记]第七张创业团队测试6
  10. 科大星云诗社动态20201222