妙用AccessibilityService黑科技实现微信自动加好友拉人进群聊

妙用AccessibilityService黑科技实现微信自动加好友拉人进群聊

标签: 2018


引言

在上上周的周六和周日,我发了两篇利用itchat实现微信机器人的文章(Python):

  • 小猪的Python学习之旅 —— 18.Python微信转发小宇宙早
  • 小猪的Python学习之旅 —— 19.Python微信自动好友验证,自动回复,发送群聊链接

通过把脚本挂到服务器上,自此告别手动挡,不用去手动转发小宇宙,
不用手动加好友,然后把别人一个个拉到我的Py交易群里。正当我
暗自窃喜的时候,微信并没有放过我这只小猫咪。

没有了 页版微信,日子还是要过的,难道只能回归手动档么种解决方案:

  • 1.研究客户端协议(这个成本巨高,而且官方稍微改点东西,够你哭的)
  • 2.APP逆向,利用Xposed框架,hook相关的方法,也是有些研究成本的;
  • 3.利用类似与按键精灵的东西,编写脚本让他自动点点点,自动化测试
    工具或者本节讲的这个无障碍服务——AccessibilityService

AccessibilityService其实不是一个新的东西了,老久之前就有了,
官方原意:优化残障人士的使用体验的,而在我大天朝:

Gif加速了一点,不过完成加好友以及拉人总共也就耗时15s,是相当客观的啦。
下面就来介绍下AccessibilityService这个玩意怎么用吧~


AccessibilityService用法简介

1.自定义Service继承AccessibilityService

如题,自定义一个AccessibilityService类,重写两个主要方法:

( ):辅助功能中断的回调,基本不用理,核心还是
(AccessibilityEvent event) 上。

当界面发生了什么事情,比如顶部Notification,界面更新,内容变化等,
会触发这个方法,你可以根据不同的事件响应不同的操作,比如小猪这个
就是当顶部出现加好友的Notification的event时,跳转到加好友页。
点开AccessibilityEvent类可以看到一堆的事件类型~

事件类型 描述
TYPE_VIEW_CLICKED View被点击
TYPE_VIEW_LONG_CLICKED View被长按
TYPE_VIEW_SELECTED View被选中
TYPE_VIEW_FOCUSED View获得焦点
TYPE_VIEW_TEXT_CHANGED View文本变化
TYPE_WINDOW_STATE_CHANGED 打开了一个PopupWindow,Menu或Dialog
TYPE_NOTIFICATION_STATE_CHANGED Notification变化
TYPE_VIEW_HOVER_ENTER 一个View进入悬停
TYPE_VIEW_HOVER_EXIT 一个View退出悬停
TYPE_TOUCH_EXPLORATION_GESTURE_START 触摸浏览事件开始
TYPE_TOUCH_EXPLORATION_GESTURE_END 触摸浏览事件完成
TYPE_WINDOW_CONTENT_CHANGED 窗口的内容发生变化,或子树根布局发生变化
TYPE_VIEW_SCROLLED View滚动
TYPE_VIEW_TEXT_SELECTION_CHANGED Edittext文字选中发生改变事件
TYPE_ANNOUNCEMENT 应用产生一个通知事件
TYPE_VIEW_ACCESSIBILITY_FOCUSED 获得无障碍焦点事件
TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED 无障碍焦点事件清除
TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY 在给定的移动粒度下遍历视图文本的事件
TYPE_GESTURE_DETECTION_START 开始手势监测
TYPE_GESTURE_DETECTION_END 结束手势监测
TYPE_TOUCH_INTERACTION_START 触摸屏幕事件开始
TYPE_TOUCH_INTERACTION_END 触摸屏幕事件结束
TYPE_WINDOWS_CHANGED 屏幕上的窗口变化事件,需要API 21+
TYPE_VIEW_CONTEXT_CLICKED View中的上下文点击事件
TYPE_ASSIST_READING_CONTEXT 辅助用户读取当前屏幕事件

好吧,上面的表其实并没什么大用,我还是习惯直接把event.toString()给打印出来,
然后自行去判断~

这里就是对事件类型做了下判断,然后获取contentIntent,跳转而已。
简单点讲就是:

你在这个方法里,去判断一波事件类型和className,
然后再获取控件,做一些点击,滚动,填充文本等。


2.服务的配置

自定义完这个服务要想让他启用你还得执行下面的操作:

Step 1:在res文件夹下创建xml文件夹,新建一个配置的xml文件(名字自己定)

这里是你那个配置文件xml文件的文件名,其他照抄。

Step 3:安装到手机后,需要在手机设置的无障碍处开启服务

一般在设置的辅助功能处能找到:

依次点击:选中设备 -> Dump View Hierarchy for UI Automator

右侧可以拿到对应的信息,一般比较常用的是这几个,有一点要注意!!!
resource-id不一定是唯一的

获得控件基本都会通过下述这个方法:

( ):获取当前整个活动窗口的根节点
返回的是一个类,代表View的状态信息,
提供了下述几个非常实用的方法:

  • getParent:获取父节点。
  • getChild:获取子节点。
  • performAction:在节点上执行一个动作。
  • findAccessibilityNodeInfosByText:通过字符串查找节点元素。
  • findAccessibilityNodeInfosByViewId:通过视图id查找节点元素。

后面的这两个方法会返回一个AccessibilityNodeInfo列表,一般操作是
遍历,然后筛选特定节点,比如我程序里的,获得底部Tab节点为”通讯录”,
然后点击,跳转后遍历,筛选”群聊”的节点,点击。

拿到控件,接着就到触发事件了。


4.触发事件

通过调用()传入一个时间类型即可触发相应时间,比如点击,长按等
事件就多了,自己点开AccessibilityNodeInfo类查看吧,这里介绍下最常用的几个事件:

除了控件触发事件外,AccessibilityService提供了一个(),用于执行
一些通用的事件

另外在实际开发中,直接调用这些全局方法又是并没有生效,
我在调GLOBAL_ACTION_BACK的时候就发现有时不会回退,
个人的解决方案是使用handler.postDelay()延时执行:

上面的步骤是:

进入群聊聊天信息页后,列表滚动两次,接着依次:

  • 1.延时1s后,找到添加成员按钮并点击;
  • 2.延时2.3s后,把名字填充到EditText里
  • 3.延时3s后,点击确定按钮

就不用过于依赖onAccessibilityEvent方法,除了用handler.postDelay外,
还可以用Thread.sleep(休眠时长),用到的点大概就这么多,其余的自行探究吧。


小结

本节讲解一波如何通过AccessibilityService来实现自动加好友以及拉人进群,
之前是打算用xposed来写的,后面发现没我想像中简单,而且很多用安卓机的都
不会搞机(基),root也不会,后来还是选择了AccessibilityService,简单易用,
当然后面还是会研究一波xposed实现的,敬请期待~
对了,还有,之前那个 页端的机器人被封原因估计是信息秒回,如果有还用
itchat那个做机器人的,建议回复的时间可以稍微延长些;

关于AccessibilityService更多内容可见

  • Android辅助功能:https://blog.csdn.net/qq_24800377/article/details/78283662
  • Building Accessibility Services:https://developer.android.com/guide/topics/ui/accessibility/services.html
  • Developing an Accessibility Service:https://developer.android.com/training/accessibility/service.html

附:关键代码(都可以在:https://github.com/coder-pig/WechatHelper 找到):
代码有Bug的话正常,后续会优化下逻辑,感觉写得有点杂~

妙用AccessibilityService黑科技实现微信自动加好友拉人进群聊

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年3月7日
下一篇 2018年3月8日

相关推荐