@coder-pig
2018-04-09T17:54:03.000000Z
字数 3594
阅读 3386
2018
引言:
在上上周的周六和周日,我发了两篇利用itchat实现微信机器人的文章(Python):
通过把脚本挂到服务器上,自此告别手动挡,不用去手动转发小宇宙,
不用手动加好友,然后把别人一个个拉到我的Py交易群里。正当我
暗自窃喜的时候,微信并没有放过我这只小猫咪。
我还记得那天早上,我兴高采烈早早来到公司,更新了一波代码准备为
我的机器人添砖加瓦的时候,当我关闭了阿里云上的脚本,这时候意外来了,
我的机器人小号,再也无法通过微信网页端的接口登录了!!!
扫描完二维码,永远提示的都是下面这样一句话:
<error><ret>1203</ret><message>当前登录环境异常。为了你的帐号安全,暂时不能登录web微信。
你可以通过Windows微信、Mac微信或者手机客户端微信登录。</message></error>
是的,就是这样一句话,找不到申诉渠道,也不知道何时才可能会解封。(客户端任可正常使用)
而现在另外新申请的微信小号是无法登录微信网页端的,其实这是微信在慢慢关停网页版登录,
最主要的原因就是机器人泛滥!
没有了网页版微信,日子还是要过的,难道只能回归手动档么?几种解决方案:
AccessibilityService其实不是一个新的东西了,老久之前就有了,
官方原意:优化残障人士的使用体验的,而在我大天朝:
抢红包,自动安装,一键XXX等等,可谓欣欣向荣。
使用AccessibilityService也非常Easy,核心要点就是:
通过UI Automator找到节点,通过resource-id,text,content-desc等
唯一特征定位到具体的节点,接着执行各种模拟操作,点,滚动,填充,
用法比较简单的,大部分时间会花在试错和逻辑调整上!
来一发通过AccessibilityService实现的自动加好友以及拉人进群聊的Gif体验下:
Gif加速了一点,不过完成加好友以及拉人总共也就耗时15s,是相当客观的啦。
下面就来介绍下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,
然后再获取控件,做一些点击,滚动,填充文本等。
自定义完这个服务要想让他启用你还得执行下面的操作:
Step 1:在res文件夹下创建xml文件夹,新建一个配置的xml文件(名字自己定)
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged|typeWindowContentChanged"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagDefault"
android:canRetrieveWindowContent="true"
android:notificationTimeout="100"
android:packageNames="com.tencent.mm"
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:安装到手机后,需要在手机设置的无障碍处开启服务
一般在设置的辅助功能处能找到: