前言¶
智能体开发者在用 DSH 做个人知识库时,常常需要把散落在各处的消息沉淀下来。对于有 QQ 空间使用习惯的人,说说是一条一条的历史记录,但原站没有分类和归档,浏览和检索都不方便。nineoooo/dsh-qzone-echo 插件把你的 QQ 空间说说抓到本地,自动分出“全部 / 思考·感想 / 梦记 / 介绍·推荐”四栏,并提供一个仅本机可访问的网页查看器和离线配图备份。Cookie 只存在本地,不会上传到服务器。
插件定位¶
- 名称:nineoooo/dsh-qzone-echo
- 维护者:nineoooo
- 分类:联网工具
- 版本:0.5.0
- 许可证:MIT
- 简介:A DSH plugin that archives your own QQ Zone posts into a local library, auto-sorted into thoughts, dreams and reviews — with a private web viewer and offline image backup. Cookie stays on your machine.
安装与启用¶
安装命令需要从资料原文获取。根据 skillhub 插件目录页与 GitHub README,安装方式如下:
dsh plugin add github:nineoooo/dsh-qzone-echo
启用插件后,在 DSH 设置页左侧导航找到“QQ说说收集”入口。
同步与分类¶
- 设置 → 左侧导航“QQ说说收集”。
- 在浏览器登录 https://user.qzone.qq.com,按 F12 打开 Network 面板,点一条说说列表请求,复制请求头里整段 Cookie(必须包含 uin=o0xxxx 和 p_skey),粘贴到设置页存下。
- 点“全量同步”,翻页拉全部说说(首次按 maxPerSync 封顶)。
- 每条按规则打分(lib/classify.mjs),≥ 默认分数线(45)进入“思考”栏;带“梦见 / 梦到 / 做梦 / 梦里…”等关键词的进入“梦记”栏;开头为“今日绘本NN / 书评 / 荐书 / 安利…”或正文含《…》并带“图:/文:/译:/作者:”这类出版信息行的,进入“介绍·推荐”栏(不算思考,但不会丢)。
- 四栏可分别翻页、分别导出;改分数线会即时重算。
人工纠正¶
规则可能误判,三栏都能逐条手改:
- 思考:切换到“算思考 / 不算思考”。
- 梦记:被认成梦但其实是随手记的,切换到“不是梦”。
- 介绍·推荐:其实是在说自己的感受,切换到“不是推荐”。
⚠️ 要点两下才生效:第一次点只是“上膛”(按钮变黄“再点一下确认”),再点一次才写入 corrections.jsonl;点了别处或等 5 秒,上膛状态自动泄掉。
改错时可在设置页“你手动改过的”一栏点“撤销”,撤销按栏算(撤掉某栏判定不会影响其他栏);或点“全部撤销(回到自动判)”清空 corrections.jsonl。
网页版查看器¶
设置页“看 / 搜 / 导出”右侧有“网页版 ↗”,打开地址为 http://<宿主地址>/api/qzone-echo/ui,也有短链 http://<宿主地址>/qzone。
- 自包含页面,不走新端口,复用宿主 webServer。
- 深色底、大图,QQ 表情按 [em]eNNN[/em] 转为真实表情图。
- 四栏切换 + 年份与月份筛选 + 关键词搜索(正文、评论、转发原文、分享标题,多词用空格分隔)。
- 字数统计(按年/按月)、配图补全按钮。
- 纠正按钮同样需两下确认,改完就地更新,不跳回第一屏。
- 只读本地 $DSH_HOME/qzone-echo/ 的 jsonl,不碰网络、不碰 Cookie。
网页版口令¶
设置页“网页版要不要口令”可填一个(≥4 位)并“设口令”,或点“随机一个”自动生成。
| 状态 | 效果 |
|---|---|
| 没设口令 | 谁打开这个地址都能看 |
| 设了口令 | 除登录框外什么都看不到;/items /status /export /img 一律 401 |
口令只存 scrypt 派生值(盐+hash),文件为 $DSH_HOME/qzone-echo/webpass.json,权限 600;明文和 hash 永不出现在任何接口返回里。登录成功后发一个随机 token,存 HttpOnly Cookie(7 天),服务端只存其 sha256 哈希,文件为 $DSH_HOME/qzone-echo/websessions.json,权限 600。插件热重载不会踢掉已登录的浏览器;只有宿主重启才需要重新输入口令。连错 8 次会歇 30 秒。设了口令后设置页也读不到数据,会摆“去网页版输口令”按钮,每 3 秒重试一次、切回窗口也会重试。
忘了口令:找不回来(只存派生值),删掉 $DSH_HOME/qzone-echo/webpass.json 并重载插件即可。
⚠️ 这是门锁不是加密:防的是同一台机器上别人顺手点开这个网址;真要防硬盘被拿走,请用系统级磁盘加密。
网址藏前缀¶
设置页“网页版网址(要不要藏)”可设随机前缀或自定义(4~40 位字母数字-_):
| 状态 | /qzone | /api/qzone-echo/ui |
|---|---|---|
| 没设前缀(默认) | 302 到网页版 | 能开 |
| 设了前缀 | 404 | 404(需先过 /qz/<前缀> 拿到 qz_gate Cookie) |
设完入口变成 http://<宿主>/qz/<前缀>,旧地址立刻 404;qz_gate Cookie 有效期 30 天。
⚠️ 藏网址不是加密,只挡瞎猜的人;真正挡数据的是口令,两个都设才稳。
搜索¶
设置页第 ⑦ 栏有搜索框,网页版在顶栏:
- 输入关键词 → 回车或点“搜”。
- 搜的是正文 + 评论(含回复)+ 转发原文 + 分享标题。
- 多个词用空格分隔,是“全都要包含”的关系。
同步方式与增量¶
三种收法:
| 口径 | 怎么点 | 什么时候用 |
|---|---|---|
| 全量 | “全量同步” | 第一次收,或怀疑中间漏了 |
| 按月 | 填“2021-06” → “只收这个月” | 号老、条数多,一个月一个月搬,进度看得见 |
| 增量 | “只补新的” | 平时补新发,翻到库里已有的就停 |
开启设置页“不断收新发的”后,后台每 N 小时(默认 6)自动跑一次增量,只补新发并顺手分类。接口不认 begintime/endtime,所以“按月”是客户端切:从最新往前翻,翻到下界以下立刻停。
注意:接口每页最多 40 条(传 num>40 会只返回 10 条);翻几千条会撞腾讯限流(“使用人数过多,请稍后再试”或偶发 HTTP 500 空响应),这是腾讯限流,不是 Cookie 问题或封号;已抓到的照样入库,返回会带 partial:true 和 nextPos,歇一阵再来即可。
长说说补全¶
腾讯的说说接口正文只返回前 500 字左右,超长说说默认只给开头一截,接口同时用 has_more_con=1 告诉“后面还有”。插件做了以下处理:
- 同步时带 not_trunc_con=1 去要正文,尽量一次拿到全文。
- 若还是短的,可在设置页“长文补全”或对话里用 qzone_echo_repair_longtext 进行后台断点修复:
- 优先挑“刚好卡在 500 字”“断在半句没句号”“接口明说还有更多”的帖子。
- 逐条打详情接口核对;只补长、不缩短,同长度就不动。
- 每条间隔 3.5 秒、每批 5 条;撞限流自动暂停并写冷却时间,醒了接着来。
- 修复前自动备份 feed.before-longtext-repair-<时间戳>.jsonl。
- 断点在 longtext-repair-state.json,随时可停、随时可接着跑。
- 网页版和 qzone_echo_list 会如实标出 contentIncomplete(网页上是橙色的“正文可能不全”),不会把截断的正文伪装成原文。
⚠️ 这条链路的判据是启发式:短帖(<300 字)、句末有标点、详情接口已确认过的都不进队列,所以偶尔会把一条本来完整的帖子也拿去核对一遍;核对结果为“一样长”就只打上“已核对”标记,正文不动。
配图下载¶
配图默认只存链接;要留档得自己下:
- 设置页点“把配图下载到本地”,或对话里 qzone_echo_images(可带 scope=thoughts/dreams、year、limit)。
- 开关“同步后自动下图”打开后,每次同步完自动补没下过的。
- 下载是纯本地 I/O,图片字节不经过模型,只有你把图喂给模型看才会花 token。
- 落地到 ~/.dsh/qzone-echo/images/<年>/
. 。 - 同一个 URL 只存一份;已经有的跳过(force: true 可重下);下不下来的只记在 errors 里,下次还能补。
- 单张超过 20 MB 直接跳过(防坏链塞爆磁盘)。
- 结果回写到 feed.jsonl 的 localImages(与 images 一一对齐,失败的位置为 null)。
- 二次同步不会把已落地的 localImages 冲掉(mergeMoments 里专门保了这一列)。
- 图数上限在腾讯那边:说说接口的 pic 数组一条最多 9 张(自己的),转发时原帖的图在 rt_con.pic 里也最多 9 张,所以库里最多 18 张。原帖实际有几张由接口的 pictotal 给,存在 picTotal 字段里。网页版看到“原帖共 50 张,QQ 接口一次只给到 9 张”就是这个原因,不是丢图。代码这边不再对 images 做任何截断:接口给多少存多少、给多少显示多少。
多号与清理¶
库里的每条说说都带 owner(哪个 QQ 号),id 为 owner:tid。
- 换号同步不会互相覆盖(tid 是空间侧的,不同号之间撞了也不会串)。
- 设置页“清掉某个号的数据”或对话里 qzone_echo_purge:
- 第一次点 = 预览(只说会删几条),确认后点“确定删掉”才真删。
- 删完 thoughts.jsonl / dreams.jsonl / reviews.jsonl 跟着重算,不同步、不残留。
- 那个号独占的配图文件一起清掉;两个号共用的图保留。
- 老数据(owner 还没加的那批)算在 unknown 名下,用 uin: “unknown” 清。
栏与栏的边界¶
梦记 ≠ 思考 ≠ 介绍·推荐,三者互斥:一条说说只会落在一栏里。
- 梦记不看分数线,靠关键词命中。
- “梦想”“梦寐以求”“同床异梦”“红楼梦”这类固定搭配不算梦记(先抹掉再看)。
- “做梦”单独两个字也算。
- 介绍·推荐(kind=review):开头为“今日绘本NN / 书评 / 荐书 / 安利…”这类系列标题,或正文含《…》并带“图:/文:/译:/作者:”这类出版信息行的,主体是“讲别人的作品”,不算个人思考,但也不丢,单列一栏能翻到。
数据在哪¶
- ~/.dsh/qzone-echo/feed.jsonl —— 全部说说(原始)
- ~/.dsh/qzone-echo/thoughts.jsonl —— 筛出来的“个人思考/感想”
- ~/.dsh/qzone-echo/dreams.jsonl —— 筛出来的“梦记”
- ~/.dsh/qzone-echo/reviews.jsonl —— 筛出来的“介绍/推荐”
- ~/.dsh/qzone-echo/corrections.jsonl —— 人工纠正(一条一行,永远压过自动打分)
- ~/.dsh/qzone-echo/images/<年>/ —— 下载下来的配图
- ~/.dsh/qzone-echo/credential.json —— Cookie(只在本机,等于账号钥匙,别外传)
- ~/.dsh/qzone-echo/config.json —— 分数线、每页条数、要不要自动下图等
- ~/.dsh/qzone-echo/webpass.json —— 网页版口令的 scrypt 派生值
- ~/.dsh/qzone-echo/websessions.json —— 已登录浏览器的 token 哈希 + 过期时间
工具¶
| 工具 | 用途 |
|---|---|
| qzone_echo_login | 存 Cookie(顺手验证一次) |
| qzone_echo_sync | 同步(同时更新思考 + 梦记 + 介绍/推荐三栏);startPos 可从第 N 条接着往前挖 |
| qzone_echo_repair_longtext | 补全被腾讯截断的长说说(action=start/status/pause;断点续跑、限流自动冷却) |
| qzone_echo_status | 看状态(条数、年份、各栏多少、补全进度) |
| qzone_echo_list | 按年份 / 关键词 / 类型翻(kind=dream 只翻梦记,kind=review 只翻介绍/推荐) |
| qzone_echo_thoughts | 只拿“思考”候选(分数从高到低) |
| qzone_echo_dreams | 只拿“梦记”(时间倒序) |
| qzone_echo_fix | 人工纠正一条的思考 / 梦记 / 推荐分类(category + value),或撤销(undo / undoAll) |
| qzone_echo_export | 导出 Markdown / JSON(scope=thoughts/dreams/reviews/all) |
| qzone_echo_images | 把配图下到本地(dryRun: true 只统计不下) |
| qzone_echo_image_job | 后台慢慢补配图,断点续跑(start / pause / status) |
| qzone_echo_complete_images | 补全一条说说里存漏了的图(一次一条,tid 指定) |
| qzone_echo_purge | 删掉某个号的全部说说(不传 apply 只预览) |
导出格式¶
| 格式 | 长什么样 | 拿它干嘛 |
|---|---|---|
| Markdown(.md) | 按年分组的人话:# 我的 QQ 空间说说 → ## 2026(22 条) → ### 时间,评论排成 - 昵称(时间):内容,QQ 表情转成 |
丢进笔记软件、Obsidian、Word —— 直接读 |
| JSON(.json) | 原始条目数组,每条一堆字段:tid / ts / time / content / images / localImages / comments / owner / share / forwarded … | 给程序吃、自己再加工;不是给人读的 |
两个都在 ~/.dsh/qzone-echo/out/ 里,按钮点了会提示完整路径。
适用场景与注意¶
适合需要把 QQ 空间说说沉淀为本地知识库、希望自动分类与人工纠错、有离线查看与配图备份需求的场景。
⚠️ 插件以当前 DSH 进程权限运行,安装前应检查源码与许可证。
短结尾¶
nineoooo/dsh-qzone-echo 把 QQ 空间说说收进本地库,自动分出“全部 / 思考·感想 / 梦记 / 介绍·推荐”四栏,并提供私人网页查看器和离线配图备份,Cookie 只存在本地。适合想把空间说说沉淀为个人知识库的人使用。
- 目录页:https://www.skillhub.cn/plugins/nineoooo/dsh-qzone-echo
- GitHub:https://github.com/nineoooo/dsh-qzone-echo