爬虫界的一股清流——用安卓做一个朋友圈屏蔽检测器

浏览: 2164

前言

前段时间,新版微信加入了一个朋友圈只给看三天的新功能。于是就有了一个经典梗:朋友圈陌生人可以看十张照片,熟人只能看三天,只能友尽了!

有了上面的段子之后,本人忽然意识到一个问题,那就是现在微信好友越来有越多,有的可能都只是为了加一下转个账什么的,连名字都不知道。这么多好友,有许多可能是半生不熟的人,本人是没闲工夫去一个一个屏蔽朋友圈的,但是这并不能确保别人不屏蔽自己吧。现如今,屏蔽朋友圈,朋友都没得做。


环境

Java

IDE:Android Studio



效果

别人屏蔽怎么办?作为一个理工男,本人的方法很简单,写一个app,把他们揪出来,让尴尬来得更猛烈些吧!屏蔽朋友圈还不想被发现?不存在的!于是本人就花了一天的时间把这个app(命名为朋友圈屏蔽检测器)初步搞出来了。不多BB,直接看看本人用测试号测试出来的结果吧,原理后面再讲:


嗯还好这是个测试号,要是自己的微信看到这结果,内心也是崩溃的。为了方便,我把疑似屏蔽(可看朋友圈少于2条)的和那些设置了查看天数且没怎么发朋友圈的给揪出来了,当然这个结果还是自己人工验证一波比较好!



技术原理

如果对实现具体不感兴趣的同学可以跳过这个part,直接跳到最后获取app下载方式顺便点个赞即可。下面开始相关技术的说明,因为篇幅的关系,不会讲全部的代码,只说明原理和讲解重要部分:

AccessibilityService

这个服务是这个app最重要的内容啦,一般在手机的辅助功能(或无障碍)中的服务可找到,它的作用是检测用户的操作和检索窗口的内容

看到它的作用,是不是有点似曾相识?没错,它其实就像是一个手机的爬虫,可以提取页面的元素,可以操作跳转等等。这个时候有同学可能会担心APP会不会偷偷上传自己的数据,这个本人可以保证,这个APP根本没有申请联网权限,所以不会上传数据,而且已经开源,欢迎大家监督。

我们说到AccessibilityService可以检测操作,于是就有了下面这个函数,检测的是我们打开微信的操作。因为服务是一直在后台开着的,所以当我们打开服务后,再打开微信,就会自动检测并跳入到if中,这样就能开始我们的朋友圈屏蔽检测啦!至于那个className是怎么找的,大概就是在调试的时候不断的输出className,然后你自己试着打开微信,就自然输出了if条件语句中的内容:

public void onAccessibilityEvent(AccessibilityEvent event) {
   String className = event.getClassName().toString();

   if (className.equals("com.tencent.mm.ui.LauncherUI"&& !mutex) {
       ...
   }
}

进入微信之后,我们就要在微信里面进行浏览和点击操作啦,爬虫部分真正开始。这里以检测某个id的视图并点击它为例写一个函数,先上代码再讲解:

private void clickNodeByID(AccessibilityNodeInfo rootNodeInfo,String NodeId) {
    if (rootNodeInfo!=null && rootNodeInfo.findAccessibilityNodeInfosByViewId(NodeId).size() > 0 ) {
        AccessibilityNodeInfo clickNodeb = rootNodeInfo.findAccessibilityNodeInfosByViewId(NodeId).get(0);
         clickNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
      }
}

这个函数也不复杂,传入一个页面根节点rootNodeInfo和一个需要查找和点击的节点id,其实页面的组织形式很像浏览器的DOM树,所以可以一级一级查找,当根节点不空且能调用系统函数找到一个View列表时,我们就直接取列表中的第一个View元素,然后调用系统函数点击它。是不是很简单?听不懂?翻译成网页爬虫,首先我们获得一个页面的根节点,然后我们通过beautifulsoup去提取一个符合条件的html元素列表(相当于安卓的NodeId),然后,选出列表中第一个元素,跳转(相当于urlopen),整个操作结束。

这不就是爬虫吗!!

函数调用也很简单,调用一个系统函数获得当前页面根节点,然后根据需要点按的id传进去给函数:

AccessibilityNodeInfo rootNodeInfo = getRootInActiveWindow();
clickNodeByID(rootNodeInfo,"com.tencent.mm:id/h3");

看到代码,大家会问,这个id怎么获得的,这个又是一个复杂的工程[哭]. 需要把手机连接到电脑上,然后打开Android Studio中的Dump View Hierarchy for UI Automator,然后点击相应控件就能看到id了,具体看参考这个网址:

http://www.cnblogs.com/xdindex/p/4619675.html



爬取流程

好了,上面我们介绍过了怎么像爬虫一般地在安卓手机上获取页面元素,检索元素并模拟点击,接下来,我们只要依样画葫芦,把整个爬取流程设计好,不就很容易了嘛:




尾巴

至此,这个App大致的原理已经讲解完毕了,验明正身,基本就是个爬虫!

效果嘛,最上面展示啦,这个App还算是功能比较完整哒,大家有兴趣可以先自己下载根据使用说明玩一玩,源码和App都已经上传github,大家可查看,如果有什么需要改进也可联系本人。一起学习一起进步!!

最后,是本项目的github地址:请点击传送门,记得给star哟,已经更新到最新版微信了,大家不想看代码的可以直接下载对应微信版本的.apk文件进行测试。

推荐 3
本文由 施维而已 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

1 个评论

请问下作者,为什么我的手机装了这个过后每次进入第一个朋友圈就不返回了

要回复文章请先登录注册