今天在 GitHub Trending 上看到一个非常有情怀的项目:QzoneArchive,它帮助你把承载青春记忆的QQ空间内容安全地归档到本地,让你的回忆不再依赖平台存续。

一、项目概述

QzoneArchive 是一款跨平台的桌面和移动端应用,专注于将QQ空间的动态、照片、视频与互动记录安全地归档到本地。它基于 Tauri 2 框架开发,前端使用 Vue 3 + TypeScript,后端使用 Rust,数据存储在本地 SQLite 数据库中。

核心价值:

  • 解决QQ空间内容无法批量导出的问题
  • 让用户拥有自己数据的完全控制权
  • 支持跨平台使用(Windows / macOS / Linux / Android)

主要特性:

  • 完整归档:还原原始动态正文、图片、视频和评论,按"本人动态"、“好友动态”、“留言"分类整理
  • 断点续传:中断后自动从上次位置继续,已归档的内容不会丢失
  • 频率保护:每10分钟最多请求300页,触发限流后安全暂停,倒计时结束即可继续
  • 互动还原:查看每条动态的点赞用户和评论回复,支持互动排行榜
  • 本地存储:所有数据以SQLite保存在本地应用数据目录,不上传任何服务器
  • HTML导出:支持按分类或选中导出为独立HTML文件,可离线浏览
  • 媒体时光轴:按年份浏览归档的照片和视频,视频支持按需缓存
  • 暗色模式:跟随系统或手动切换

二、技术原理

2.1 架构设计

项目采用 Tauri 2 的经典架构:Rust 后端负责核心业务逻辑和数据持久化,Vue 3 前端负责用户界面,通过 Tauri 的 IPC 机制进行通信。

┌─────────────────────────────────────────────────────┐
│                   Vue 3 Frontend                     │
│  ┌─────────┬──────────┬──────────┬───────────┐      │
│  │Dashboard│ Archives │  Media   │   Tasks   │      │
│  │  View   │   View   │Timeline  │   View    │      │
│  └────┬────┴────┬─────┴────┬─────┴─────┬─────┘      │
│       │         │          │           │            │
│  ┌────┴─────────┴──────────┴───────────┴────┐       │
│  │           Pinia State Management          │       │
│  └────────────────────┬─────────────────────┘       │
└───────────────────────┼─────────────────────────────┘
                        │ Tauri IPC
┌───────────────────────┼─────────────────────────────┐
│                 Rust Backend                        │
│  ┌────────────┬────────────┬──────────────┐         │
│  │  qlogin.rs │  qzone.rs  │  archive.rs  │         │
│  │  QQ登录    │  API接口   │  归档引擎     │         │
│  └─────┬──────┴─────┬──────┴──────┬───────┘         │
│        │            │             │                  │
│  ┌─────┴────────────┴─────────────┴──────┐          │
│  │         SQLite Database (rusqlite)     │          │
│  └────────────────────────────────────────┘          │
└─────────────────────────────────────────────────────┘

2.2 数据来源与接口

归档基于QQ空间的移动端互动列表接口 (mobile.qzone.qq.com/get_feeds)。该接口返回当前账号收到的所有互动通知——包括好友发布的新动态、点赞、评论、回复、留言等。程序从中提取原始动态内容并存入本地数据库。

注意:没有被点赞或评论过的动态无法被恢复,因为它们不会出现在互动列表中。

2.3 核心技术栈

层技术选型理由
桌面框架Tauri 2比Electron更轻量,Rust后端性能优异
前端Vue 3 + TypeScript + Vite现代化前端栈,类型安全
UI组件PrimeVue 4丰富的企业级组件
状态管理PiniaVue 3 官方推荐的状态管理
后端数据库SQLite (rusqlite)轻量级本地存储,无需额外服务
HTTP客户端reqwest (rustls-tls)Rust生态标准HTTP库
打包NSIS (Windows) / Android APK跨平台分发支持

2.4 登录安全机制

项目实现了两种登录方式,且特别注重安全性:

// 登录凭证仅存储在 Rust 后端内存中,不会写入控制台或日志
// 示意代码(非源码)
pub struct QzoneSession {
    cookie: String,  // 仅内存持有
}

impl QzoneSession {
    // 二维码登录:调用QQ空间移动端扫码登录流程
    pub async fn login_by_qrcode(&mut self) -> Result<()> {
        // 全程不接触密码
    }
    
    // 网页登录(桌面端):通过WebView Cookie API提取登录凭证
    pub async fn login_by_webview(&mut self) -> Result<()> {
        // Cookie不落盘
    }
}

2.5 频率保护机制

为避免账号风险,项目内置了请求频率限制:

// 频率保护逻辑示意
const MAX_PAGES_PER_10_MIN: usize = 300;

pub struct RateLimiter {
    request_count: usize,
    window_start: Instant,
}

impl RateLimiter {
    pub fn check_and_wait(&mut self) -> Result<()> {
        if self.request_count >= MAX_PAGES_PER_10_MIN {
            let elapsed = self.window_start.elapsed();
            if elapsed < Duration::from_secs(600) {
                let wait_time = Duration::from_secs(600) - elapsed;
                // 安全暂停,倒计时结束即可继续
                sleep(wait_time);
            }
            self.reset();
        }
        self.request_count += 1;
        Ok(())
    }
}

三、安装与快速开始

3.1 环境要求

桌面端:

  • Windows 10+(需要WebView2,系统自带)
  • macOS 10.15+
  • Linux(需要WebkitGTK)

移动端:

  • Android 7.0+

开发者构建:

  • Rust 1.77+
  • Node.js 20+

3.2 安装步骤

方式一:下载预编译包

从 GitHub Releases 页面下载对应平台的安装包:

  • Windows: .exe (NSIS安装包)
  • macOS: .dmg
  • Linux: .AppImage 或 .deb
  • Android: .apk

方式二:从源码构建

# 克隆仓库
git clone https://github.com/Gaoshu705/QzoneArchive.git
cd QzoneArchive

# 安装前端依赖
npm install

# 启动开发服务器(桌面端)
npm run tauri dev

# Android 构建
npm run tauri android dev

3.3 构建生产版本

# Windows NSIS 安装包
npm run tauri:build:windows

# Windows NSIS + MSI
npm run tauri:build:windows:all

# Android APK
npm run tauri android build

四、使用方法与实战

4.1 首次使用

  1. 启动应用后,选择登录方式:

    • 二维码登录:使用手机QQ扫描屏幕上的二维码
    • 网页登录:在弹出的窗口中完成QQ登录
  2. 登录成功后,进入归档任务页面,点击"开始归档”

  3. 归档过程中可以随时暂停或关闭应用,下次打开会自动从断点继续

4.2 浏览归档内容

归档完成后,可以:

  • 分类浏览:在"归档内容"页面,按"本人动态"、“好友动态”、“留言"分类查看
  • 搜索功能:支持关键词搜索历史动态
  • 媒体时光轴:按年份查看归档的照片和视频
  • 互动排行:查看互动最频繁的好友

4.3 导出数据

支持两种导出方式:

  1. HTML导出:选择分类或特定动态,导出为独立HTML文件,可离线浏览
  2. 数据库备份:应用数据存储在本地SQLite数据库中,可直接备份该文件

4.4 高级配置

应用设置页面提供:

  • 存储路径自定义
  • 归档频率调整
  • 请求超时设置
  • 暗色模式切换

五、常见问题与解决方案

5.1 登录失败

问题:二维码过期或网页登录无响应

解决方案:

  • 确保网络连接正常
  • 尝试重新生成二维码
  • 检查是否被QQ安全中心拦截

5.2 归档中断

问题:归档过程中出现错误或中断

解决方案:

  • 应用支持断点续传,直接重新开始即可
  • 如果频繁失败,可能是限流触发,建议换时间段

5.3 部分动态无法恢复

问题:某些早期动态没有出现在归档中

解决方案:

  • 这是正常现象:只有被点赞或评论过的动态才能被恢复
  • 可以在"好友动态"分类中查找

5.4 视频无法播放

问题:归档的视频显示链接过期

解决方案:

  • QQ的视频签名有时效性
  • 重新执行归档任务可以更新视频地址

5.5 账号安全

问题:担心归档操作会影响账号安全

解决方案:

  • 登录凭证仅存储在内存中,不会写入磁盘
  • 应用不会上传任何数据到服务器
  • 建议不要在归档过程中频繁切换账号

六、总结

QzoneArchive 是一个充满情怀的实用工具,它解决了QQ空间用户长期以来的痛点:无法批量导出自己的内容。项目采用现代化的技术栈(Tauri 2 + Vue 3 + Rust),实现了跨平台支持、断点续传、频率保护等关键功能,并且特别注重数据安全和隐私保护。

推荐人群:

  • 希望备份QQ空间回忆的用户
  • 关注数据自主权的用户
  • 对Tauri跨平台开发感兴趣的开发者

项目亮点:

  • 完整的本地存储方案,数据完全由用户掌控
  • 人性化的频率保护机制,避免账号风险
  • 支持HTML导出,方便长期保存和分享

开源地址:https://github.com/Gaoshu705/QzoneArchive

如果你也有QQ空间的回忆想要保存,不妨试试这个工具,让你的青春记忆不再依赖平台存续。