[关闭]
@coder-pig 2018-04-09T17:54:03.000000Z 字数 3594 阅读 3364

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

2018


引言

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

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

我还记得那天早上,我兴高采烈早早来到公司,更新了一波代码准备为
我的机器人添砖加瓦的时候,当我关闭了阿里云上的脚本,这时候意外来了,
我的机器人小号,再也无法通过微信网页端的接口登录了!!!
扫描完二维码,永远提示的都是下面这样一句话:

  1. <error><ret>1203</ret><message>当前登录环境异常。为了你的帐号安全,暂时不能登录web微信。
  2. 你可以通过Windows微信、Mac微信或者手机客户端微信登录。</message></error>

是的,就是这样一句话,找不到申诉渠道,也不知道何时才可能会解封。(客户端任可正常使用)
而现在另外新申请的微信小号是无法登录微信网页端的,其实这是微信在慢慢关停网页版登录,
最主要的原因就是机器人泛滥!

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

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

抢红包,自动安装,一键XXX等等,可谓欣欣向荣。

使用AccessibilityService也非常Easy,核心要点就是:

通过UI Automator找到节点,通过resource-id,text,content-desc等
唯一特征定位到具体的节点,接着执行各种模拟操作,点,滚动,填充,
用法比较简单的,大部分时间会花在试错和逻辑调整上

来一发通过AccessibilityService实现的自动加好友以及拉人进群聊的Gif体验下:

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


AccessibilityService用法简介

1.自定义Service继承AccessibilityService

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

onInterrupt( ):辅助功能中断的回调,基本不用理,核心还是
onAccessibilityEvent(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()给打印出来,
然后自行去判断~

如图就可以拿到event类型,以及产生对应事件的类名,核心是这两个,
除此之外还有Text和ContentDescription等。

比如我那个监听Notification跳转到添加好友页的:

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

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

2.服务的配置

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

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged|typeWindowContentChanged"
  4. android:accessibilityFeedbackType="feedbackGeneric"
  5. android:accessibilityFlags="flagDefault"
  6. android:canRetrieveWindowContent="true"
  7. android:notificationTimeout="100"
  8. android:packageNames="com.tencent.mm"
  9. android:settingsActivity="com.coderpig.wechathelper.MainActivity" />

属性简介如下

  • accessibilityEventTypes:设置监听的事件种类,用|隔开,监听所有可以用typeAllMask;
  • accessibilityFeedbackType:服务提供的反馈类型,feedbackGeneric通用反馈;
  • accessibilityFlags:辅助功能附加的标志,flagDefault默认的配置
  • canRetrieveWindowContent:辅助功能服务是否能够取回活动窗口内容的属性
  • notificationTimeout:响应时间
  • packageNames:监听的应用包名,不填,默认监听所有应用的事件
  • settingsActivity:允许用户修改辅助功能的activity类名

Step 2:接着AndroidManifest.xml文件中对该Service进行配置

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

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

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


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注