使用AccessibilityService实现微信自动发送消息。
使用AccessibilityService实现微信自动发送消息
最近公司需要一个小工具,能够通过导入Excel
,读取 Excel
内容精准微信一对一发送消息,本来想过通过微信Web版模拟点击,但是这样限制有点多了,于是想到了 Android
上的 AccessibilityService 来实现模拟点击功能。
效果图
导入Excel读取内容之后,发送消息的操作就能全部不需要手动操作了。
开始
除去文件选择、Excel的读取之外的步骤:
- 启动微信
- 监测微信首页的搜索按钮
- 复制内容填充到搜索框并点击
- 选中搜索的联系人
- 找到聊天界面的输入框并填充内容
- 找到发送按钮并点击
- 微信界面返回、搜索界面返回。
官方说明
Accessibility services should only be used to assist users with disabilities in using Android devices and apps.
大意就是Accessibility services
是用于帮助那些无法正常使用Android设备及APP的残障人士准备的。
AccessibilityService
可以在后台接收到系统的操作反馈,比如按钮点击,获取焦点等。
使用
使用AccessibilityService
只需要三步。
继承系统AccessibilityService
1
2
3
4
5
6
7
8
9
10
class WeChatAccessService : AccessibilityService() {
override fun onInterrupt() {
}
override fun onAccessibilityEvent(event: AccessibilityEvent?) {
}
}
在资源目录res下新建xml文件夹,新建accessibility-service.xml文件
1
2
3
4
5
6
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagDefault"
android:canRetrieveWindowContent="true"
android:notificationTimeout="100"/>
- accessibilityEventTypes:表示该服务对界面中的哪些变化感兴趣,即哪些事件通知,比如窗口打开,滑动,焦点变化,长按等.具体的值可以在AccessibilityEvent类中查到。如typeAllMask表示接受所有的事件通知。
- accessibilityFeedbackType:反馈方式,比如语音播放、震动。
- accessibilityFlags:辅助服务额外的flag信息,例如
FLAG_REPORT_VIEW_IDS
可以使回调的事件带上view的ID。 - canRetrieveWindowContent:是否可以获取窗口内容。
- android:notificationTimeout:两个同样类型的辅助事件接收的最小时间间隔。
- packageNames:指明了自己的辅助服务关心哪些应用发出的事件,多个应用包名之间用逗号分隔,如果不填,则关注手机上所有应用发出的事件。如果只关注微信发出的事件,则这里填
com.tencent.mm
。
注册
在Manifest中注册
1
2
3
4
5
6
7
8
9
10
11
12
13
<service
android:name=".WeChatAccessService"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/access_service_config" />
</service>
由于这个功能过于开放,所以每次使用都需要用户授权,Google的初衷是好的,但是好像国人发力的方向似乎有点问题。我做这个微信自动发消息干嘛!!
实现微信自动发送消息
由于每次微信更新,对应的view id都会变化,本文以微信7.0.4版本为例,查找view id可以用Hierarchy Viewer
,能看布局id也能看布局层级。
剩下的都是一些具体的代码,没啥好记录的了。