SaveNowX 是一个免费工具,把公开的 X(Twitter)帖子解析成可下载的视频,无需账号、无水印、不留历史记录。作者在开发之初设下一条硬约束:服务器端任何内容都不落盘,不存视频文件、不存下载历史,也就没有清理和泄露的问题。这条约束逼出了一系列架构决策。
解析接口 GET /api/resolve?url= 只返回元数据和 CDN 地址,从不下载或代理任何视频字节。它优先走 X 的公开 syndication 接口,失败时才回退到 yt-dlp。结果按推文 ID 缓存,成功解析缓存 1 小时,确认「无视频 / 未找到」只缓存 5 分钟,避免错误链接被反复请求时持续打后端。
解析出直链 MP4 后,后端完全不参与传输。下载按钮指向一个 Cloudflare Worker,它唯一的工作是设置 Content-Disposition: attachment 响应头,因为浏览器会忽略跨域链接上的 HTML download 属性。视频直接从 X 的 CDN 到用户设备,FastAPI 后端一个字节都看不到。
对于只有 HLS 的帖子(.m3u8 加一堆 .ts 分片),重定向无法生成单个文件,需要真正抓取分片并重新封装。这类情况走一套任务系统:POST /api/download/url-start 启动,GET /status/{id} 轮询真实进度,GET /file/{id} 取回文件,发送完成后立即删除临时文件。MP3 提取则把最低码率的音频变体通过 ffmpeg 直接管道输出到 HTTP 响应流,不写中间文件,并发转换数有上限。
整套技术栈是 Next.js + FastAPI + Cloudflare Worker。作者认为,把「永不存储」当作硬性架构约束而非事后补上的策略,才催生了 syndication 优先、双 TTL 缓存、边缘 Worker 替代后端代理、临时文件不跨请求存活这些设计。
