乐于分享
好东西不私藏

我把公众号文章下载做成了一个本地工具箱

我把公众号文章下载做成了一个本地工具箱

   最近我把一个平时自己用的小工具整理成了一个本地运行的工具箱:它可以管理微信公众号文章下载,也能处理微信视频号、抖音资源下载,以及已下载视频的转码压缩。   这类工具看起来不复杂:登录、复制链接、下载、保存。真正做起来才发现,难点并不在“把一个页面抓下来”,而在于怎么把整个流程做得稳定、清楚、可恢复,并且尽量不把私人登录态暴露到云端。    为什么要做这个工具   我最开始的需求很朴素:有些公众号文章、视频号内容、抖音素材,想在本地长期保存,方便检索、归档和二次整理。   手动保存的问题很快就出现了:        文章里的图片、音视频资源经常是独立地址,只保存网页不一定完整。     不同平台的链接形态不一样,复制、解析、下载容易重复劳动。     下载后的文件如果没有历史记录和目录结构,时间久了很难找。     视频素材下载下来以后,还经常要压缩、转码或提取音频。      所以这个项目没有把自己做成一个云服务,而是选择本地优先:数据存在自己机器上,登录态存在本地配置里,界面也是本机 Flask 后端加前端页面,必要时可以用桌面窗口打开。    现在它能做什么   在微信公众号部分,工具支持扫码登录微信公众平台,然后在本地保存登录态,用来搜索公众号、收藏账号、读取文章列表,并按列表、时间范围或单篇 URL 下载文章。   
下载时不仅保存 HTML,还会尽量把正文里的图片、音频、视频等资源一起落到本地目录,并生成元数据。这样以后打开文章,不必完全依赖原始页面是否还在。   项目也支持 RSS。手动下载的文章和自动抓取的文章可以合并输出到 RSS Feed,也可以按公众号分别输出。对长期关注某些账号的人来说,这比反复打开后台或手动检查要轻很多。   除了公众号,工具箱里还放进了微信视频号和抖音相关能力:可以解析分享链接、查看作者作品、批量下载,并保留下载历史。视频下载后,还可以进入转码模块,做 H.264/H.265 转码、码率控制、音频提取,甚至按不同硬件编码器做加速。    结构上怎么拆   这个项目的主体是一个本地 Web 应用。后端用 Flask 提供接口,前端负责操作界面;如果需要桌面形态,就用 pywebview 包一层窗口。这样的好处是调试简单,浏览器能访问,打包后也能像普通桌面应用一样使用。   公众号登录部分使用 Playwright 打开微信公众平台,由用户自己扫码。登录成功后,工具只把必要的 token、cookie 和保存时间写到本地配置文件。后续接口调用都从本地读取,不需要把登录态交给远程服务器。   文章列表获取主要围绕微信后台接口做封装,搜索公众号、分页读取文章列表、解析返回结构,再交给下载模块处理。下载模块则负责请求原文、解析正文、补全资源地址、下载媒体文件、重写本地引用,并把标题、摘要、封面、发布时间等信息写进元数据。   RSS 和历史记录是另一个关键点。没有历史记录,下载只是一次性动作;有了历史记录,工具才像一个可以长期使用的资料库。RSS 调度器会按订阅配置和时间窗口抓取新内容,并把成功下载的文章加入统一输出。   转码模块则把“下载完成”之后的工作接了起来。很多素材不是下载下来就能直接用,体积、编码、音轨都可能需要处理。把转码放进同一个工具箱,可以少开几个软件,也能保留更完整的处理链路。    做这个项目的一点体会   第一,工具越贴近日常工作,越应该克制。这个项目没有追求复杂的云端架构,也没有把所有平台混成一个大而全系统,而是把常用动作做顺:登录、搜索、下载、归档、查看历史、转码。   第二,本地优先很重要。涉及平台登录态的工具,最不应该做的就是到处传凭证。保存在本机、只在本机使用、界面里只显示必要状态,这些看起来是小事,但会直接影响工具能不能放心长期使用。   第三,抓取不是目的,整理才是目的。真正有价值的不是“我能下载一篇文章”,而是下载后的内容能不能打开、能不能检索、能不能订阅、能不能继续加工。   第四,做自动化要给自己留余地。平台页面、接口、风控策略都可能变化,所以代码里要把登录、账号管理、文章读取、下载、RSS、转码拆开。某一块变了,至少不用推倒重来。    最后   这个工具箱并不神秘,本质上就是把很多重复的小动作串起来,并尽量让它们可见、可控、可恢复。   如果你也经常需要整理公众号文章、视频素材,或者想把内容资料留在本地,类似的思路会很有用:先把流程跑通,再把历史、元数据、目录结构和后续处理补上。   一个好用的工具,往往不是一开始就很大,而是它真的替你省下了那些每天都要重复的小麻烦。   注:本文介绍的是个人授权范围内的本地资料管理思路,请遵守平台规则、版权要求和内容使用边界。