我做了一个 Mac 公众号文章批量下载器:210 篇,1 分 53 秒归档完成
一款能批量下载任意可访问微信公众号全部历史文章的 Mac 应用,支持 Markdown、HTML、TXT、图片与 JSONL 导出。实测210篇1分53秒完成。
文章目录 · 8 节
微信公众号很适合读文章,却不太适合整理文章。
看到一篇有用的内容,我通常先收藏。等真正想做资料库时,才发现收藏夹里只有一串链接:不好批量搜索,图片依赖网络,文章一旦删除,链接也可能失效。想把某个公众号的历史文章系统保存下来,只能一篇篇打开、复制和整理。
所以我把之前写过的批量下载脚本重新做成了一个 Mac 应用:公众号文章下载器。
它可以批量读取任意可访问微信公众号的历史文章,不要求你是公众号管理员。只要在电脑微信里打开目标公众号任意一篇文章,就能读取该公众号的最近文章、全部历史或指定日期范围,再统一保存到本机。
它和公众号后台导出有什么区别
公众号后台只能管理和导出自己运营的账号。我的需求是整理平时阅读的内容:技术号、行业号、个人作者,很多都不是我管理的公众号。
这个工具走的是另一条路径。它使用电脑微信当前已经能访问的文章页面,识别公众号并读取历史列表。因此,它可以处理任意当前账号有权访问的公众号,同时也遵守微信实际返回的访问范围。
这意味着两件事:
- 不需要成为目标公众号的管理员;
- 付费、已删除、违规或被微信限制的内容,不会被工具绕过。
我觉得这个边界是合理的。工具解决的是重复劳动和本地整理,不是突破内容权限。
从“能下载”到“像一个应用”
旧工具其实早就能工作,但更像一个工程脚本。
启动时会打开终端,下载入口出现在文章网页里;所谓“下载记录”混着大量正文内容,下载中心也说不清是什么时间下载了哪个公众号。遇到三百篇文章时,用户只能看到任务还在跑,却不知道是 63/293,还是已经卡住。
这次我把整个流程收进了原生 SwiftUI 应用:
1. 在应用里连接电脑微信;
2. 在微信中打开目标公众号的一篇文章;
3. 回到应用选择公众号和读取范围;
4. 读取全部历史或指定日期;
5. 选择安全或快速模式下载;
6. 在下载中心查看进度和耗时,完成后直接打开公众号目录。
终端不再出现。每个公众号只对应一个同名目录,不再在名称后面追加一串内部标识。下载记录也不再展开正文,而是回到它真正应该做的事情:告诉我下载了什么、什么时候开始、完成了多少、失败了多少、总共用了多久。
一次下载,同时得到四种内容格式
每篇公众号文章会同时生成:
- Markdown:适合 Obsidian、知识库和后续编辑;
- HTML:保留原文章排版,可离线阅读;
- TXT:只保留正文,适合搜索与文本处理;
- JSONL:一行一篇,适合数据分析、检索和 AI 语料处理。
文章图片会保存到本地,Markdown 使用本地图片路径。JSONL 使用稳定文章地址去重,重复归档不会把同一篇文章写出多份。
默认目录结构是:
~/Downloads/公众号文章归档/<公众号名称>/
├── html/
├── markdown/
│ └── images/
├── text/
└── style_corpus.jsonl这套结构没有绑定某个笔记软件。你可以直接阅读,也可以把 Markdown 交给 Obsidian,把 TXT 放进全文检索,把 JSONL 接到自己的 AI 工作流里。
210 篇文章,快速模式用了 1 分 53 秒
性能优化前,同一个公众号210篇文章完整下载需要4分35秒。
我检查后发现,旧流程会先为了解析文章请求一次正文,真正导出时又请求一次;每张图片还会先发 HEAD 探测,再分别为 Markdown 和 HTML 下载。网络请求远比需要的多,速度慢,也更容易触发微信访问验证。
这一轮主要做了几件事:
- 每篇文章正文只请求一次,解析结果直接交给导出流程;
- 去掉图片的额外 HEAD 探测;
- 同一张图片只下载一次,Markdown 和 HTML 复用结果;
- JSONL 新文章直接追加,只有更新重复文章时才重写索引;
- 正文请求统一排队,避免短时间内同时打出大量请求。
优化后的安全模式从4分35秒降到了3分35秒。随后我又增加了快速模式。
| 模式 | 下载结果 | 总耗时 | 平均速度 |
|---|---|---|---|
| 安全模式 | 210/210 | 3分35秒 | 约58.6篇/分钟 |
| 快速模式 | 210/210 | 1分53秒 | 110.7篇/分钟 |
快速模式大约每秒处理两篇文章。这次完整实测最终210/210成功,失败0,HTML、Markdown、TXT和JSONL各210份,图片847张。
为什么还要保留安全模式
如果快速永远更好,就没有必要提供两个选项。
微信公众号对访问频率有自己的限制。首轮快速测试跑到第106篇时,出现过一次短暂访问验证。稍后重试可以成功,说明文章本身没有失效,只是请求节奏碰到了临时限制。
现在的快速模式会先自动降速重试;如果持续收到访问验证,才暂停同一批次剩余任务,避免留下几百条失败记录。安全模式限制为每秒最多一篇,更适合文章很多、准备让应用在后台慢慢跑的情况。
默认仍然是安全模式。用户明确选择快速,应用才会提速。
下载中心应该回答三个问题
我最后把下载中心收敛到三个问题:
1. 现在到哪了? 显示 63/293 这类明确进度,运行中估算剩余时间;
2. 这次结果怎样? 显示完成、失败、暂停和所用模式;
3. 文件在哪里? 点击“打开目录”直接进入对应公众号文件夹。
任务结束后,计时会固定下来,不会继续增加。页面会保留开始时间、结束时间、总耗时和平均每分钟文章数。下次再看到这个公众号时,我能马上知道最近一次是什么时候归档的。
数据为什么只保存在本机
这类工具会接触微信文章页中的临时凭证,也会保存大量文章内容。对我来说,本地运行比增加一个云端账号系统更合适。
应用只在 127.0.0.1 启动本地服务。第一次连接微信时,macOS 会要求信任一张在当前电脑生成的证书;证书私钥不会打包进应用,也不会上传。退出应用后,后台服务会结束,系统代理会恢复到连接前的状态。
下载的正文、图片、索引和任务记录都留在自己的 Mac 上。
怎么安装和使用
当前版本支持 macOS 14 及以上的 Apple Silicon Mac。
1. 下载公众号文章下载器;
2. 解压后拖入“应用程序”;
3. 第一次如果被 macOS 阻止,前往“系统设置 → 隐私与安全性”,点击“仍要打开”;
4. 启动应用并连接微信;
5. 在电脑微信里打开目标公众号任意一篇文章;
6. 回到应用读取历史并开始下载。
当前安装包还没有做 Apple 公证,所以第一次打开会多一步系统确认。项目源码、构建说明和每次发布记录也都放在 GitHub:
收藏解决的是“以后可能还想看”,归档解决的是“我希望这份内容真正属于自己的资料库”。如果你也积累了几个长期想研究的公众号,这个工具应该能省下不少逐篇复制的时间。