爬虫界的一股清流——用安卓做一个朋友圈屏蔽检测器
(点击上方数据取经团,可快速关注)
作者:数据取经团-施维
前言
前段时间,新版微信加入了一个朋友圈只给看三天的新功能。于是就有了一个经典梗:朋友圈陌生人可以看十张照片,熟人只能看三天,只能友尽了!
有了上面的段子之后,本人忽然意识到一个问题,那就是现在微信好友越来有越多,有的可能都只是为了加一下转个账什么的,连名字都不知道。这么多好友,有许多可能是半生不熟的人,本人是没闲工夫去一个一个屏蔽朋友圈的,但是这并不能确保别人不屏蔽自己吧。现如今,屏蔽朋友圈,朋友都没得做。
环境
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,大家可查看,如果有什么需要改进也可联系本人。一起学习一起进步!!
本文代码及APP获取方式:下图扫码关注公众号,在公众号中回复朋友圈检测即可~
联系作者:当你对文章有任何疑问和建议可以在公众号直接发消息,我们看到都会回复哒,一起交流数据~