背景
要实现微信自动化,大致有这么几种办法
- 基于Web微信API的框架 如 # wechaty 这里以这个举例是因为他有个付费版,可以自动发朋友圈,可以分享卡片,可以做群管理,很是方便快捷 ,但是太贵了,200块大洋一个月,你用了之后预计就甩不掉了。
- 基于xposed 插件开发 ,通过广播方式和sdk 交互,只要发送广播就可以自动发送朋友圈,但是实现难度相对较高,需要逆向知识,还有被封号的风险,不可取。
- 基于AccessibilityService实现,有一个自动抢红包的功能就是通过他实现的,原本该功能是对那些由于视力、听力或其它身体原因导致不能方便使用Android智能手机的用户,Android提供了Accessibility功能和服务帮助这些用户更加简单地操作设备,包括文字转语音(不支持中文)、触觉反馈、手势操作、轨迹球和手柄操作等,到Android 4.1版本以后,系统辅助服务增加了与窗口元素的双向交互,此时可以通过辅助功能服务操作窗口元素,比如点击按钮、输入文本信息等功能,越来越方便。
这些方法各有利弊,综合看来,第一种实现总会有一天微信说要关闭web服务,那岂不是很惨,第二种风险在于被封号,只有第三种目前看来最合适,想要自动发送朋友圈,AccessibilityService是最完美的实现。知其然知其所以然,我们要想用好AccessibilityService,就要明白其原理,这样能更好的理解每一步操作的含义,少走弯路,避免考虑不周导致成功率不足。
自动化视频效果展示:
在做的过程中,也遇到很多问题,例如经常拿不到
AccessibilityNodeInfo实例,如果拿不到就无法操作当前界面的元素,等于是无法再执行下去了,这里有几个关键点需要注意的,只要注意这几个就可以完美拿到。卖个关子,下面会提到,请往下看。
AccessibilityService原理
先大致了解下原理,对你的使用更是事半功倍。
类图源于 here
分析下这个类图。
- AccessibilityService:最主要的onBind()、onAccessibilityEvent(event: AccessibilityEvent)、onInterrupt()三个函数,后面两个需要子类实现,onBind已经实现了,看下这个函数源码 直接return了一个静态内部类IAccessibilityServiceClientWrapper
public final IBinder onBind(Intent intent) { return
new IAccessibilityServiceClientWrapper(this, getMainLooper(), new Callbacks() {
}
}