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

news2024/11/18 7:36:41

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

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

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

$ pip install mitmproxy

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

import json
from mitmproxy import ctx, http

class 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 事件钩子 - 发出完整的请求 """
        pass
    
    def 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.coloradmin.cn/o/1118395.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式篇---组合模式

文章目录 概念结构实例总结 概念 组合模式:组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象。 当我们开发中遇到树形结构的业务时,可以考虑使用组合模式。(我也没有想明白为啥…

基于springboot实现财务管理系统项目【项目源码+论文说明】

基于springboot实现财务管理系统演示 摘要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生&#x…

Ubuntu的EFI分区无法删除

本文解决的问题:双系统装完后需要删除ubuntu的分区,但是EFI系统分区无法删除。 第一步:cmd中输入命令 diskpart 并回车,如图中①; 第二步:在弹出窗口②中依次输入如下命令即可删除EFI分区; /…

基于springboot实现藏区特产销售平台项目【项目源码+论文说明】

基于springboot实现藏区特产销售管理平台演示 摘要 “互联网”的战略实施后,很多行业的信息化水平都有了很大的提升。但是目前很多藏区特产销售信息仍是通过人工管理的方式进行,需要在各个岗位投入大量的人力进行很多重复性工作,使得对人力物…

USRP-2944 配件讲解,如何选择对应的配件

USRP-2944 产品图片 产品官网价格信息 查看附件和价格 硬件服务 NI硬件服务计划通过简化物流,延长正常运行时间以及根据业界标准维护数据的可追溯性,帮助您节省系统组装、设置和维护所需的时间和金钱。这些计划涵盖多年期维修服务,同时还提…

Python 循环

Python有两个基本的循环命令&#xff1a; while循环for循环 while循环 使用while循环&#xff0c;我们可以在条件为真的情况下执行一组语句。 示例&#xff0c;打印i&#xff0c;只要i小于6&#xff1a; i 1 while i < 6:print(i)i 1注意&#xff1a;记得增加i的值&a…

微机原理:汇编语言语句类型与格式

文章目录 壹、语句类型1、语句分类2、常用伪代码和运算符2.1数据定义伪指令2.1.1字节定义伪指令DB&#xff08;8位&#xff09;2.1.2字定义伪指令DW&#xff08;16位&#xff09;2.1.3双字节伪指令DD2.1.4 多字节定义DF/DQ/DT&#xff08;了解&#xff09; 2.2 常用运算符2.2.1…

数据结构-- 并查集

0. 引入 并查集是来解决等价问题的数据结构。 离散数学中的二元关系。 等价关系需满足自反性、对称性、传递性。 a ∈ S , a R a a R b & b R a a R b ∩ b R c > a R c a \in S, aRa \\ aRb \& bRa \\ aRb \cap bRc >aRc a∈S,aRaaRb&bRaaRb∩bRc>a…

【MATLAB源码-第53期】m代码基于粒子群算法(PSO)的三维路径规划,显示最优路径和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;简称PSO&#xff09;是一种模拟鸟群觅食行为的启发式优化方法。以下是其详细描述&#xff1a; 基本思想&#xff1a; 鸟群在寻找食物时&#xff0c;每只鸟都会…

拦截器以及统一功能的实现

目录 引言 实现一个简单的拦截器 拦截器小结 统一访问前缀 统一异常处理 统一返回参数 ControllerAdvice 引言 HandlerInterceptor是Spring MVC框架提供的一个拦截器接口&#xff0c;它用于对请求进行拦截和处理。在Spring MVC中&#xff0c;拦截器可以用于实现一些通用的功能…

什么是t检验?

t检验&#xff08;t-test&#xff09;是一种统计方法&#xff0c;用于比较两组数据之间的平均值是否存在显著差异。它通常用于分析两组样本的平均值是否具有统计学上的显著性差异。t检验基于正态分布的假设&#xff0c;它计算两组数据之间的t值&#xff0c;然后通过与t分布表进…

YOLO目标检测——人脸口罩佩戴数据集【(含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;公共场所监控场景下的大密度人群检测是否佩戴口罩&#xff0c;以及戴口罩的人证比对&#xff08;安检刷脸不用摘口罩&#xff09;、手机解锁、刷脸考勤等身份认证场景。数据集说明&#xff1a;人脸口罩佩戴检测数据集&#xff0c;真实场景的高质量图片…

reactnative 底部tab页面@react-navigation/bottom-tabs

使用react-navigation/native做的页面导航和tab‘ 官网&#xff1a;https://reactnavigation.org/docs/getting-started 效果图 安装 npm install react-navigation/nativenpm install react-navigation/bottom-tabs封装tabbar.js import { View, StyleSheet, Image } from …

【JavaEE】死锁问题 -- 多线程篇(5)

死锁问题 1. 死锁是什么?2. 如何避免死锁? 1. 死锁是什么? 概念 死锁是这样一种情形: 多个线程同时被阻塞, 它们中的一个或者全部都在等待某个资源被释放, 由于线程被无限期的阻塞, 因此程序不能正常终止。 死锁的三种常见的场景 一个线程, 一把锁, 但是是不可重入锁, 该线程…

新手上路:学会使用SELinux保护你的系统

1 Selinux的介绍 SELinux是为了提高系统安全性的机制。 它对系统的每一个程序、文件都引入了安全上下文。安全上下文标签&#xff0c;用于唯一标识文件、进程和资源。这些标签包括了安全策略的信息&#xff0c;允许SELinux强制执行策略。 1.1 Selinux关闭状态下 getenforce …

个微多账号聚合聊天管理如何实现?

在日常工作中&#xff0c;我经常遇到以下问题&#xff1a; 1. 微信号众多&#xff0c;需要频繁切换设备和账号&#xff0c;导致工作效率低下。 2. 无法及时回复客户消息&#xff0c;客户体验不尽如人意。 3. 难以随时掌握员工与客户的沟通情况&#xff0c;导致员工沟通质量难…

C语言实现把程序中自定义的print( )函数改写为等价的递归函数

完整代码&#xff1a; //把以下程序的 print( )函数改写为等价的递归函数。 #include<iostream> using namespace std; void print(int w) {for(int i1;i<w;i) {for(int j1;j<i;j){cout<<i<<" ";}} } void myPrint(int w) {// 当 w 为 1 时…

动手学深度学习—使用块的网络VGG(代码详解)

目录 1. VGG块2. VGG网络3. 训练模型 1. VGG块 经典卷积神经网络的基本组成部分是下面的这个序列&#xff1a; 1.带填充以保持分辨率的卷积层&#xff1b; 2.非线性激活函数&#xff0c;如ReLU&#xff1b; 3.汇聚层&#xff0c;如最大汇聚层。 定义网络块&#xff0c;便于我…

【LeetCode】67. 二进制求和

1 问题 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 示例 1&#xff1a; 输入:a “11”, b “1” 输出&#xff1a;“100” 示例 2&#xff1a; 输入&#xff1a;a “1010”, b “1011” 输出&#xff1a;“10101” 2 答案 自己写…

【分类讨论】CF1834D

Problem - D - Codeforces 题意&#xff1a; 思路&#xff1a; 这是个分类讨论题&#xff0c;一开始还以为是枚举什么的&#xff0c;发现根本枚举不了 注意到最终的答案就两种情况&#xff1a;区间包含 or 区间不包含 对于第一种情况&#xff0c;贡献的最大值就是mxlen - m…