最近几年越来越多朋友开始翻自己的 QQ 空间十年前发的说说、大学时候传的照片、留言板里朋友写下的“踩踩”都像时间胶囊一样躺在那里。问题也随之而来——日志和相册数量一多想批量保存到本地非常麻烦如果不小心删了内容想找回来更是难上加难。官方一直没有提供完整的导出方案于是 GitHub 上陆续出现了一些开源项目其中就包括被反复讨论的qzonearchive也就是大家常说的“QQ 空间恢复助手”。本文以gaoshu705/qzonearchive为切入点结合 GitHub 开源项目下载、Python 环境准备、Cookie 抓取、数据接口分析等一系列实操知识点整理一份完整的 QQ 空间数据归档方案。内容既适合只是想备份自己空间内容的新手也适合想研究开源爬虫项目、学习数据导出流程的开发者。1. 背景与核心概念为什么需要 QQ 空间恢复助手1.1 QQ 空间的数据困境QQ 空间上线多年几乎承载了一代人的互联网记忆。早期用户在其中发布说说、撰写日志、上传相册还养成了“互踩留言”的习惯。但几年过去很多用户发现平台侧并没有提供方便的“全量数据导出”功能。想备份自己的日志就得一篇一篇复制想下载相册得点开大图再另存想保留完整留言板更是找不到任何入口。更尴尬的是如果某一篇日志被误删或者某条说说因为各种原因不可见用户想找回时往往只能求助第三方工具而市面上的第三方工具要么收费要么来源不明存在隐私风险。这就催生了开源项目的价值让用户自己掌握备份数据和“恢复可见内容”的能力同时把代码完全公开避免未知代码悄悄上传个人数据。1.2 qzonearchive 是什么qzonearchive是托管在 GitHub 上的开源项目作者仓库名为gaoshu705/qzonearchive。从项目名称和社区讨论来看它的核心目标可以概括为在用户登录授权的前提下拉取 QQ 空间中当前账号有权限看到的数据将数据整理成结构化的本地文件例如 JSON、Markdown、HTML方便用户后续搜索、浏览、迁移或对误删内容进行“可见层级”的归档恢复。需要明确一点这类工具通常无法突破平台权限不能把已经被服务器永久删除的数据凭空变回来。它做的事情更像是“把你还能看到的数据完整拿下来并以可读的方式保存好”因此更准确的说法是“数据归档与本地恢复”。1.3 为什么选择 GitHub 开源方案选开源方案主要有三个原因。第一代码可审计。比起直接下载一个来路不明的 exe开源项目至少可以把代码下载下来检查确认它到底有没有往第三方服务器发送数据。第二社区迭代快。QQ 空间前端接口一旦调整原本可用的脚本就会失效开源项目通常会有维护者及时跟进或者由社区提交 Pull Request 修复。第三学习价值高。这类项目包含登录态处理、HTTP 请求、JSON 解析、分页抓取、文件导出等经典知识点非常适合当作 Python 爬虫与数据归档的入门实践。2. 项目功能拆解一个“空间归档助手”应该做什么2.1 常见的数据类型在分析项目之前先明确 QQ 空间里有哪些常见数据。通常一个归档工具会按照内容类型分模块处理数据类型说明归档难点说说用户在“说说”模块发布的文字、图片、视频内容分页多、图片链接可能过期日志长篇图文日志需要解析富文本与图片相册照片与相册分类需要原图地址不能只存缩略图留言板好友或自己的留言记录翻页多内容量大个人资料头像、昵称、签名等基础信息更新频繁具体到qzonearchive它能导出的数据范围要以仓库 README 为准因为不同版本的能力不完全一样。不过大多数同类项目都会优先覆盖“说说 日志 相册”因为这三类是用户最舍不得删的内容。2.2 它和“强行恢复”的区别很多人在热搜里搜“github 恢复 qq 空间”默认以为工具能“解封”“找回已删除内容”。这里必须做一个概念澄清“可见内容归档”把当前登录账号在浏览器里能看到的说说、日志、相册抓下来保存到本地。这个目标在技术上可行。“不可见内容恢复”如果内容已经被作者删除、被平台屏蔽或者不在你的访问权限范围内那么普通前端脚本无法获取到开源工具也无能为力。因此把这类工具称作“恢复助手”是可以理解的但更准确的定位是“备份与归档助手”。它最大价值在于当你还没有彻底失去内容时第一时间建立一份本地副本。2.3 输出结果长什么样归档类项目通常会在本地生成一个目录里面包含原始数据文件JSON保留接口返回的所有字段可读的 Markdown 或 HTML 页面方便直接浏览图片等静态资源目录避免原图链接失效后内容流失。这样的输出设计既考虑了数据完整性也考虑了用户的实际阅读体验。3. 环境准备与版本说明3.1 本地环境需要什么运行这类 Python 开源脚本不用太高的硬件门槛普通电脑即可。建议环境如下工具建议版本用途操作系统Windows 10/11、macOS、Linux跨平台运行Git2.x克隆仓库、查看更新Python3.8 及以上运行脚本浏览器Chrome、Edge 等登录 QQ 空间并抓取 Cookie命令行终端Windows Terminal、iTerm2 等执行命令具体 Python 版本依赖不同项目差别较大。有的项目会指定python-requires有的会在requirements.txt中体现建议先看仓库文件再安装不要盲目使用最新版 Python。3.2 GitHub 下载的几种方式因为网络原因GitHub 页面和 git 命令有时访问不稳定。如果你遇到clone超时或者下载中断可以考虑以下方式按优先级排序第一种直接在仓库页面点击Code - Download ZIP下载源码压缩包到本地再解压。这种方式不需要安装 Git适合只使用项目的用户。第二种使用git clone命令后续拉取更新更方便。命令格式如下git clone https://github.com/gaoshu705/qzonearchive.git第三种如果确实无法访问可以考虑使用国内公开的代码托管平台或镜像站但需要注意不要在不可信的第三方镜像上登录账号、提交 Cookie 或下载来历不明的二次打包文件。不管从哪个渠道获取源码都应该对比仓库主页的提交记录和文件列表确认源码没有被篡改。3.3 项目目录结构参考开源项目在 README 中一般会画出目录结构。这里以常见的数据归档项目为例给一个结构参考具体以实际仓库为准qzonearchive/ ├── README.md # 使用说明 ├── requirements.txt # Python 依赖 ├── config.example.json # 配置模板 ├── src/ │ ├── client.py # 网络请求与接口封装 │ ├── parser.py # 数据解析 │ └── exporter.py # 导出 JSON / Markdown └── output/ # 归档结果输出目录看到这样的结构你应该能大致判断client.py负责和 QQ 空间接口打交道parser.py负责处理返回数据exporter.py负责生成最终文件。这也是很多爬虫项目的通用分层方式。4. 核心原理拆解数据归档工具的工作方式4.1 登录态与 CookieQQ 空间的接口虽然是前端接口但并非完全公开。服务器需要知道“你是谁”以及你是否具备访问某些数据的权限。这个身份的凭证就是 Cookie。浏览器在登录 QQ 空间后会把会话信息保存在 Cookie 里。脚本模拟浏览器请求时只需要把这个 Cookie 放到 HTTP 请求头中服务器就会认为请求来自登录用户。抓取 Cookie 的通用方法打开 Chrome 或 Edge无痕窗口登录qzone.qq.com。按F12打开开发者工具切换到 Network网络面板。刷新页面在请求列表中点击任意一个带有qzone域名的请求。在 Headers 面板中找到Request Headers - Cookie复制完整值。需要注意Cookie 本质上是“会话钥匙”泄露后他人可以在一定时间内冒充你的身份。因此不要在公开环境分享 Cookie也不要把 Cookie 提交到 GitHub 仓库。4.2 接口与分页拉取登录态拿到后脚本会调用 QQ 空间前端页面使用的数据接口。这些接口一般返回 JSON 格式的数据包含说说的内容、发布时间、图片列表、评论数等字段。为了减小服务器压力接口通常采用分页机制一次只返回十几条或几十条数据。脚本需要根据分页参数循环请求直到没有更多数据为止。下面是一段理解接口调用思路的示例代码不是项目原代码仅供学习# 文件路径archive_demo.py # 说明简化示例用于帮助理解“携带 Cookie 请求接口”的基本思路 import requests def fetch_moment_page(cookie: str, uin: str, page: int 0): 拉取指定页的说说数据。 注意 1. 仅用于备份自己账号下有权限访问的内容 2. 实际接口路径和参数以浏览器 Network 面板为准。 url https://user.qzone.qq.com/proxy/domain/taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6 params { uin: uin, pageNumStart: page, cmd: getByTime, } headers { Cookie: cookie, Referer: fhttps://user.qzone.qq.com/{uin}/311, User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) } try: resp requests.get(url, paramsparams, headersheaders, timeout10) resp.raise_for_status() return resp.json() except requests.RequestException as e: print(f请求失败{e}) return None if __name__ __main__: # 生产代码中不要硬编码 Cookie建议通过环境变量或本地配置文件读取 import os qq_number os.getenv(QZONE_UIN, 123456) user_cookie os.getenv(QZONE_COOKIE, ) data fetch_moment_page(user_cookie, qq_number, page0) if data: print(接口返回状态, data.get(code))这段代码想说明三个关键点Cookie放在请求头中让服务器识别身份Referer用于模拟正常浏览器访问很多前端接口会校验来源timeout很重要避免网络异常时脚本卡死。实际项目中接口地址随时可能调整字段名也可能变化。因此在运行任何开源工具前都应该用浏览器开发者工具对比一下接口格式是否和代码中一致。4.3 本地存储与导出数据拉取后不能只躺在内存中需要落盘。常见做法是保留一份 JSON 原始数据方便后续程序化处理再生成一份 Markdown 或 HTML 页面方便人直接阅读。如果项目支持相册导出还会建立images/目录把图片下载到本地。建议导出后先检查图片是否完整因为空间图片链接有时会带上防盗链参数换个环境可能无法加载。4.4 频率控制与异常处理直接高频请求接口很容易触发风控轻则返回验证码重则临时限制登录。优秀项目一般会在代码里加入请求间隔、重试机制和随机延迟。如果你打算自己修改脚本至少要遵守以下原则请求间隔不小于 1 秒遇到 5xx 错误时退避重试单次运行设置最大页数或总数限制避免失控。5. 完整实战案例从克隆到运行5.1 获取源码假设网络环境正常直接执行git clone https://github.com/gaoshu705/qzonearchive.git cd qzonearchive如果你没有安装 Git也可以打开仓库页面点击Code按钮选择Download ZIP下载后解压并进入目录。为什么要优先使用git clone因为后期如果作者修复了 Bug你只需要在仓库目录执行git pull就能同步更新不用重新下载压缩包。5.2 创建 Python 虚拟环境进入项目目录后建议创建虚拟环境避免依赖污染系统 Python 环境。python -m venv venv安装依赖# Windows venv\Scripts\activate # macOS / Linux source venv/bin/activate pip install -r requirements.txt使用虚拟环境的好处是项目依赖被隔离在一个独立目录中即使安装出错也不会影响电脑上的其他 Python 项目。如果你发现requirements.txt不存在就去 README 中找依赖安装说明常见项目要么使用setup.py要么在 README 中直接给出pip install xxx命令。5.3 准备配置文件大部分项目会把登录信息放在配置文件中。项目通常会提供一个config.example.json模板你需要复制一份并重命名为config.json再填写自己的信息。一个示意配置如下{ uin: 你的QQ号, cookie: 抓取到的Cookie请勿公开, target_dir: backup_output, export_format: [json, markdown] }注意填写config.json后建议在项目根目录新建一个.gitignore文件把config.json和backup_output/加入忽略列表防止将来误提交到 Git 仓库导致 Cookie 泄露。config.json backup_output/ venv/ __pycache__/5.4 运行归档命令项目入口和参数需要参考 README。通用思路是执行类似下面的命令python main.py如果项目支持指定配置文件可以写成python main.py --config config.json运行过程中终端会输出进度信息例如“正在解析第 X 页”“共获取 Y 条说说”。看到这样的日志说明脚本正常工作。5.5 验证输出结果运行结束后进入配置的输出目录cd backup_output ls -la预期能看到moments.json或类似的数据文件moments.md或index.html阅读页面图片目录。打开index.html检查说说内容、日志页面、相册缩略图是否完整。建议随机抽几条较老的记录确认时间排序是否正常避免某一段数据缺失。6. 常见问题与排查思路使用这类开源工具最容易遇到的问题集中在下载、依赖、登录态和数据完整性这几个方面下面整理成一份排查表问题现象常见原因解决思路git clone超时或卡住网络环境不稳定改为下载 ZIP或使用国内镜像站同步仓库pip install安装依赖失败Python 版本不匹配、缺少编译环境查看requirements.txt指定的依赖版本升级或降低 Python 版本运行时报“Cookie 无效”Cookie 过期或复制时缺少部分字段重新登录 QQ 空间重新抓取完整 Cookie接口返回-3000或验证码请求频率过高、登录环境异常降低请求频率等待一段时间再试检查是否触发安全验证导出数据为空指定了没有权限的 QQ 号或接口参数已变化确认归档对象是当前账号有权访问的空间检查接口参数图片下载后无法打开防盗链或链接过期修改请求头中的 Referer重新下载运行卡在某一页单条数据异常导致解析报错查看报错堆栈定位到具体数据后跳过或修复解析逻辑其中最常见的其实是“Cookie 失效”。QQ 空间登录态可能因为退出登录、修改密码、异地登录等原因失效。只要重新登录并更新 Cookie问题一般都能解决。7. 安全与合规使用此类工具的红线7.1 只处理自己有权访问的数据无论项目名称里有没有“恢复”两个字数据归档都应该限制在本人账号或本人有权管理的空间范围内。未经授权抓取他人空间内容不仅违反平台规则也可能涉及侵犯个人信息权益。7.2 不要让 Cookie 和导出内容离开本地抓包得到的 Cookie 具备很强的“身份属性”。建议做到以下三点不要在任何聊天工具中发送完整 Cookie不要在公共电脑保存config.json不要将导出的 JSON 文件二次上传到不可控的网盘。如果你使用 GitHub 同步代码务必通过.gitignore排除配置文件和数据输出目录。否则一次误提交就是一次个人信息泄露事件。7.3 运行前先读源码线上热门项目的仓库首页通常会有人提交类似“分享我的备份脚本”的系统性问题。糟糕的第三方脚本可能内置后门在背后悄悄请求攻击者的服务器。因此pip install之后建议先快速浏览一下main.py、client.py等入口文件确认代码里没有可疑的外发请求。7.4 遵守平台规则自动脚本本质上绕过了普通用户的点击流程。使用时应保持低频、仅用于个人备份目的不要批量监控、抓取、滥用平台接口。如果平台明确禁止某种行为应当主动停止相关操作。8. 从使用者到贡献者正确参与开源项目8.1 学会阅读 README很多用户拿到开源项目后直接运行报错后又不知道怎么办。正确的第一步永远是读 README。要看的内容包括项目适用于什么场景不适用于什么场景支持的数据类型和导出格式环境要求与安装命令是否包含安全提示和免责说明。如果 README 以英文为主不要跳过。至少浏览标题、安装步骤和参数说明能避免大量无效踩坑。8.2 逛逛 Issues 和 Pull RequestsGitHub 仓库的Issues板块记录着用户的反馈和问题很多你已经遇到的坑别人可能早就提过。搜索关键词如 “cookie”“empty”“parse error”就能找到解决方案或者确认这是不是已知 Bug。Pull Requests板块则能看到社区提交的改进。你可以从中了解项目接下来的演进方向也可以尝试参与代码评审。8.3 如何贡献代码如果你想为qzonearchive增加一种导出格式或者修复某个接口参数错误标准流程是Fork 原仓库Clone 自己 Fork 后的仓库新建功能分支修改代码并补充注释推送分支在原仓库发起 Pull Request。提交代码时注意保持与项目现有代码风格一致并尽量补充说明文档。很多开发者会忽略文档但好的 PR 往往不只包含代码还包含使用示例和变更说明。8.4 关注开源许可证开源不等于“随便用”。运行项目前看一眼仓库根目录的LICENSE文件MIT、Apache-2.0基本可以自由使用、修改、再分发GPL修改后如果分发也需要以同样许可证开源没有许可证默认保留所有权利只能查看不宜复制修改后公开发布。qzonearchive的具体许可证信息同样需要以仓库为准这是参与开源项目必须养成的习惯。9. 总结开源归档工具的真正价值QQ 空间恢复助手类开源项目本质上是把“用户对自己内容的访问权”通过脚本高效利用起来。它不能逆天改命不能突破平台和数据边界但对于很多有备份需求的用户来说一台电脑、一个 Python 环境、一份自己的登录授权就能把十几年的空间内容整理成一份本地数字档案这本身就是非常实用的能力。从学习角度来看这类项目包含的 Cookie 管理、接口分页、JSON 解析、文件导出、异常重试都是日常开发高频使用的基础技能。看懂它不只是会用一款工具更是掌握了一套处理“需要登录态的网页数据”的通用方法论。最后给你几个可以立刻上手的建议如果你只是普通用户先下载 Release 或 ZIP跑通默认配置导出一次自己的空间内容如果导出过程中报错优先看 Issues再看接口字段是否变化如果顺利导出可以考虑把项目 Fork 一份研究它的代码结构尝试增加新的导出格式无论什么时候都不要把 Cookie 和带隐私的数据卷入公开仓库。希望这篇教程能帮你把空间里的回忆稳稳留在本地。