【首度揭密】怎样程序化批量查询微信文章阅读数点赞数?
在小说阅读器中沉浸阅读
点击上方 “内参” 可订阅我!
【老郝按】你知道,我在年前搞了个查询阅读数点赞数的小工具,给自己带来了方便,也帮助了不少朋友,朋友们纷纷说,老郝你弄得真好。这不,眼瞅着就要上班了,胡吃海睡好多天,不琢磨点正事,心里特别空虚。所以,老郝带来一个好消息,揭密一下这个工具的技术原理,希望还没有搞清楚的小伙伴看完以后能够豁然大明白,也希望微信官方能早日把相关的接口开放出来,给广大开发者、市场人员带来真正的重磅「好消息」。
简而言之,我想要告诉你,WX5S 这个工具是怎么做的,看完之后,你只要稍有一些编程基础,也可以轻松搞一个同样的甚至更好的工具。
2014 年 7 月份,微信开始内测公众号文章统计功能,一些公众号文章的标题下方多出了两个数字,一个是阅读数,一个是点赞数。不久后,这两个数字移到了文章末尾,也出现在了所有公众号的文章里。
这是微信的一小步,却是微信人民的一大步。这唯一可观察可量化的两个数字迅速成为了衡量一篇文章乃至一个公众号传播影响力、媒体价值、文章质量(我不知道还能加上什么,因为只有这两个数字,所以很多东西都只能靠它们来评判)的关键指标。
公众号运营者关注这个数字,以此来抬高其自媒体的身价;广告主关注这个数字,以此来判断自媒体能够产生的广告效果;写手们关注这个数字,以此来证明自己文案的吸引力……也有另一些人灵机一动,做起了阅读数点赞数造假的生意。

在这个时候,阅读数和点赞数在一定程度上充当了一般等价物。要说人人都爱张小龙,我不信;要说人人都爱阅读点赞数,我信。
有人出,有人求。需求供给一相逢,一个以阅读数、点赞数服务为核心的市场便形成了。
1
喧嚣:阅读点赞数经济
微信所到之处,遍地生金,哪怕只是这两个数字。
不少组织或个人适时推出了基于阅读点赞数统计分析的业务,比如做公众号排名的新媒体排行榜、微榜、微信热,做微信文章收录的传送门,也有只做分析工具的 KJSON、WX5S。

图:新媒体领域的「福布斯」——新媒体排行榜

图:自媒体社交媒体运营工具爱微帮的微榜

图:阅读和点赞分开的榜单——微信热榜

图:提供微信文章阅读点赞数 API 的 KJSON

图:公众号阅读数点赞数批量查询工具——微信 5S
2
解谜:到底如何做到?
很多朋友好奇如何获得这两个数字。按理说,微信的安全措施不错:只有在微信手机客户端内打开公众号文章,才可以看到这两个数字;如果在电脑上打开,则不会显示。
但以上例子中显然是批量自动化的方式获得的。他们是怎么做到的?你自己心里肯定已经有了一些答案,不论可行的还是不可行的。比如人工记录,比如人工截屏后 OCR,比如借助按键精灵等工具自动截屏分析,比如同一 WIFI 下劫持流量……
当然,还有另一个更为优雅的方法。对于这个方法,很多朋友知道答案,但大多数选择了闷声发财。有些朋友故弄玄虚,做收费咨询;也有些朋友担心这个方法被广泛使用后,微信官方出来封杀。我个人也在独享和公开之间犹豫了一个春节假期(BTW,祝羊年吉祥如意,心想事成),最后决定公开出来,一方面为了让还不明就理的同路人了解技术实现,另一方面可以提醒微信产品团队注意到此事。我的看法是,封杀肯定不是好办法。可以在提高安全性的同时,将公共可观察的非隐私数据通过开放接口公开出来。
通过抓包工具发现,iOS 微信 6.1 版本,每次打开公众号文章时,都会有两次特殊的 HTTP 请求,并且没有加密。第一个请求用于获取文章内容,第二个请求用于获取文章阅读点赞数等信息(还包括广告素材等信息)。

图:抓包发现微信手机客户端传输阅读数和点赞数的接口,2015-01-22,此接口在 iOS 微信 6.1.1 版本中已经弃用(约 2015-01-19 前后升级,同期的 Android 微信 6.1 版本还可以)
于是,我们发现了一个接口。
3
getappmsgext:一个藏得不深的接口
这个接口的用途再清楚不过,就是获得微信文章的附加信息,其中就包括阅读数和点赞数。
资源地址
http://mp.weixin.qq.com/mp/getappmsgext
请求参数
参数
示例
说明
\_\_biz
‘MjM5OTY1NTQ0MA\=\=’
必需,微信公众号唯一标识
mid
203100793
必需,推送消息编号
idx
1
必需,文章在推送消息里的顺序(1-8)
uin
MxaxMjIwOXX4MA==
必需,微信用户身份标识
key
79cdfadf3ea5128c3e526ba…..
必需,微信用户访问令牌
值得注意的是, 还需要设置一下 User-Agent,使请求看起来是微信客户端(接口对 User-Agent 的判断并不严格,可以方便地获得一个)。
返回示例

几个请求参数,可以从一个典型的公众号文章链接中获得,比如这个:
http://mp.weixin.qq.com/s?\_\_biz=MjM5ODQ5NzgxNg==&mid=202871119&idx=1&sn=27b34989e812dd184759769092ab6fe8#rd
里面就包含了 \_\_biz, mid, idx。把它们重新整理一下,拼成正确的 URL,去请求这个接口,就成了。
注:由于新版的 iOS 微信已经弃用该接口,如果你的微信版本是 6.1.1,就不用再试了。换成 6.1 吧。目前 Android 的微信最新版是 6.1。
有了这个接口,事情已经解决了一半。但如果过一段时间再发请求,会发现不能返回正确信息。

图:过期的 key 无法获得阅读数和点赞数信息,2015-02-23
返回结果中,不再有我们希望看到的字段。原因是,请求参数中的 key 已经过期了。
这个 key 有点类似于 OAuth 中的 access\_token(我不知道这么说对不对),它代表微信用户的授权,有了它,就能以该用户的身份去读取一些信息。这是它的一些特点:
- 它的生命周期大约在几分钟到几小时之间
- 用户每打开一篇公众号文章,都会生成一个新的 key
- 新的 key 生成之后,旧的 key 在一段时间内依然有效
那么问题来了,这个 key 怎么获得呢?
我们当然还可以通过抓包的方式来获得 key,但因为涉及人工操作较多,自动化的成本高。
另一个方式是,因为 key 是包含在访问公众号文章时生成的 URL 当中的,如果我们能以合理的方式,获得这个 URL,那么问题就能迎刃而解。
恰好微信公众平台管理后台的编辑器还存在一个漏洞,让我们可以做一些手脚。
4
编辑器:一个防得不严的漏洞
我们的目标是在微信文章中插入一张外链图片,然后推送出去。
这样一来,当这篇文章被访问时,微信客户端就会向此图片所在服务器发请求,同时会携带 Referer(如果到这里不清楚 Referer 是什么的话,可以了解一下 HTTP 相关知识,随便找本书,翻几十页就可以)。我们在服务器端做一些处理,记录下这个 Referer,而它正是我们需要的那个包含了 key 的 URL。
实现起来并不困难。微信公众平台官方后台的编辑器,虽然限制了 HTML 代码,但我们可以在 Chrome 的 Inspector 中对编辑好的文章做一些改动。
1. 打开 Inspector,定位到编辑器文章正文。

注:Inspector 好像中文叫开发者工具,打开的快键键在 Windows 下是 F12,在 MAC 下是 option + command + I。你也可以通过在网页上选中一些内容,然后右键 > 查看元素来打开它。
2. 在合适的地方,通过 HTML 的方式,加入一张外链图片。

3. 保存之后可以预览一下,看外链图片是否正常。

我们发现,虽然代码被做了一些改动,但保留了外链,没有把远程图片上传到微信服务器。
【历史】早期的编辑器,可以通过复制粘贴的方式把一张外链图片放进去。后来这个编辑器做了升级,所有粘进来的远程图片都会先上传到微信服务器。不过,微信虽然关上了门,却依然开着窗(Inspector 的方式)。
回顾一下我们的目标,以及目前的完成情况:
key 在手,跟我走
1. 插入一张 Google 服务器上的图片到微信文章里(达成)
2. 此文章被打开时,Google 服务器会收到请求(达成)
3. Google 服务器可以把收到的请求中的 Referer 记录下来,并提取其中的 key(只要 Google 愿意,当然你最好换一张你自己服务器上的图片)
4. 填入获得的 key,向 getappmsgext 接口发请求,得到文章的阅读数(没有问题)
大功告成,亲个嘴儿吧!
可以参考我做的 Demo 体验一下:
外链图片可以试试这个(只在 Android 6.1 版微信中有效):
Q
&
A

微信文章的内容怎么得到?
直接上爬虫吧,微信好像一点限制都没有。


微信文章地址从哪里能搞到?
好多方法:
1. 你可以人工搞
2. 可以搜狗关键词去爬
3. 可以搜狗公众号看最近文章
4. 可以在手机客户端查看历史文章页面
5. 可以去 Google


还有吗?
晚上来我家告诉你。


搜狗上的内容全吗?
不全。公众号不全,文章也不全。


我还有一个问题。
晚上来我家告诉你。


- 本文来自微信公众号「内参」,微信号是 neineican
- 疑问、感谢、唾骂,欢迎反馈给我
内参
微信号 : neineican
通过有趣小视频
了解微信大世界
关注后点击公众号菜单中的 微信小课
可以查看
第一讲:微信各种号
第二讲:你的订阅号
(更新到第一季第二讲)
暂无评论