du-jun

鲲之鹏的技术人员将在本文介绍一种通过模拟操作微信App的方式采集指定公众号的所有历史数据的方法。

通过我们抓包分析发现,微信公众号的历史数据是通过HTTP协议加载的,对应的API接口如下图所示,其中有四个关键参数(__biz、appmsg_token、pass_ticket以及Cookie)。

为了能够拿到这四个参数,我们需要模拟操作App,让其产生这些参数,然后我们再抓包获取。对于模拟App操作,前面我们曾介绍过通过Python模拟安卓App的方法(详见http://www.site-digger.com/html/articles/20180912/664.html)。对于HTTP集成抓包,前面我们曾介绍过Mitmproxy(详见http://www.site-digger.com/html/articles/20181109/682.html)。

 

我们需要模拟操作微信完成如下步骤:

1. 启动微信App

2. 点击"通讯录"

3. 点击"公众号"

4. 点击要采集的公众号

5. 点击右上角的用户图像图标

6. 点击"全部消息"

此时,我们可以从https://mp.weixin.qq.com/mp/profile_ext?action=home的应答数据中捕获__biz、appmsg_token以及pass_ticket三个关键参数,以及请求头中的Cookie值。如下图所示。

有了上述四个参数,我们就可以构造出获取历史文章列表的API请求,通过调用API接口直接获取数据(不需要再模拟App操作)。核心参数如下所示,通过改变offset参数,可以拿到所有历史数据。

  1. # Cookie  
  2. headers = {\'Cookie\'\'rewardsn=; wxtokenkey=777; wxuin=584068438; devicetype=android-19; version=26060736; lang=zh_CN; pass_ticket=Rr8cO5c2******3tKGqe7aVZzV9TupvrK+1uHHmHYQGL2WFdKIE; wap_sid2=COKhxu4KElxckFZQ3QzTHU4WThEUk0zcWdrZjhGcUdYdEVSV3Y1X2NPWHNUakRrd1ZzMnpLTERpdE5rbmxjSTg******dlRBcUNRazZpOGxTZUVEQUTgNQJVO\'}  
  3.   
  4. url = \'https://mp.weixin.qq.com/mp/profile_ext?\'  
  5. data = {}  
  6. data[\'is_ok\'] = \'1\'  
  7. data[\'count\'] = \'10\'  
  8. data[\'wxtoken\'] = \'\'  
  9. data[\'f\'] = \'json\'  
  10. data[\'scene\'] = \'124\'  
  11. data[\'uin\'] = \'777\'  
  12. data[\'key\'] = \'777\'  
  13. data[\'offset\'] = \'0\'  
  14. data[\'action\'] = \'getmsg\'  
  15. data[\'x5\'] = \'0\'  
  16. # 下面三个参数需要替换  
  17. # https://mp.weixin.qq.com/mp/profile_ext?action=home应答数据里会暴漏这三个参数  
  18. data[\'__biz\'] = \'MjM5MzQyOTM1OQ==\'  
  19. data[\'appmsg_token\'] = \'993_V8%2BEmfVD7g%2FvMZ****4DNUJNFkg~~\'  
  20. data[\'pass_ticket\'] = \'Rr8cO5c23ZngeQHRGy8E7gv*****pvrK+1uHHmHYQGL2WFdKIE\'  
  21. url = url + urllib.urlencode(data)  
# Cookie
headers = {\'Cookie\': \'rewardsn=; wxtokenkey=777; wxuin=584068438; devicetype=android-19; version=26060736; lang=zh_CN; pass_ticket=Rr8cO5c2******3tKGqe7aVZzV9TupvrK+1uHHmHYQGL2WFdKIE; wap_sid2=COKhxu4KElxckFZQ3QzTHU4WThEUk0zcWdrZjhGcUdYdEVSV3Y1X2NPWHNUakRrd1ZzMnpLTERpdE5rbmxjSTg******dlRBcUNRazZpOGxTZUVEQUTgNQJVO\'}

url = \'https://mp.weixin.qq.com/mp/profile_ext?\'
data = {}
data[\'is_ok\'] = \'1\'
data[\'count\'] = \'10\'
data[\'wxtoken\'] = \'\'
data[\'f\'] = \'json\'
data[\'scene\'] = \'124\'
data[\'uin\'] = \'777\'
data[\'key\'] = \'777\'
data[\'offset\'] = \'0\'
data[\'action\'] = \'getmsg\'
data[\'x5\'] = \'0\'
# 下面三个参数需要替换
# https://mp.weixin.qq.com/mp/profile_ext?action=home应答数据里会暴漏这三个参数
data[\'__biz\'] = \'MjM5MzQyOTM1OQ==\'
data[\'appmsg_token\'] = \'993_V8%2BEmfVD7g%2FvMZ****4DNUJNFkg~~\'
data[\'pass_ticket\'] = \'Rr8cO5c23ZngeQHRGy8E7gv*****pvrK+1uHHmHYQGL2WFdKIE\'
url = url + urllib.urlencode(data)

 

以"数字工厂"这个微信公众号为例,采集过程运行截图如下所示:

 

输出结果截图如下所示:

附示例数据下载:

weixin_articles_sample.xls

 

特别说明:本文旨在技术交流,请勿将涉及的技术用于非法用途,否则一切后果自负。如果您觉得我们侵犯了您的合法权益,请联系我们予以处理。
☹ Disqus被Qiang了,之前所有的评论内容都看不到了。如果您有爬虫相关技术方面的问题,欢迎发到我们的问答平台:http://spider.site-digger.com/

分类:

技术点:

相关文章: