查看原文
其他

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

2017-07-15 施维 Python爱好者社区

(点击上方Python爱好者社区,可快速关注)

作者:数据取经团-施维


(文末有微课福利)


欢迎长按下图关注微信公众号:数据取经团  (只写优秀的数据科学文章)

前言

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

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

环境

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,大家可查看,如果有什么需要改进也可联系本人。一起学习一起进步!!

 (本文转自微信公众号:数据取经团)微课福利:Hellobi live |8月22日,利用 Python 建构金融数据分析平台

查看下图说明免费参加或者点击文末阅读原文参加


本文代码及数据获取方式:文章开头扫码关注公众号:数据取经团,在公众号中回复朋友圈检测即可~


关注公众号,“Python爱好者社区”,回复“爬虫”即可获取崔老师爬虫免费学习视频。



Python爱好者社区


为大家提供与Python相关的最新技术和资讯。

长按指纹 > 识别图中二维码 > 添加关注


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存