自动抢红包,点赞朋友圈,AccessibilityService解放你的双手

标签: 2018


引言

其实这一篇本来不是写这个的,在周一开始想做的时候就想好了标题:
《Android与Python的巧妙结合抓取公众号所有历史文章》
搜狗仅显示最近10条群发,想做爬公号历史文章的应该都了解过,
而利用无障碍服务+Python实现的思路很简单:

  • 1.写一个无障碍服务,在输入完公众号名字保存后,跳转到公众号历史信息
  • 2.然后获取每条记录,点击进入,右上角复制链接,保存起来
  • 3.当前页面的获取完,滚动加载更多,继续获取
  • 4.直到获取到已无更多的节点,代表获取完毕
  • 5.把这个存有所有链接的文件发送到PC电脑
  • 6.然后多线程+代理ip访问链接,新建一个文章对应的文件夹,保存为HTML文件
  • 7.利用以前写过的抓取微信文章里图片,音频,视频的脚本把数据爬到本地
  • 8.替换HTML对应资源处的href链接,指向本地资源

之所以要执行第八步的原因是保存到本地的HTML直接打开很多图片都会裂开(链接失效)
然后呢,我花了三天都没折腾出来,最终卡在无法获得微信x5浏览器网页节点 这个节骨眼
上,无法再进分毫…

无障碍服务利用的是UI Automation,然后呢,这玩意是不支持WebView的!!!、
尽管能遍历打印出结点的信息,但是模拟点击一点用都没有…
webview里的东西,AccessibilityService就无能为力了。我…

后来群里童鞋说移动端自动化测试框架Appuim支持webview,我立马花了半天
去撸文档(不得不说相比起AccessibilityService只能依靠res-id和text来查找
节点,appium支持xpath等方式,找节点,不能爽太多,不过缺点的话是
反应会慢一些,特别是在edittext输入的时候),但是这里有个坎又把我给卡住了
appuim每次运行自己的脚本,微信都需要重新登录,每次运行都要登录的结果
就是:我的三个小号因为登录过于频繁,当天都无法登录了…
(有知道如何规避每次运行脚本都要重新的登录的务必告知下~)
放弃了,太耗费时间了!

另外还有一个套路是微信利用的x5浏览器,可以在微信里打开这个链接:
debugx5.qq.com
接着选择信息,勾选:

接着打开谷歌浏览器,输入:chrome://inspect/#devices
接着随手打开一篇文章,就会有这样的东西:

点击inspect,然后可以得到整个页面的结构,可以拿到和
搜狗获取的一样类型的文章链接,链接很长,而且失效都是12小时

如果是手机用户点击查看文章,然后复制链接,是这样的短连接,
时效还不知道是多久(Maybe永久):
http://mp.weixin.qq.com/s/O00w469tkOrr507drGln9A

关于如何获得微信公众号历史文章目前知道的比较简单的套路就这些,
至于抓包破解之类的,目前level还不够,折腾不过来,先放一放,
后面说不定get√了新的姿势点,问题一下子就解了呢?嘿嘿~

另外爬取微信文章里图片,音频视频可见之前写过的:
小猪的Python学习之旅 —— 10.三分钟上手Requests库

上节利用AccessibilityService实现了自动加好友和拉人进群聊,
感觉还没用起来,这不,又加了自动抢红包和朋友圈自动点赞~

另外,在AccessibilityService除了Webview这个坑外,通过red-id
查找控件,在每个版本的APP中都可能是不一样的,比如微信就是,
本节代码仅保证在6.6.6版本上是可用的,其他版本需要你自行去
适配啦!另外,项目是用Kotlin写的哈,顺道复习一波语法~


1.自动抢红包

这个肯定是没有xposed抢得快的,就是监听Notification信息,如果有
微信红包的字眼,自动打开聊天页面,遍历列表,找到未打开的红包,
自动点开,领取后自动关闭。

运行效果图

啧啧,三个红包几下子就抢完了,速度还是杠杠的,了解了原理,以后换其他
应用,比如钉钉之类的,另外这个脚本目前只支持抢页面可见的红包,
可以开启listview滚动监听,滑动的时候去判断页面有无红包,然后抢。
不过监听了这个玩意的话,页面会挺卡的,不建议开启,自己点红包,
直接就能开了~


2.朋友圈自动点赞

这个功能就不说啦,及时点赞,拉近同事朋友感情,每天点赞那么勤,
别人还以为你对她有意思呢?啧啧,有兴趣的还可以自行扩展,对别
人的说说内容进行下过滤,根据不同的内容发送不同的评论~
比如:

附:

PS:说想接入机器人自动回复评论的,只利用AccessibilityService的话就
别想了,你们怕是忘了AccessibilityService是用来优化残障人士的使用体验的吧…
如果要接机器人的话,考虑appuim自动化测试吧~

运行效果图

是的,就是这么屌~


小结

本节开始讲了下利用类似于按键精灵的套路获得公众号所有历史文章的套路,
接着写了两个很实用的实例,抢红包和朋友圈点赞,关于AccessibilityService
的东东基本也就那么多了,后续再折腾这些就该上xposed了~


附:关键代码(都可以在:https://github.com/coder-pig/WechatHelper 找到):

class HelperService : AccessibilityService() {private val TAG = "HelperService"private val handler = Handler()private var nameList = mutableListOf<String>()override fun onInterrupt() {}override fun onAccessibilityEvent(event: AccessibilityEvent) {val eventType = event.eventTypeval classNameChr = event.classNameval className = classNameChr.toString()Log.d(TAG, event.toString())when (eventType) {AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED -> {if (Hawk.get(Constant.RED_PACKET, false)) {when (className) {"com.tencent.mm.ui.LauncherUI" -> openRedPacket()"com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI" -> clickRedPacket()"com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI" -> performBackClick()}//com.tencent.mm:id/ad8}if (Hawk.get(Constant.ADD_FRIENDS, false) && Hawk.get(Constant.GROUP_NAME, "") != "") {when (className) {"com.tencent.mm.plugin.subapp.ui.friend.FMessageConversationUI" -> addFriends()"com.tencent.mm.plugin.profile.ui.SayHiWithSnsPermissionUI" -> verifyFriend()"com.tencent.mm.plugin.profile.ui.ContactInfoUI" -> contactInfo()"com.tencent.mm.ui.LauncherUI" -> openGroup()"com.tencent.mm.ui.contact.ChatroomContactUI" -> {if (nameList.size > 0) searchGroup() else performBackClick()}"com.tencent.mm.ui.chatting.ChattingUI" -> openGroupSetting()"com.tencent.mm.plugin.chatroom.ui.ChatroomInfoUI" -> {if (nameList.size > 0) addToGroup() else performBackClick()}"com.tencent.mm.ui.base.i" -> dialogClick()}}if (Hawk.get(Constant.FRIEND_SQUARE,false)) {if (className == "com.tencent.mm.plugin.sns.ui.SnsTimeLineUI") {autoZan()}}}AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED -> {if (event.parcelableData != null && event.parcelableData is Notification) {val notification = event.parcelableData as Notificationval content = notification.tickerText.toString()if (content.contains("[微信红包]")) {val pendingIntent = notification.contentIntenttry {pendingIntent.send()} catch (e: PendingIntent.CanceledException) {e.printStackTrace()}}}}//滚动的时候也去监听红包,不过有点卡
//            AccessibilityEvent.TYPE_VIEW_SCROLLED -> {//                if (className == "android.widget.ListView") {//                    openRedPacket()
//                }
//            }}}//添加好友private fun addFriends() {val nodeInfo = rootInActiveWindowif (nodeInfo != null) {val list = nodeInfo.findAccessibilityNodeInfosByText("接受")if (list != null && list.size > 0) {list[0].performAction(AccessibilityNodeInfo.ACTION_CLICK)val nameText: List<AccessibilityNodeInfo>? = list[0].parent.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/b8s")nameList.add(nameText?.get(0)?.text.toString())} else {performBackClick()}}}//完成验证private fun verifyFriend() {val nodeInfo = rootInActiveWindowif (nodeInfo != null) {val finishNode = nodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/hh")[0]finishNode.performAction(AccessibilityNodeInfo.ACTION_CLICK)}}//好友详细资料页private fun contactInfo() {val nodeInfo = rootInActiveWindowif (nodeInfo != null) {val nameNode = nodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/q0")[0]Log.i(TAG, nameNode.toString())if (nameList.contains(nameNode.text.toString().trim())) performBackClick()}}//打开群聊private fun openGroup() {if (nameList.size > 0) {val nodeInfo = rootInActiveWindowif (nodeInfo != null) {val tabNodes = nodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/c9f")for (tabNode in tabNodes) {if (tabNode.text.toString() == "通讯录") {tabNode.parent.performAction(AccessibilityNodeInfo.ACTION_CLICK)handler.postDelayed({val newNodeInfo = rootInActiveWindowif (newNodeInfo != null) {val tagNodes = newNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/jk")for (tagNode in tagNodes) {if (tagNode.text.toString() == "群聊") {tagNode.parent.parent.performAction(AccessibilityNodeInfo.ACTION_CLICK)break}}}}, 500L)}}}}}//搜索群聊private fun searchGroup() {val nodeInfo = rootInActiveWindowif (nodeInfo != null) {val nodes = nodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/a9t")for (info in nodes) {if (info.text.toString() == Hawk.get(Constant.GROUP_NAME)) {info.parent.performAction(AccessibilityNodeInfo.ACTION_CLICK)break}}}}//打开群聊设置private fun openGroupSetting() {if (nameList.size > 0) {val nodeInfo = rootInActiveWindowif (nodeInfo != null) {nodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/hi")[0].performAction(AccessibilityNodeInfo.ACTION_CLICK)}}}//添加到群聊里private fun addToGroup() {if (nameList.size > 0) {val nodeInfo = rootInActiveWindowif (nodeInfo != null) {val listNodes = nodeInfo.findAccessibilityNodeInfosByViewId("android:id/list")if (listNodes != null && listNodes.size > 0) {val listNode = listNodes[0]listNode.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD)listNode.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD)val scrollNodeInfo = rootInActiveWindowif (scrollNodeInfo != null) {handler.postDelayed({val nodes = scrollNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/cz1")for (info in nodes) {if (info.contentDescription.toString() == "添加成员") {info.parent.performAction(AccessibilityNodeInfo.ACTION_CLICK)break}}}, 1000L)handler.postDelayed({val editNodes = rootInActiveWindow.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/arx")if (editNodes != null && editNodes.size > 0) {val editNode = editNodes[0]val arguments = Bundle()arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, nameList[0])editNode.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments)nameList.removeAt(0)}}, 2300L)handler.postDelayed({val cbNodes = rootInActiveWindow.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/l7")if (cbNodes != null) {var cbNode: AccessibilityNodeInfo? = nullif (cbNodes.size == 1) {cbNode = cbNodes[0]} else if (cbNodes.size == 2) {cbNode = cbNodes[1]}if (cbNode != null) {cbNode.parent.performAction(AccessibilityNodeInfo.ACTION_CLICK)val sureNode = rootInActiveWindow.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/hh")[0]sureNode.performAction(AccessibilityNodeInfo.ACTION_CLICK)}}}, 3000L)}}}}}//对话框处理private fun dialogClick() {val inviteNode = rootInActiveWindow.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/all")[0]inviteNode.performAction(AccessibilityNodeInfo.ACTION_CLICK)handler.postDelayed({val sureNodes = rootInActiveWindow.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/all")if (sureNodes != null && sureNodes.size > 0) {val sureNode = sureNodes[0]sureNode.performAction(AccessibilityNodeInfo.ACTION_CLICK)}}, 1000L)}//自动点赞private fun autoZan() {val nodeInfo = rootInActiveWindowif (nodeInfo != null) {while (true) {val rootNode = rootInActiveWindowif (rootNode != null) {val listNodes = rootNode.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/ddn")if (listNodes != null && listNodes.size > 0) {val listNode = listNodes[0]val zanNodes = listNode.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/dao")for (zan in zanNodes) {zan.performAction(AccessibilityNodeInfo.ACTION_CLICK)Thread.sleep(300)val zsNodes = rootInActiveWindow.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/d_m")Thread.sleep(300)if (zsNodes != null && zsNodes.size > 0) {if (zsNodes[0].findAccessibilityNodeInfosByText("赞").size > 0) {zsNodes[0].performAction(AccessibilityNodeInfo.ACTION_CLICK)}}Thread.sleep(300)}listNode.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD)}} else {break}}}}//遍历获得未打开红包private fun openRedPacket() {val rootNode = rootInActiveWindowif(rootNode != null) {val listNode = rootNode.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/a_c")if (listNode != null && listNode.size > 0) {val msgNodes = listNode[0].findAccessibilityNodeInfosByViewId("com.tencent.mm:id/ad8")if (msgNodes != null && msgNodes.size > 0) {for(rpNode in msgNodes) {val rpStatusNode = rpNode.findAccessibilityNodeInfosByText("领取红包")if (rpStatusNode != null && rpStatusNode.size > 0) {rpNode.performAction(AccessibilityNodeInfo.ACTION_CLICK)break}}}}}}//打开红包private fun clickRedPacket() {val nodeInfo = rootInActiveWindowval clickNode = nodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/c31")if (clickNode != null && clickNode.size > 0) {clickNode[0].performAction(AccessibilityNodeInfo.ACTION_CLICK)} else {performBackClick()}}private fun performBackClick() {handler.postDelayed({ performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK) }, 300L)}}

来啊,Py交易啊

想加群一起学习Py的可以加下,智障机器人小Pig

验证通过后会自动发送群聊链接加群链接,点击加入即可
(不要和机器人聊天=-=,就挂着拉人的,有问题到群里讲!)

欢迎各种像我一样的Py初学者,Py大神加入,一起愉快地交流学♂习,van♂转py。


自动抢红包,点赞朋友圈,AccessibilityService解放你的双手相关推荐

  1. python抢红包脚本实例-自动抢红包,点赞朋友圈,python解放你的双手

    引言: 其实这一篇本来不是写这个的,在周一开始想做的时候就想好了标题: <Android与Python的巧妙结合抓取公众号所有历史文章>, 想做爬公号历史文章的应该都了解过,而且文章也越来 ...

  2. (仿微信Android)IM聊天+抢红包+直播+朋友圈源码发布了

    (仿微信Android)IM聊天+抢红包+直播+朋友圈源码发布了 功能概览: IM聊天 单聊/群聊/聊天室--基于环信sdk 红包功能: 1.一对一红包 2.群红包(抢红包.答题红包.专属红包) 3. ...

  3. html5 自动分享到朋友圈,html5手机端分享微信朋友圈代码

    特效描述:html5手机端 分享微信朋友圈.html5手机端分享微信朋友圈代码 代码结构 1. HTML代码   发送给朋友  分享到朋友圈 button{width:100%;text-ali ...

  4. android自动打开微信朋友圈,求大神告知Android微信朋友圈界面代码

    满意答案 plarpgricle 2018.12.17 采纳率:58%    等级:10 已帮助:5570人 <?xml  version="1.0" encoding=&q ...

  5. 朋友圈点赞、发红包 测试用例的设计点

    朋友圈点赞点用例的设计点: 1.给一条朋友圈点赞一次 2.给一条朋友圈,点击两次 3.同一条朋友圈,两个用户同时点赞 4.手抖,同一条朋友圈,点击了多次 5.点赞三天之内的朋友圈 6.点赞一个星期之内 ...

  6. 朋友圈/评论/点赞/搜索/购物车

    1.1.朋友圈功能测试 1.能否发文字朋友圈 2.写好文字时能否取消发送朋友圈 3.是否能够发送朋友圈 4.能否选择观看人 5.能否选择自己的所在地址 6.能否查看他人的评论和点赞 7.自己能否评论别 ...

  7. 请你设计一个微信朋友圈点赞的测试用例

    请你设计一个微信朋友圈点赞的测试用例 参考回答: 功能测试: 点赞某条朋友圈,验证是否成功 接口测试: 点赞朋友圈,验证朋友能否收到提示信息 性能测试 点赞朋友圈,是否在规定时间显示结果,是否在规定时 ...

  8. 微信自动发朋友圈源码

    目前微信营销行业主要有两大神器,云控和群控,对于群控大家可能多少有些了解.总所周知,群控就是一种通过系统,实现一台PC控制百台手机微信的新媒体的一种营销软件,而云控系统核心功能与群控大致一样,主要区别 ...

  9. android朋友圈自动播放,微信安卓7.0.5内测新版功能 朋友圈视频自动播放关闭设置...

    微信安卓7.0.5内测新版功能.微信又迎来了新的版本,虽然这次是小版本的更新,不过带来的新功能却挺好用的,一起来看看吧.这个版本的微信尚处于内测阶段想要尝鲜的用户还需要等等. 微信视频动态增强 图片秒 ...

最新文章

  1. 安卓收藏功能怎么实现_收藏!微信群接龙功能怎么操作?
  2. Android新手系列教程(申明:来源于网络)
  3. LA3989女士的选择
  4. 电商必备:如何选择第三方快递?
  5. Nginx与Lua开发
  6. centos7远程桌面端口_CentOS7启用远程桌面连接
  7. 冬天你的车热的正确吗?如何正确热车?
  8. WIN10配置JAVA环境变量
  9. 暗黑2纯Linux服务器构建
  10. 日语输入法 android8.0,百度日文输入法
  11. UTF-8转换为GBK编码
  12. Excel中度分秒格式(dd°mm′ss″)与十进制度(°)格式互转,角度与弧度互转
  13. oracle所有自带系统表,oracle常用系统表
  14. Taro从零创建微信小程序步骤
  15. C复合结构——结构体struct
  16. 清除访问网络共享文件夹密码
  17. 服装行业ERP体系的主要好处
  18. MOSFET开关管的结构以及在MATLAB中的连接
  19. TypeScript实战-05-TS接口之对象类型接口
  20. TCP重点系列之sack介绍

热门文章

  1. WPS应用之下拉列表 和 多级下拉列表联动
  2. 编写一个函数,计算任一输入的整数的各位数字之和
  3. 《Android深度探索(卷2):系统应用源代码分析与ROM定制》——第6章,第6.4节分析第一个Android系统应用:计算器...
  4. (原) 航模常用缩略语
  5. harbor镜像清理脚本
  6. Android车牌号自动扫描识别的算法
  7. portstats matlab,MATLAB金融计算试题
  8. 音频数据的Flash读取与DAC播放
  9. 百度飞浆paddlepaddle下载安装
  10. 网站站群管理系统-免费站群管理系统下载