nineoooo/dsh-qzone-echo:把 QQ 空间说说收进本地库

前言

智能体开发者在用 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说说收集”入口。

同步与分类

  1. 设置 → 左侧导航“QQ说说收集”。
  2. 在浏览器登录 https://user.qzone.qq.com,按 F12 打开 Network 面板,点一条说说列表请求,复制请求头里整段 Cookie(必须包含 uin=o0xxxx 和 p_skey),粘贴到设置页存下。
  3. 点“全量同步”,翻页拉全部说说(首次按 maxPerSync 封顶)。
  4. 每条按规则打分(lib/classify.mjs),≥ 默认分数线(45)进入“思考”栏;带“梦见 / 梦到 / 做梦 / 梦里…”等关键词的进入“梦记”栏;开头为“今日绘本NN / 书评 / 荐书 / 安利…”或正文含《…》并带“图:/文:/译:/作者:”这类出版信息行的,进入“介绍·推荐”栏(不算思考,但不会丢)。
  5. 四栏可分别翻页、分别导出;改分数线会即时重算。

人工纠正

规则可能误判,三栏都能逐条手改:

  • 思考:切换到“算思考 / 不算思考”。
  • 梦记:被认成梦但其实是随手记的,切换到“不是梦”。
  • 介绍·推荐:其实是在说自己的感受,切换到“不是推荐”。

⚠️ 要点两下才生效:第一次点只是“上膛”(按钮变黄“再点一下确认”),再点一次才写入 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜