BBAIYA LAB
← 返回文章列表

我做了一个 Mac 公众号文章批量下载器:210 篇,1 分 53 秒归档完成

一款能批量下载任意可访问微信公众号全部历史文章的 Mac 应用,支持 Markdown、HTML、TXT、图片与 JSONL 导出。实测210篇1分53秒完成。

文章目录 · 8
  1. 它和公众号后台导出有什么区别
  2. 从“能下载”到“像一个应用”
  3. 一次下载,同时得到四种内容格式
  4. 210 篇文章,快速模式用了 1 分 53 秒
  5. 为什么还要保留安全模式
  6. 下载中心应该回答三个问题
  7. 数据为什么只保存在本机
  8. 怎么安装和使用

微信公众号很适合读文章,却不太适合整理文章。

看到一篇有用的内容,我通常先收藏。等真正想做资料库时,才发现收藏夹里只有一串链接:不好批量搜索,图片依赖网络,文章一旦删除,链接也可能失效。想把某个公众号的历史文章系统保存下来,只能一篇篇打开、复制和整理。

所以我把之前写过的批量下载脚本重新做成了一个 Mac 应用:公众号文章下载器

它可以批量读取任意可访问微信公众号的历史文章,不要求你是公众号管理员。只要在电脑微信里打开目标公众号任意一篇文章,就能读取该公众号的最近文章、全部历史或指定日期范围,再统一保存到本机。

下载公众号文章下载器 for macOS

它和公众号后台导出有什么区别

公众号后台只能管理和导出自己运营的账号。我的需求是整理平时阅读的内容:技术号、行业号、个人作者,很多都不是我管理的公众号。

这个工具走的是另一条路径。它使用电脑微信当前已经能访问的文章页面,识别公众号并读取历史列表。因此,它可以处理任意当前账号有权访问的公众号,同时也遵守微信实际返回的访问范围。

这意味着两件事:

  • 不需要成为目标公众号的管理员;
  • 付费、已删除、违规或被微信限制的内容,不会被工具绕过。

我觉得这个边界是合理的。工具解决的是重复劳动和本地整理,不是突破内容权限。

从“能下载”到“像一个应用”

旧工具其实早就能工作,但更像一个工程脚本。

启动时会打开终端,下载入口出现在文章网页里;所谓“下载记录”混着大量正文内容,下载中心也说不清是什么时间下载了哪个公众号。遇到三百篇文章时,用户只能看到任务还在跑,却不知道是 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/2103分35秒约58.6篇/分钟
快速模式210/2101分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:

收藏解决的是“以后可能还想看”,归档解决的是“我希望这份内容真正属于自己的资料库”。如果你也积累了几个长期想研究的公众号,这个工具应该能省下不少逐篇复制的时间。