• 如何采集微信公众号历史数据



    鲲之鹏的技术人员将在本文介绍一种通过模拟操作微信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/
  • 相关阅读:
    mysql pt-osc
    mysql表分区,mysql分区表
    mysql5.5无法启动,Can't open and lock privilege tables: Table 'mysql.host' doesn't exist 问题的解决方法
    mysql压缩表,mysql行压缩与页压缩
    mybase7破解
    (1.5)es集群部署运维【最佳实践】
    kafka基础概念
    midway日志体系
    midwayjs 使用egg-mysql
    midway mysql egg-mysql 配置 基础操作 增删改查
  • 原文地址:https://www.cnblogs.com/du-jun/p/14025186.html
Copyright © 2020-2023  润新知