Python获取微信公众号文章数据

这是一个通过 Python mitmproxy 库 实现获取某个微信公众号下全部文章数据的解决方案。首先需要创建一个 Python 虚拟环境,并进入虚拟环境下:

$ python -m venv venv
$ venv/Scripts/activate

我们需要使用 mitmproxy 库 来建立一个网络代理,以实现监控微信公众号请求的需求。通过下面的命令安装 mitmproxy 库 到虚拟环境:

$ pip install mitmproxy

然后在项目的根目录下创建一个 mitmproxy 插件 文件,这个插件的核心逻辑在 HTTP 事件钩子 - 收到完整的响应 时,判断是否微信公众号的文章数据相关请求和响应,如果是就取出我们需要的数据,并写入文件中。插件的完整代码如下:

import json
from mitmproxy import ctx, httpclass Agency:def __init__(self):self.filter_host = 'mp.weixin.qq.com'self.filter_path_list = ['/mp/getappmsgext', '/mp/appmsg_comment', '/cgi-bin/appmsg']self.article_data = {}def request(self, flow: http.HTTPFlow):""" HTTP 事件钩子 - 发出完整的请求 """passdef response(self, flow: http.HTTPFlow):""" HTTP 事件钩子 - 收到完整的响应 """if flow.request.host == self.filter_host:path = flow.request.path.split('?')[0]if path in self.filter_path_list:if path == '/mp/getappmsgext':response_json = json.loads(flow.response.text)if 'appmsgstat' in response_json:appmsgstat = response_json['appmsgstat']self.article_data['read_num'] = int(appmsgstat['read_num'])  # 阅读数self.article_data['like_num'] = int(appmsgstat['like_num'])  # 在看数self.article_data['old_like_num'] = int(appmsgstat['old_like_num'])  # 点赞数elif path == '/mp/appmsg_comment':response_json = json.loads(flow.response.text)if 'elected_comment_total_cnt' in response_json:comment_total = response_json['elected_comment_total_cnt']self.article_data['elected_comment_total_cnt'] = int(comment_total)  # 评论数elif path == '/cgi-bin/appmsg':response_json = json.loads(flow.response.text)if 'app_msg_list' in response_json:app_msg_list = response_json['app_msg_list']for app_msg in app_msg_list:title = app_msg['title']  # 标题digest = app_msg['digest']  # 概要link = app_msg['link']  # 链接msg = {'title': title, 'digest': digest, 'link': link}with open('article_list.log', 'a+', encoding='utf-8') as file:file.write(f'{json.dumps(msg, ensure_ascii=False)}\n')if len(self.article_data) == 4:with open('article_detail.log', 'w+', encoding='utf-8') as file:file.write(f'{json.dumps(self.article_data, ensure_ascii=False)}')self.article_data = {}addons = [Agency()]

我们监控的三个接口中,/cgi-bin/appmsg 是微信公众平台 web 后台中,用户编辑文章时,插入其他公众号文章的超链接时,调用的分页查询接口。用于获取当前公众号下的全部文章的基本信息(包括文章的标题、概要和链接):

在这里插入图片描述

另外两个 /mp/getappmsgext/mp/appmsg_comment 则是微信 PC 客户端中,用户点击微信公众号文章链接后,客户端打开新窗口时调用的查询接口。用于获取具体某个公众号文章的详细信息(包括文章的阅读数、点赞数、在看数和评论数):

在这里插入图片描述

生成的 article_list.log 文件(公众号下全部文章基本信息)是追加写入的。而 article_detail.log 文件(具体某个文章的详细数据)是覆盖写入的。这个区别需要注意下。

启动和配置代理

在虚拟环境里,执行下面的命令启动代理:

$ mitmdump -p 23457 -s agency.py

然后打开系统管理页面,选择代理,手动配置成 23457 并开启、保存配置:

在这里插入图片描述

安装证书文件

执行这一步的前提是,前面的步骤都顺利完成!

因为微信公众号的请求是 HTTPS 的模式,所以现在还需要访问 http://mitm.it/ 地址,下载证书文件:

在这里插入图片描述

下载完成后,直接打开证书文件,系统会引导你完成安装流程,完成安装后,可以在系统中查看到证书已经安装成功:

在这里插入图片描述

获取公众号文章

最后就可以验收结果了,我们打开微信公众号平台的后台页面,创建并编辑一个新文章,选择超链接,然后搜索你要获取的公众号名称,分页查询的视图就出来了:

在这里插入图片描述

我们只需要通过某些方式一直点击下一页,就可以把全部文章的标题、概要、链接都获取到,不过要注意控制请求/点击的频率,不然会触发服务器的安全机制。

接下来通过脚本读取 article_list.log 文件中的每一条 JSON 数据,取出里面的文章链接,复制到微信 PC 客户端的聊天窗口里,再点击打开:

在这里插入图片描述

当文章窗口里的图文内容完全加载完成后,就会生成 article_detail.log 文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/166131.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode_并查集_DFS_中等_2316.统计无向图中无法互相到达点对数

目录 1.题目2.思路3.代码实现(Java) 1.题目 给你一个整数 n ,表示一张 无向图 中有 n 个节点,编号为 0 到 n - 1 。同时给你一个二维整数数组 edges ,其中 edges[i] [ai, bi] 表示节点 ai 和 bi 之间有一条无向边。请…

将语义分割的标注mask转为目标检测的bbox

1. 语义分割标签 1.1 labelme工具 语义分割的标签是利用labelme工具进行标注的,标注的样式如下: 1.2 语义分割的标签样式 2. 转换语义分割的标注到目标检测的bbox 实现步骤 (1) 利用标注的json文件生成mask图片(2) 在mask图片中找到目标的bbox矩形框的左上角点和右下角点(…

Redis 之 SessionCallback RedisCallback 使用

📢📢📢📣📣📣 哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝 一位上进心十足的【Java ToB端大厂…

备忘录模式-撤销功能的实现

在idea写代码的过程中,会经常用到一个快捷键——“crtl z”,即撤销功能。“备忘录模式”则为撤销功能提供了一个设计方案。 1 备忘录模式 备忘录模式提供一种状态恢复机制。在不破坏封装的前提下,捕获对象内部状态并在该对象之外保存这个状态。可以在…

Web自动化测试:测试用例断言!

运行测试用例时,需要判断用例是否执行成功,此时需要有一个我们期望的结果来进行验证。这里unittest中,如果一个case执行的过程中报错,或者我们判断结果不符合期望,就会判定此条用例执行失败,判断的条件主要…

【MySQL】数据库——表操作

文章目录 1. 创建表2. 查看表3. 修改表修改表名add ——增加modify——修改drop——删除修改列名称 4. 删除表 1. 创建表 语法: create table 表名字 ( 列名称 列类型 ) charset set 字符集 collate 校验规则 engine 存储引擎 ; charset set字符集 ,若…

【C++代码】二叉搜索树的最近公共祖先,二叉搜索树中的插入操作,删除二叉搜索树中的节点--代码随想录

题目:二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大&a…

小程序中如何使用自定义组件应用及搭建个人中心布局

一,自定义组件 从小程序基础库版本 1.6.3 开始,小程序支持简洁的组件化编程。所有自定义组件相关特性都需要基础库版本 1.6.3 或更高。 开发者可以将页面内的功能模块抽象成自定义组件,以便在不同的页面中重复使用;也可以将复杂的…

MSQL系列(四) Mysql实战-索引分析Explain命令详解

Mysql实战-索引分析Explain命令详解 前面我们讲解了索引的存储结构,我们知道了BTree的索引结构,也了解了索引最左侧匹配原则,到底最左侧匹配原则在我们的项目中有什么用?或者说有什么影响?今天我们来实战操作一下&…

Java并发面试题:(七)ThreadLocal原理和内存泄漏

ThreadLocal是什么? ThreadLocal是线程本地存储机制,可以将数据缓存在线程内部。ThreadLocal存储的变量在线程内共享的,在线程间又是隔离的。 ThreadLocal实现原理? ThreadLocal的底层是ThreadLocalMap,每个Thread都…

YOLOv5算法改进(16)— 增加小目标检测层 | 四头检测机制(包括代码+添加步骤+网络结构图)

前言:Hello大家好,我是小哥谈。小目标检测层是指在目标检测任务中用于检测小尺寸目标的特定网络层。由于小目标具有较小的尺寸和低分辨率,它们往往更加难以检测和定位。YOLOv5算法的检测速度与精度较为平衡,但是对于小目标的检测效果不佳,根据一些论文,我们可以通过增加检…

Kafka Tool(Kafka 可视化工具)安装及使用教程

Kafka Tool(Kafka 可视化工具)安装及使用教程 Kafka Tool 工具下载 下载地址 http://www.kafkatool.com/download.html 下载界面 不同版本的Kafka对应不同版本的工具,个人使用的是2.11,所以下载的是最新的2.0.8版本&#xff…

android 13/14高版本SurfaceFlinger出现VSYNC-app/VSYNC-appSf/VSYNC-sf剖析

问题背景: 了解surfaceflinger的vsync同学都可能知道vsync属于一个节拍器,主要用来控制有节奏的渲染,不至于会产生什么画面撕裂等现象。 一般vsync都有会有2部分: app部分vsync,控制各个app可以有节奏的上帧 surfacef…

PyQt学习笔记-获取Hash值的小工具

目录 一、概述1.1 版本信息:1.2 基本信息:1.2.1 软件支持的内容:1.2.2 支持的编码格式 1.3 软件界面图 二、代码实现2.1 View2.2 Controller2.3 Model 三、测试示例 一、概述 本工具居于hashlibPyQtQFileDialog写的小工具,主要是…

【Linux升级之路】8_Linux多线程

目录 一、【Linux初阶】多线程1 | 页表的索引作用,线程基础(优缺点、异常、用途),线程VS进程,线程控制,C多线程引入二、【Linux初阶】多线程2 | 分离线程,线程库,线程互斥&#xff0…

【iOS】使用单例封装通过AFNetworking实现的网络请求

这里写目录标题 前言单例封装网络请求1. 首先创建一个继承于NSObject的单例类,笔者这里以Manager对单例类进行命名,然后声明并实现单例类的初始化方法2.实现完单例的创建方法后我们即可通过AFNetworking中的GET方法进行网络请求3.在Controller文件中创建…

免费活动】11月4日敏捷武林上海站 | Scrum.org CEO 亲临现场

活动介绍 过去的几年里,外界的风云变幻为我们的生活增添了一些不一样的色彩。在VUCA世界的浪潮里,每一个人都成为自己生活里的冒险家。面对每一次的变化,勇于探索未知,迎接挑战,努力追逐更好的自己。 七月&#xff0…

Mysql基础与高级汇总

SQL语言分类 DDL:定义 DML:操作 DCL:控制(用于定义访问权限和安全级别) DQL:查询 Sql方言 ->sql:结构化查询语言 mysql:limit oracle:rownum sqlserver:top 但是存储过程:每一种数据库软件一样SQL语法要求: SQL语句可以单行或多行书写&…

【三:Mock服务的使用】

目录 1、工具包2、mock的demo1、get请求2、post请求3、带cookies的请求4、带请求头的请求5、请求重定向 1、工具包 1、:服务包的下载 moco-runner-0.11.0-standalone.jar 下载 2、:运行命令java -jar ./moco-runner-0.11.0-standalone.jar http -p 888…

C# Winform编程(6)高级控件

C# Winform编程(6)高级控件 RadioButton(单选框)PictureBox(图像框)TabControl(选项卡)ProgressBar(进度条)TrackBar(滑动条)ImageList(图像列表控件)ToolBar…