将通过抓包获取的微信公众号文章(含付费文章)转换为本地 Markdown 文件,适配 Obsidian 阅读与管理。
微信公众号付费文章在付费阅读后,仍然只能在微信客户端内查看,无法导出、复制或本地保存。本工具通过抓包获取文章完整 HTML 内容,将其转换为结构化的 Markdown 文档并下载图片到本地,实现付费内容的长期保存与离线阅读。
推荐使用 Reqable(跨平台,支持 Windows/macOS/Linux),也可使用 Charles、Fiddler 等。
核心要求:能够解密 HTTPS 流量并导出完整的 HTTP 响应原始数据。
- 安装并信任 Reqable 的 CA 根证书
- 开启 HTTPS 解密功能
- 确保微信客户端的流量经过 Reqable 代理
提示:微信 PC 客户端默认使用系统代理,在 Reqable 中开启系统代理即可自动拦截。
方式一(推荐):使用 uv 零配置运行
# 无需手动安装依赖,uv 自动处理
uv run wx2md.py data/http_raw.txt方式二:pip 安装
# 克隆仓库后安装
pip install .
# 或开发模式
pip install -e .
# 然后运行
wx2md data/http_raw.txt方式三:直接 pip 安装依赖
pip install beautifulsoup4 httpx
python wx2md.py data/http_raw.txt- 打开 Reqable,开始捕获
- 在微信 PC 客户端中打开目标公众号文章
- 如果是付费文章,确保已完成付费(付费后才能获取完整内容)
在 Reqable 的请求列表中,找到对 mp.weixin.qq.com 的 GET 请求,URL 路径为 /s,响应类型为 text/html。
识别特征:
- 请求方法: GET
- Host:
mp.weixin.qq.com - 响应 Content-Type:
text/html; charset=UTF-8 - 响应体较大(通常数百 KB 到数 MB)
在 Reqable 中选中该请求,导出 HTTP 响应的原始文本数据,保存为 .txt 文件(如 data/http_raw.txt)。
导出内容应包含:
- HTTP 响应头(状态行、Set-Cookie、Content-Type 等)
- 空行分隔
- HTML 响应体
# 基本用法(uv)
uv run wx2md.py data/http_raw.txt
# 基本用法(pip 安装后)
wx2md data/http_raw.txt
# 指定输出目录
uv run wx2md.py data/http_raw.txt -o my_articles输出结构:
output/
文章标题.md # Markdown 文件(含 Obsidian frontmatter)
images/ # 文章内图片
img_01.png
img_02.png
...
生成的 Markdown 文件包含 YAML frontmatter,可直接放入 Obsidian vault 中使用:
---
title: "文章标题"
author: "作者"
source: "公众号名称"
date: 2026-03-04
tags: [微信公众号, 付费文章]
url: "https://mp.weixin.qq.com/s?__biz=...&mid=...&idx=...&sn=...#rd"
---本工具在处理过程中会自动进行 URL 脱敏:
- 文章链接仅保留
__biz、mid、idx、sn四个标识文章的核心参数 - 自动移除
key、pass_ticket、uin、exportkey、wap_sid2等关联个人身份的参数 - 抓包原始数据文件中包含 cookies 和个人信息,请勿将
data/目录中的原始文件分享给他人
微信公众号文章的 HTTP 响应是一个完整的 HTML 页面,关键数据分布在以下位置:
| 数据 | 位置 | 说明 |
|---|---|---|
| 正文内容 | id="js_content" 的 div |
完整的富文本 HTML |
| 文章标题 | JS 变量 msg_title |
|
| 作者/公众号 | JS 变量 nickname、author |
|
| 发布时间 | JS 变量 ct(Unix 时间戳) |
|
| 封面图 | JS 变量 msg_cdn_url |
|
| 图片列表 | picturePageInfoList |
CDN URL + 尺寸信息 |
- 免费文章:正文完整展示在
js_content中 - 付费文章(未付费):仅展示前 N% 的预览内容(由
preview_percent控制,通常 50%) - 付费文章(已付费):与免费文章结构一致,正文完整在
js_content中,额外有appmsg_needpay=1等付费标识
因此,必须在已付费的状态下抓包,才能获取完整内容。
微信文章不使用标准的 <h2>/<h3> 标题标签,而是通过内联样式来表达格式:
- 段落:
<p>嵌套<span leaf="">→<span textstyle="">→ 文本 - 标题: 通过
font-weight: bold样式标识,本工具根据中文编号模式(如"一、""二、")自动识别为 Markdown 标题 - 图片: 使用
data-src属性(懒加载),CDN 域名为mmbiz.qpic.cn - 列表: 标准
<ul>/<ol>标签
- 仅支持从 HTTP 原始响应文本解析,需要配合抓包工具使用
- 微信文章的排版高度依赖内联 CSS 样式,转换为 Markdown 后会丢失部分视觉效果(如文字颜色、自定义字体等)
- 音频、视频等多媒体内容不做处理
- 需要手动操作抓包流程,暂不支持批量自动化
仅供个人学习与存档使用,请尊重原创作者的知识产权。