WeChat Article Grabber(微信公众号文章抓取 → Markdown + 图片)
把某个公众号的文章批量抓下来,正文转成 Markdown、图片落地到本地 images/ 目录。产出的就是纯 md + 图片,方便阅读、归档、二次加工。不做网页,也不做电子书——就这么简单。
何时触发本技能
- "抓取某公众号的文章" / "把这个号的所有文章下载下来"
- "导出这个公众号的所有文章链接" / "给我这个号的文章清单"
- "把这个公众号的合集文章全部保存"(作者把文章归入「合集」的情况)
- 用户丢来一条
mp.weixin.qq.com/s/...文章链接,想批量拿同号内容
工作方法(免凭证,无需登录、无需抓包)
微信没有公开的文章列表 API,但公众号的「合集」(appmsgalbum) 是公开接口——任何人点开公众号合集都能看到,不需要 key / cookie / 抓包。本技能利用这个接口枚举某号的全部文章。
> 前提:该公众号建了「合集」(绝大多数号都有)。若作者一篇都没归合集,则本技能无法抓取其历史文章——这是有意为之的合规边界,不提供任何绕过方式(不登录、不抓包、不提取会话凭证)。
工作流(按这个顺序做)
- 复制/定位脚本:技能自带
scripts/,可直接在该目录运行,或复制到任意工作区。 - 导出链接清单(最快验证可行性):
python wx_grabber.py links "<文章链接>" --title "公众号名" - 抓合集全量正文:
python wx_grabber.py album "<文章链接>" --download→ 产出articles/*.md+images/ - 只抓单篇:
python wx_grabber.py single "<文章链接>"
关键命令速查
# 导出该号所有合集的文章链接(md/csv/txt/html 四份)
python wx_grabber.py links "<任意一篇文章链接>" --title "公众号名"
# 直接抓某个合集的全部文章正文 -> articles/*.md + images/
python wx_grabber.py album "<任意一篇文章链接>" --download
# 抓列表,再分两步下正文(中断后可直接重跑 download,已抓的会跳过)
python wx_grabber.py album "<任意一篇文章链接>"
python wx_grabber.py download
# 只抓单篇(多个链接空格隔开)
python wx_grabber.py single "<链接1>" "<链接2>"
输出结构
output/<__biz>/
├── articles/*.md # 每篇一个 Markdown,带 YAML front matter
├── images/ # 正文图片(原图落地)
├── links.md/csv/txt/html # 链接清单(links 命令)
└── _articles.json # 文章列表(album 产出,download 复用)
每篇 md 的 front matter 形如:
---
title: "文章标题"
account: "公众号名"
author: "作者"
published: "2026-09-24 19:00"
url: https://mp.weixin.qq.com/s?__biz=...&mid=...&idx=1&sn=...
digest: ""
images: 48
grabbed_at: 2026-10-03 07:15:47
---
> md 与 images/ 是同级目录,所以正文里的  直接就能显示,不需要改任何路径。
想要「最新 N 篇」怎么办
合集接口是「最旧 → 最新」升序返回的,所以 album --limit 20 拿到的是最旧 20 篇。
要最新 N 篇:先不带 --limit 拉全量列表,再把列表按时间倒序截取前 N 条,然后 download。
python wx_grabber.py album "<链接>" # 拉全量列表到 _articles.json
python - <<'PY' # 截取最新 20 篇
import json, pathlib
p = pathlib.Path("output/<__biz>/_articles.json")
items = json.loads(p.read_text(encoding="utf-8"))
items.sort(key=lambda a: a.get("datetime") or 0, reverse=True)
p.write_text(json.dumps(items[:20], ensure_ascii=False, indent=2), encoding="utf-8")
PY
python wx_grabber.py download # 只下这 20 篇(会自动找到该目录)
完整参数与报错排查见 python wx_grabber.py --help(每个子命令都支持 -h)。
技术要点(写代码/改脚本时有用)
- 免凭证「合集」接口:
mp.weixin.qq.com/mp/appmsgalbum?action=getalbum,翻页用begin_msgid/begin_itemidx,返回getalbum_resp.article_list,continue_flag控制是否继续;最后一页article_list会变成单个字典而非数组(已做兼容)。 - 图片懒加载:真实地址在
data-src而非src;落地时按内容哈希命名到images/,md 里改写成相对路径引用。 - 断点续传:列表存
_articles.json,正文进度存_state.json,中断后重跑download会跳过已抓的。 - 必须用微信内置浏览器 UA(
UA_WECHAT常量),否则命中风控。
合规与安全(务必保留/告知用户)
- 本技能仅使用微信公开的「合集」浏览接口,不登录、不抓包、不提取任何会话凭证(
key/cookie等),从设计上规避越权自动化风险。 - 抓取内容仅供个人阅读/研究/归档,勿二次发布或商用;文章版权归原作者及公众号所有。
- 默认限速 6 秒 + 随机抖动;调太快会被风控,反而更慢。
- 批量抓取可能违反微信服务条款,请用户自行评估风险、控制频率,不对平台造成压力。
- 本技能不含任何凭证;脚本不对外发送任何用户数据。