QzoneArchive 的 Rust 后端——HTTP、数据库和 Cookie 管理
Rust 后端做什么
QzoneArchive 的 Rust 后端是整个应用的"大脑"。它负责:
- 归档任务调度:控制请求节奏、断点续传、频率保护
- HTTP 客户端:向 QQ 空间接口发起请求,处理 Cookie 和限流
- 数据库操作:用 rusqlite 读写 SQLite,处理归档数据入库
- 媒体缓存:下载图片和视频到本地磁盘
- Cookie 管理:登录凭证的生成、存储(仅内存)和生命周期管理
- IPC 接口:向前端暴露受限的 API,而不是暴露底层操作
核心依赖
| crate | 作用 |
|---|---|
reqwest | HTTP 客户端,支持 rustls-tls(不依赖 OpenSSL) |
rusqlite | SQLite 绑定,支持 FTS5 全文搜索 |
serde / serde_json | JSON 序列化(QQ 空间接口返回的是 JSON) |
tauri | Tauri 框架本身的后端库 |
为什么选 reqwest 而不是其他 HTTP 库?reqwest 是 Rust 生态最成熟的 HTTP 客户端,支持 rustls-tls(用 Rust 原生实现的 TLS,不依赖系统的 OpenSSL),这对跨平台构建很重要。
归档流程的 Rust 侧实现
从 Rust 后端的视角看,一次归档的核心流程:
- 登录:前端通过 IPC 请求登录 → Rust 后端与 QQ 空间交互 → Cookie 存入内存
- 抓取:循环调用互动列表接口 → 拿到一批互动记录 → 从中提取原始动态 → 入库
- 断点续传:每批完成后更新任务状态表 → 下次启动时读这个位置继续
- 限流检测:检测响应状态码 → 触发限流时暂停 + 倒计时
- 媒体缓存:下载图片视频到本地路径 → 在数据库里记录路径引用
为什么 Rust 好
对于 QzoneArchive 这种"长时间挂机、需要处理网络波动和限流、需要内存安全"的工具,Rust 的优势特别明显:
- 内存安全:不会因为空指针、悬垂指针导致进程崩溃(归档跑了 3 小时突然崩了很烦人)
- 高性能:HTTP 请求和数据库操作都是原生性能
- 无运行时开销:不像 Node.js 有一个完整的运行时环境
- 与 Tauri 深度集成:Tauri 的后端就是 Rust,IPC 类型检查在编译期就能发现错误