妙用AccessibilityService黑科技实现微信自动加好友拉人进群聊1.标签:2018
2.引言:
3.在上上周的周六和周日,我发了两篇利用itchat实现微信机器人的文章(Python):
小猪的Python学习之旅——18.Python微信转发小宇宙早报小猪的Python学习之旅——19.Python微信自动好友验证,自动回复,发送群聊链接4.通过把脚本挂到服务器上,自此告别手动挡,不用去手动转发小宇宙,不用手动加好友,然后把别人一个个拉到我的Py交易群里。正当我暗自窃喜的时候,微信并没有放过我这只小猫咪。
5.我还记得那天早上,我兴高采烈早早来到公司,更新了一波代码准备为我的机器人添砖加瓦的时候,当我关闭了阿里云上的脚本,这时候意外来了,我的机器人小号,再也无法通过微信网页端的接口登录了!!!扫描完二维码,永远提示的都是下面这样一句话:
errorret1203/retmessage当前登录环境异常。为了你的帐号安全,暂时不能登录web微信。你可以通过Windows微信、Mac微信或者手机客户端微信登录。/message/error6.是的,就是这样一句话,找不到申诉渠道,也不知道何时才可能会解封。(客户端任可正常使用)而现在另外新申请的微信小号是无法登录微信网页端的,其实这是微信在慢慢关停网页版登录,最主要的原因就是机器人泛滥!
7.没有了网页版微信,日子还是要过的,难道只能回归手动档么?几种解决方案:
1.研究客户端协议(这个成本巨高,而且官方稍微改点东西,够你哭的)2.APP逆向,利用Xposed框架,hook相关的方法,也是有些研究成本的;3.利用类似与按键精灵的东西,编写脚本让他自动点点点,自动化测试工具或者本节讲的这个无障碍服务——AccessibilityService8.AccessibilityService其实不是一个新的东西了,老久之前就有了,官方原意:优化残障人士的使用体验的,而在我大天朝:
9.抢红包,自动安装,一键XXX等等,可谓欣欣向荣。
10.使用AccessibilityService也非常Easy,核心要点就是:
11.通过UIAutomator找到节点,通过resource-id,text,content-desc等唯一特征定位到具体的节点,接着执行各种模拟操作,点,滚动,填充,用法比较简单的,大部分时间会花在试错和逻辑调整上!
12.来一发通过AccessibilityService实现的自动加好友以及拉人进群聊的Gif体验下:
13.Gif加速了一点,不过完成加好友以及拉人总共也就耗时15s,是相当客观的啦。下面就来介绍下AccessibilityService这个玩意怎么用吧~
AccessibilityService用法简介1.自定义Service继承AccessibilityService14.如题,自定义一个AccessibilityService类,重写两个主要方法:
15.onInterrupt():辅助功能中断的回调,基本不用理,核心还是onAccessibilityEvent(AccessibilityEventevent)上。
16.当界面发生了什么事情,比如顶部Notification,界面更新,内容变化等,会触发这个方法,你可以根据不同的事件响应不同的操作,比如小猪这个就是当顶部出现加好友的Notification的event时,跳转到加好友页。点开AccessibilityEvent类可以看到一堆的事件类型~
事件类型描述TYPE_VIEW_CLICKEDView被点击TYPE_VIEW_LONG_CLICKEDView被长按TYPE_VIEW_SELECTEDView被选中TYPE_VIEW_FOCUSEDView获得焦点TYPE_VIEW_TEXT_CHANGEDView文本变化TYPE_WINDOW_STATE_CHANGED打开了一个PopupWindow,Menu或DialogTYPE_NOTIFICATION_STATE_CHANGEDNotification变化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_SCROLLEDView滚动TYPE_VIEW_TEXT_SELECTION_CHANGEDEdittext文字选中发生改变事件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屏幕上的窗口变化事件,需要API21+TYPE_VIEW_CONTEXT_CLICKEDView中的上下文点击事件TYPE_ASSIST_READING_CONTEXT辅助用户读取当前屏幕事件17.好吧,上面的表其实并没什么大用,我还是习惯直接把event.toString()给打印出来,然后自行去判断~
18.如图就可以拿到event类型,以及产生对应事件的类名,核心是这两个,除此之外还有Text和ContentDescription等。
19.比如我那个监听Notification跳转到添加好友页的:
20.这里就是对事件类型做了下判断,然后获取contentIntent,跳转而已。简单点讲就是:
21.你在这个方法里,去判断一波事件类型和className,然后再获取控件,做一些点击,滚动,填充文本等。
2.服务的配置22.自定义完这个服务要想让他启用你还得执行下面的操作:
23.Step1:在res文件夹下创建xml文件夹,新建一个配置的xml文件(名字自己定)
?xmlversion"1.0"encoding"utf-8"?accessibility-servicexmlns: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"/24.属性简介如下:
accessibilityEventTypes:设置监听的事件种类,用|隔开,监听所有可以用typeAllMask;accessibilityFeedbackType:服务提供的反馈类型,feedbackGeneric通用反馈;accessibilityFlags:辅助功能附加的标志,flagDefault默认的配置canRetrieveWindowContent:辅助功能服务是否能够取回活动窗口内容的属性notificationTimeout:响应时间packageNames:监听的应用包名,不填,默认监听所有应用的事件settingsActivity:允许用户修改辅助功能的activity类名25.Step2:接着AndroidManifest.xml文件中对该Service进行配置
26.先是添加一个权限:
android:permission"android.permission.BIND_ACCESSIBILITY_SERVICE"27.接着是Service的配置:
28.这里是你那个配置文件xml文件的文件名,其他照抄。
29.Step3:安装到手机后,需要在手机设置的无障碍处开启服务
30.一般在设置的辅助功能处能找到:
31.如果Logcat那里能看到打印的LOG,说明服务正常运行,接下来要找控件节点
3.找控件32.这里可以用到神器UIAutomator来查看布局层次,打开AndroidStudio,Ctrl+alt+A,输入monitor
33.依次点击:选中设备-DumpViewHierarchyforUIAutomator
34.稍等一会,右侧就会出现当前页面的布局层次图,如图随手选中一个邀请的节点:
35.右侧可以拿到对应的信息,一般比较常用的是这几个,有一点要注意!!!resource-id不一定是唯一的
36.获得控件基本都会通过下述这个方法:
37.getRootInActiveWindow():获取当前整个活动窗口的根节点返回的是一个AccessibilityNodeInfo类,代表View的状态信息,提供了下述几个非常实用的方法:
getParent:获取父节点。getChild:获取子节点。performAction:在节点上执行一个动作。findAccessibilityNodeInfosByText:通过字符串查找节点元素。findAccessibilityNodeInfosByViewId:通过视图id查找节点元素。38.后面的这两个方法会返回一个AccessibilityNodeInfo列表,一般操作是遍历,然后筛选特定节点,比如我程序里的,获得底部Tab节点为”通讯录”,然后点击,跳转后遍历,筛选”群聊”的节点,点击。
39.另外,UIAutomator有时并不可靠(实时问题),我建议写多一个遍历节点的方法,可以更清楚里面的控件情况:
40.拿到控件,接着就到触发事件了。
4.触发事件41.通过调用performAction()传入一个时间类型即可触发相应时间,比如点击,长按等事件就多了,自己点开AccessibilityNodeInfo类查看吧,这里介绍下最常用的几个事件:
//点击performAction(AccessibilityNodeInfo.ACTION_CLICK);//长按performAction(AccessibilityNodeInfo.ACTION_LONG_CLICK);//滚动performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);//向下滚一下performAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);//向上滚一下//填充EditText(API版本需要18可用方法1,API21两种方法都可以使用)//方法1:ClipboardManagerclipboard(ClipboardManager)this.getSystemService(Context.CLIPBOARD_SERVICE);ClipDataclipClipData.newPlainText("text","填充内容");clipboard.setPrimaryClip(clip);//获得焦点info.performAction(AccessibilityNodeInfo.ACTION_FOCUS);////粘贴进入内容info.performAction(AccessibilityNodeInfo.ACTION_PASTE);//方法2:BundleargumentsnewBundle();arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE,"填充内容");info.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT,arguments);42.除了控件触发事件外,AccessibilityService提供了一个performGlobalAction(),用于执行一些通用的事件:
GLOBAL_ACTION_BACK点击返回按钮GLOBAL_ACTION_HOME点击homeGLOBAL_ACTION_NOTIFICATIONS打开通知GLOBAL_ACTION_RECENTS打开最近应用GLOBAL_ACTION_QUICK_SETTINGS打开快速设置GLOBAL_ACTION_POWER_DIALOG打开长按电源键的弹框43.另外在实际开发中,直接调用这些全局方法又是并没有生效,我在调GLOBAL_ACTION_BACK的时候就发现有时不会回退,个人的解决方案是使用handler.postDelay()延时执行:
44.除了这样玩以外,我还利用时间差,串行去执行几个任务,比如:
45.上面的步骤是:
46.进入群聊聊天信息页后,列表滚动两次,接着依次:
1.延时1s后,找到添加成员按钮并点击;2.延时2.3s后,把名字填充到EditText里3.延时3s后,点击确定按钮47.就不用过于依赖onAccessibilityEvent方法,除了用handler.postDelay外,还可以用Thread.sleep(休眠时长),用到的点大概就这么多,其余的自行探究吧。
小结48.本节讲解一波如何通过AccessibilityService来实现自动加好友以及拉人进群,之前是打算用xposed来写的,后面发现没我想像中简单,而且很多用安卓机的都不会搞机(基),root也不会,后来还是选择了AccessibilityService,简单易用,当然后面还是会研究一波xposed实现的,敬请期待~对了,还有,之前那个网页端的机器人被封原因估计是信息秒回,如果有还用itchat那个做机器人的,建议回复的时间可以稍微延长些;
49.关于AccessibilityService更多内容可见:
Android辅助功能:https://blog.csdn.net/qq_24800377/article/details/78283662BuildingAccessibilityServices:https://developer.android.com/guide/topics/ui/accessibility/services.htmlDevelopinganAccessibilityService:https://developer.android.com/training/accessibility/service.html50.附:关键代码(都可以在:https://github.com/coder-pig/WechatHelper找到):代码有Bug的话正常,后续会优化下逻辑,感觉写得有点杂~
packagecom.coderpig.wechathelper;importandroid.accessibilityservice.AccessibilityService;importandroid.app.Notification;importandroid.app.PendingIntent;importandroid.os.Bundle;importandroid.os.Handler;importandroid.util.Log;importandroid.view.accessibility.AccessibilityEvent;importandroid.view.accessibility.AccessibilityNodeInfo;importjava.util.List;/***描述:微信监控服务类**@authorCoderPigon2018/04/0413:46.*/publicclassHelperServiceextendsAccessibilityService{privatestaticfinalStringTAG"HelperService";privateHandlerhandlernewHandler();privateStringuserName"123";@OverridepublicvoidonAccessibilityEvent(AccessibilityEventevent){inteventTypeevent.getEventType();CharSequenceclassNameChrevent.getClassName();StringclassNameclassNameChr.toString();Log.d(TAG,event.toString());switch(eventType){caseAccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:if(event.getParcelableData()!nullevent.getParcelableData()instanceofNotification){Notificationnotification(Notification)event.getParcelableData();Stringcontentnotification.tickerText.toString();if(content.contains("请求添加你为朋友")){PendingIntentpendingIntentnotification.contentIntent;try{pendingIntent.send();}catch(PendingIntent.CanceledExceptione){e.printStackTrace();}}}break;caseAccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:switch(className){case"com.tencent.mm.plugin.subapp.ui.friend.FMessageConversationUI":addFriend();break;case"com.tencent.mm.plugin.profile.ui.SayHiWithSnsPermissionUI":verifyFriend();break;case"com.tencent.mm.plugin.profile.ui.ContactInfoUI":performBackClick();break;case"com.tencent.mm.ui.LauncherUI":if(!userName.equals("123")){openGroup();}break;case"com.tencent.mm.ui.contact.ChatroomContactUI":if(!userName.equals("123")){inviteGroup();}break;case"com.tencent.mm.ui.chatting.ChattingUI":if(!userName.equals("123")){openGroupSetting();}break;case"com.tencent.mm.plugin.chatroom.ui.ChatroomInfoUI":if(userName.equals("123")){performBackClick();}else{addToGroup();}break;case"com.tencent.mm.ui.base.i":dialogClick();break;}break;caseAccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED:}}privatevoidaddFriend(){AccessibilityNodeInfonodeInfogetRootInActiveWindow();if(nodeInfo!null){ListAccessibilityNodeInfolistnodeInfo.findAccessibilityNodeInfosByText("接受");if(list!nulllist.size()0){for(AccessibilityNodeInfon:list){n.performAction(AccessibilityNodeInfo.ACTION_CLICK);}}else{performBackClick();}}}privatevoidverifyFriend(){AccessibilityNodeInfonodeInfogetRootInActiveWindow();//获得用户名if(nodeInfo!null){userNamenodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/d0n").get(0).getText().toString();AccessibilityNodeInfofinishNodenodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/hd").get(0);finishNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);}}privatevoidopenGroup(){AccessibilityNodeInfonodeInfogetRootInActiveWindow();if(nodeInfo!null){ListAccessibilityNodeInfonodesnodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/ca5");for(AccessibilityNodeInfoinfo:nodes){if(info.getText().toString().equals("通讯录")){info.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);handler.postDelayed(newRunnable(){@Overridepublicvoidrun(){AccessibilityNodeInfonodeInfogetRootInActiveWindow();if(nodeInfo!null){ListAccessibilityNodeInfonodesnodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/j5");for(AccessibilityNodeInfoinfo:nodes){if(info.getText().toString().equals("群聊")){info.getParent().getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);break;}}}}},500L);}}}}privatevoidinviteGroup(){AccessibilityNodeInfonodeInfogetRootInActiveWindow();if(nodeInfo!null){ListAccessibilityNodeInfonodesnodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/a9v");for(AccessibilityNodeInfoinfo:nodes){if(info.getText().toString().equals("小猪的Python学习交流群")){info.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);break;}}}}privatevoidopenGroupSetting(){AccessibilityNodeInfonodeInfogetRootInActiveWindow();if(nodeInfo!null){nodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/he").get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);}}privatevoidaddToGroup(){AccessibilityNodeInfonodeInfogetRootInActiveWindow();if(nodeInfo!null){ListAccessibilityNodeInfolistNodesnodeInfo.findAccessibilityNodeInfosByViewId("android:id/list");if(listNodes!nulllistNodes.size()0){AccessibilityNodeInfolistNodelistNodes.get(0);listNode.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);listNode.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);finalAccessibilityNodeInfoscrollNodeInfogetRootInActiveWindow();if(scrollNodeInfo!null){handler.postDelayed(newRunnable(){@Overridepublicvoidrun(){ListAccessibilityNodeInfonodesscrollNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/d0b");for(AccessibilityNodeInfoinfo:nodes){if(info.getContentDescription().toString().equals("添加成员")){info.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);break;}}}},1000L);handler.postDelayed(newRunnable(){@Overridepublicvoidrun(){ListAccessibilityNodeInfoeditNodesgetRootInActiveWindow().findAccessibilityNodeInfosByViewId("com.tencent.mm:id/arz");if(editNodes!nulleditNodes.size()0){AccessibilityNodeInfoeditNodeeditNodes.get(0);BundleargumentsnewBundle();arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE,userName);editNode.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT,arguments);}}},2300L);handler.postDelayed(newRunnable(){@Overridepublicvoidrun(){ListAccessibilityNodeInfocbNodesgetRootInActiveWindow().findAccessibilityNodeInfosByViewId("com.tencent.mm:id/kr");if(cbNodes!null){AccessibilityNodeInfocbNodenull;if(cbNodes.size()1){cbNodecbNodes.get(0);}elseif(cbNodes.size()2){cbNodecbNodes.get(1);}if(cbNode!null){cbNode.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);AccessibilityNodeInfosureNodegetRootInActiveWindow().findAccessibilityNodeInfosByViewId("com.tencent.mm:id/hd").get(0);sureNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);}}}},3000L);}}}}privatevoiddialogClick(){AccessibilityNodeInfoinviteNodegetRootInActiveWindow().findAccessibilityNodeInfosByViewId("com.tencent.mm:id/aln").get(0);inviteNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);userName"123";handler.postDelayed(newRunnable(){@Overridepublicvoidrun(){ListAccessibilityNodeInfosureNodesgetRootInActiveWindow().findAccessibilityNodeInfosByViewId("com.tencent.mm:id/aln");if(sureNodes!nullsureNodes.size()0){AccessibilityNodeInfosureNodesureNodes.get(0);sureNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);}}},1000L);}privatevoidperformBackClick(){handler.postDelayed(newRunnable(){@Overridepublicvoidrun(){performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);}},300L);}//遍历控件的方法publicvoidrecycle(AccessibilityNodeInfoinfo){if(info.getChildCount()0){Log.i(TAG,"childwidget----------------------------"+info.getClassName().toString());Log.i(TAG,"showDialog:"+info.canOpenPopup());Log.i(TAG,"Text:"+info.getText());Log.i(TAG,"windowId:"+info.getWindowId());Log.i(TAG,"desc:"+info.getContentDescription());}else{for(inti0;iinfo.getChildCount();i++){if(info.getChild(i)!null){recycle(info.getChild(i));}}}}@OverridepublicvoidonInterrupt(){}}51.来啊,Py交易啊
52.想加群一起学习Py的可以加下,智障机器人小Pig,验证信息里包含:Python,python,py,Py,加群,交易,屁眼中的一个关键词即可通过;
53.验证通过后回复加群即可获得加群链接(不要把机器人玩坏了!!!)~~~欢迎各种像我一样的Py初学者,Py大神加入,一起愉快地交流学♂习,van♂转py。
妙用AccessibilityService黑科技实现微信自动加好友拉人进群聊-微信加好友工具-微信小程序怎么搭建
浏览量:1874
时间:
来源:coder-pig
版权声明
即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。
最新资讯
-

即速应用,赋能企业玩转微信小程序智慧经营
作为国内领军的智慧商业经营服务商,即速应用始终秉承“让每个企业都拥有自己的智慧店铺”的愿景,持续赋能更多企业玩转智慧经营。即速应用旗下拥有“小程序搭建工具-即速应用”、“私域流量专家-即客云”等产品,帮助商家打通互联网全生态营销闭环。 -

即客云2.0重磅更新,让微信小程序运营更简单!
即客云作为一款基于企业微信的第三方工具,现从多维度提供超过30种功能,自上线以来,已服务多家企业,受到一致好评。近期,我们根据客户反馈和市场调研正式推出升级版 即客云2.0!更新了私域运营SOP,群日历功能,批量拓客,客户雷达,消息推送,个人欢迎语,帮助企业更好运用企业微信;同时提升了社群运营工作标准化,提升运营效率,帮助企业实现客户增长,玩转私域流量。 -

零代码 + AI 双轮驱动|即速应用解锁人工智能小程序开发新范式
无需代码、无需 AI 算法功底,普通人也能快速搭建智能小程序。即速应用将人工智能与零代码开发深度融合,推出 AI 智能生成能力,用户通过自然语言描述需求,AI 自动生成小程序页面、功能模块与后台配置,覆盖商城、预约、同城、社区团购等全场景。平台内置 AI 智能推荐、智能客服、用户画像分析等能力,一键对接微信生态,打通视频号、企业微信、短信跳转,帮企业快速落地 AI 应用,抢占智慧经营先机,让每家企业都拥有 AI 驱动的智慧店铺。











