# Download Wechat Articles

> 把用户自己名下微信公众号的全部「已发表」历史文章批量下载成干净 Markdown（带 frontmatter，图片保留外链），供备份或给 AI 当写作风格采样。用户只需在已登录的公众号后台网页里粘一段控制台脚本导出文章清单，其余由本地脚本完成，全程无需手动查找 token/cookie。触发词：下载我的公众号文章、备份公众号、导出公众号文章、把我的公众号存到本地、抓取我名下公众号、archive my wechat articles。

- Skill: `yijiaduan/download-wechat-articles` (Agent Skill, multi-file: 5 files)
- Install (CLI): `npx skillmds@latest add yijiaduan/download-wechat-articles`
- Raw SKILL.md: https://api.skillmd.com/api/skills/yijiaduan/download-wechat-articles/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: YijiaDuan (https://skillmd.com/u/yijiaduan)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/yijiaduan/download-wechat-articles

---


# 下载自己公众号的历史文章

帮用户把自己管理的微信公众号「已发表」文章全量存成本地 Markdown。用户是公众号管理员，能登录 mp.weixin.qq.com。

## 核心设计（为什么是这个流程）

一次踩坑得来的两条关键事实，决定了整个流程：

1. **文章永久链接 `mp.weixin.qq.com/s/xxx` 是公开的**，不带任何 cookie 直连就能拿到完整正文。所以「下正文」这步完全不需要登录态。
2. **只有「文章列表」接口 `appmsgpublish` 需要登录态**，而真正的会话 cookie 是 httpOnly 的，JS 读不出来，浏览器自动化工具也进不了 mp.weixin.qq.com 域。

所以不要试图去提取 token/cookie（又难又不安全）。正确做法是**让用户在已登录的后台页面的浏览器控制台里直接 fetch**——浏览器会自动带上登录态（含 httpOnly cookie），一键导出文章清单。凭证从头到尾不离开用户的浏览器。

流程两步：
- **第 1 步（需登录态，在浏览器里）**：控制台脚本调 `appmsgpublish` 分页拉全部文章，导出 `wechat_articles.json` 清单。
- **第 2 步（无需登录态，在本地）**：Python 脚本读清单，逐篇下公开链接、转干净 Markdown。

## 操作流程

### 0. 装依赖（第一次用时）
```bash
pip3 install requests beautifulsoup4 html2text lxml --break-system-packages
```
报错就去掉 `--break-system-packages` 重试。也确认 `python3 --version` 能跑（没有就 `xcode-select --install`）。

### 1. 引导用户导出文章清单
把 `assets/get_article_list.js` 的**整段内容**发给用户（用 Read 读出来贴给他），并给这段话：

> 1. 浏览器登录 mp.weixin.qq.com，进到后台首页（地址栏 URL 里能看到 `token=一串数字`）。
> 2. 按 F12（或右键→检查）打开开发者工具，切到 **Console / 控制台** 标签。
> 3. 把我发你的这段脚本整段粘贴进去，回车。
> 4. 它会自动分页抓取，完成后弹窗提示，并把 `wechat_articles.json` 下到你的「下载」文件夹。回来告诉我。

脚本原理已内置注释：读 URL 里的 token，`fetch` 调接口（`credentials:'include'` 自动带 cookie），分页去重后触发下载。用户全程不用找 cookie。

### 2. 本地转 Markdown
用户导出清单后，跑：
```bash
python3 ~/.claude/skills/download-wechat-articles/scripts/build_markdown.py [清单路径] [输出目录]
```
- 清单路径默认 `~/Downloads/wechat_articles.json`；输出目录默认 `./公众号文章`。
- 先 `--limit 3` 试跑三篇确认没问题，再去掉跑全量。
- 每篇间隔默认 3 秒（`--delay`）。已存在的文件自动跳过，支持断点续跑。

放后台跑（篇数多时超过 1 分钟），定期查进度，完成或报错主动汇报。

## 输出格式
每篇一个 `YYYY-MM-DD_标题.md`（特殊字符已清洗），顶部 frontmatter 含 title / url / publish_date / digest，正文为 Markdown，图片保留腾讯 CDN 外链（不本地化）。

## 已知坑与排错
- **文字消息类型**（`item_show_type=8`，朋友圈式短文）：正文由 JS 渲染，页面无 `js_content` 容器。脚本已自动用清单里的 `digest`（就是全文）回退 + 附封面图，不用管。
- **控制台脚本报 ret≠0**：登录态失效或频率限制。刷新页面重登后重跑脚本。
- **build_markdown 大量失败**：多半是被系统代理干扰。脚本已 `trust_env=False` 直连；若仍失败，`curl` 分别测直连和代理定位。
- **触发频率控制**：`--delay` 调到 8，隔一会儿再跑（已下载的会跳过）。
- 清单里若某篇 `create_time` 缺失，文件名日期会是 `unknown`，属正常兜底。

## 复用说明
本 skill 面向「任何管理员下载自己公众号」的通用场景：路径全部参数化、不写死个人目录，控制台脚本的 token 在运行时从 URL 读取、不硬编码任何凭证。可直接分享给他人使用。

