Skip to content
betterMaxPublic

About

用于导出和备份已经付费的微信文章

Resources

Stars

3 stars

Watchers

0 watching

Forks

Latest commit

 

History

1 Commit

Folders and files

Repository files navigation

wx2md - 微信公众号文章转 Markdown 工具

将通过抓包获取的微信公众号文章(含付费文章)转换为本地 Markdown 文件,适配 Obsidian 阅读与管理。

为什么需要这个工具

微信公众号付费文章在付费阅读后,仍然只能在微信客户端内查看,无法导出、复制或本地保存。本工具通过抓包获取文章完整 HTML 内容,将其转换为结构化的 Markdown 文档并下载图片到本地,实现付费内容的长期保存与离线阅读。

前置准备

1. 安装抓包工具

推荐使用 Reqable(跨平台,支持 Windows/macOS/Linux),也可使用 Charles、Fiddler 等。

核心要求:能够解密 HTTPS 流量并导出完整的 HTTP 响应原始数据。

2. 配置 HTTPS 抓包

  1. 安装并信任 Reqable 的 CA 根证书
  2. 开启 HTTPS 解密功能
  3. 确保微信客户端的流量经过 Reqable 代理

提示:微信 PC 客户端默认使用系统代理,在 Reqable 中开启系统代理即可自动拦截。

3. 安装与运行

方式一(推荐):使用 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

抓包操作步骤

步骤一:启动抓包

  1. 打开 Reqable,开始捕获
  2. 在微信 PC 客户端中打开目标公众号文章
  3. 如果是付费文章,确保已完成付费(付费后才能获取完整内容)

步骤二:定位请求

在 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
    ...

Obsidian 集成

生成的 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 + 尺寸信息

付费文章 vs 免费文章

  • 免费文章:正文完整展示在 js_content 中
  • 付费文章(未付费):仅展示前 N% 的预览内容(由 preview_percent 控制,通常 50%)
  • 付费文章(已付费):与免费文章结构一致,正文完整在 js_content 中,额外有 appmsg_needpay=1 等付费标识

因此,必须在已付费的状态下抓包,才能获取完整内容。

正文 HTML 格式

微信文章不使用标准的 <h2>/<h3> 标题标签,而是通过内联样式来表达格式:

  • 段落: <p> 嵌套 <span leaf=""> → <span textstyle=""> → 文本
  • 标题: 通过 font-weight: bold 样式标识,本工具根据中文编号模式(如"一、""二、")自动识别为 Markdown 标题
  • 图片: 使用 data-src 属性(懒加载),CDN 域名为 mmbiz.qpic.cn
  • 列表: 标准 <ul>/<ol> 标签

局限性

  • 仅支持从 HTTP 原始响应文本解析,需要配合抓包工具使用
  • 微信文章的排版高度依赖内联 CSS 样式,转换为 Markdown 后会丢失部分视觉效果(如文字颜色、自定义字体等)
  • 音频、视频等多媒体内容不做处理
  • 需要手动操作抓包流程,暂不支持批量自动化

许可

仅供个人学习与存档使用,请尊重原创作者的知识产权。

About

用于导出和备份已经付费的微信文章

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages