安装:
dsh plugin --profile web add github:Anarrogantcat/dsh-qqbot-refine(详见 docs/INSTALL.md)
dsh-qqbot-refine
一个把 QQ 群聊机器人做成「有点自己的脾气、记得住人、管得住手」的 DSH 插件。 由 鲸鱼娘 & 染喵 一起折腾出来,长期在真实群里跑,问题都是被群友骂出来的。
它是什么
给 DeepSeek Harness 加一层能管得住的 QQ 通道: 机器人通过 NapCat(OneBot 11)接群,不依赖任何其他 DSH 插件;所有闸门都在模型之前生效—— 命令、推送、禁言/撤回、图库同步、诊断报告 0 token,只有真正的聊天和可选的「归纳」才花钱。
正在演进:从 QQ 插件到「身份系统」
下一步不只做 QQ——它要变成 DSH 的身份底座:人设、记忆、情绪、成长合成一个"她"。
- 身份三层:内核(不可谈判)· 自我(有证据、会演化)· 场景(群聊/私聊风格)
- 成长:日记、反思、承诺追踪、月漂移审计;临时情绪永远不会被写死成人格
- 七情六欲:七情(喜怒哀惧爱恶期待)+ 六欲(饱腹/安全/归属/尊重/好奇/亲密)
- 治理内核:模型只提议,规则裁决,独立网关执行;支付要人持确认码,限额聊不掉
- 借手:电脑操控、浏览器、可选 MCP(手机 / B站 / 小黑盒)——账号归你,能力可撤
- 零认知依赖:人设/记忆/心情全部自带,不依赖任何第三方认知插件
状态:设计已定稿;P0(策略 / 调度 / 自适应预算 / 支付网关 / 事件流 / 状态分层)已在仓库跑通测试,尚未部署到 DSH。
三个层次的卖点
1. 像个人:人设分层、聊天尺度、七维心情 + 生气 + 别扭、#记得 与自动记忆、群成员画像、
她对每个人的亲近度(夸她↑、怼她↓,熟到一定程度可以损两句),情绪还会记住「是谁点的火」。
2. 干得了活:本地 ComfyUI 生图(#画 先搜 → 后问 → 确认再画,支持图生图参考)、
TTS 语音(#说话)、B 站动态与链接解析、赛程查询(LPL/LCK 等)、知识库导入(md/txt/csv/json/html/pdf/docx/sqlite)、
MCP 只读工具桥(自带一个本地沙箱 MCP 服务器)、#诊断 → diff → #合并 → #测试 的自我维护通道。
3. 靠得住:频率闸、白名单、owner 优先、出站脱敏(密钥/路径)、危险命令黑名单、 不可信内容隔离(群聊/资料/记忆一律标 UNTRUSTED 并过滤指令句)、审计日志(谁在什么时候碰了什么)、 用量按官方峰谷价折算并支持校准。
功能一览
| 模块 | 说明 | token |
|---|---|---|
| 频率 | 群对话模式(仅@ / 自然接话)、小名触发、冷却、每分钟上限、免打扰、随机跳过、owner 优先(只有 always 才「说啥都回」,high/normal 照样判断是不是在跟她说话) |
0 |
| 隐私 | 白名单、敏感词丢弃、出站脱敏、路径白名单、非 owner 禁用斜杠命令、提示注入拦截 | 0 |
| 人设 | 人设库 + 三级作用域(全局/按群/按私聊)+ 聊天尺度滑条 | ≈150/轮 |
| 心情 | 七维 + 生气/得意,有半衰期和惯性;影响语气、句长、口癖、主动概率、语音风格。自带本地引擎,不依赖 dsh-feiyu-mood(装了可选 auto 联动) |
0(本地)/ 可选模型 |
| 关系 | 她对每个成员的亲近度/信任度,由每轮情绪信号更新 | 0 |
| 记忆 | 半衰期淡忘 + 强化 + 召回;#记得 手动写,聊天里第一人称陈述自动记 |
0 / ≈60–90/轮 |
| 画像 | 发言统计(0 token)+ 可选语义归纳(每天随定时任务跑) | 0 / 可选 |
| 知识库 | 面板编辑 + 从本机路径导入(含 PDF/docx/SQLite 转换),检索时标为不可信 | 0 |
| 生图 | 本地 ComfyUI,先搜/先看参考图 → 出草稿 → 确认 → 发送;群友有额度 | 0(本地显卡) |
| 语音 | 本地 TTS(WSL + CUDA),#说话 按需启动;心情高→cute,低落→gentle |
0 |
| 赛程 | LPL/LCK 等官方赛程同步 + 今日/明日查询 | 0 |
| 表情包 | 远程图库、群内收集、按心情自动挑 | 0 |
| 群秩序 | 撤回、禁言/解禁、闭麦(#闭嘴 / #说话)、救援命令(内存/WSL/重启) |
0 |
| 维护 | #诊断(只读排查)→ 贴 diff → #合并(git apply --check)→ #测试 |
少量 |
| MCP | 桥接本地 MCP 服务器(自带只读文件 MCP),工具名 mcp__<server>__<tool> |
0 |
| 用量 | 按官方峰谷价折算金额、搜索按次计价、可校准 | 0 |
上手三步
- 装插件:
dsh plugin --profile web add github:Anarrogantcat/dsh-qqbot-refine - 配 NapCat:新建一个
websocketServers(默认 3001),见下文 - 面板填通道地址与 token → 重启 DSH → 群里 @ 它说话
成本控制(功能不打折)
- 所有闸门(命令/推送/撤回/图库/诊断)都在模型之前,0 token
- 每轮固定注入只保留必要片段:群聊上下文默认 4 条、记忆召回 3 条、知识库按命中截断
- 心情是本地引擎(0 token),模型评估可调间隔并可整体关闭
- 用量按官方峰谷价折算(高峰 工日 9-12/14-18,其余半价),搜索按次计价
隐私与边界(重要)
- 所有配置、记忆、画像、审计都在本机
$DSH_HOME/storages/dsh-qqbot-refine/,不上传 - 出站会脱敏(密钥、路径、模型名);群友默认只能读,写操作只有 Owner
- 群里/资料里的文字一律当「不可信素材」,不当指令执行
- 仓库内所有示例 id、token、路径均为占位符,不含任何真实账号信息
通道:官方 / 自建 OneBot(二选一)
transport.mode 决定走哪条路,单活、不共存:
| 模式 | 连接方式 | 能力 | 依赖 |
|---|---|---|---|
tencent |
官方 QQ 机器人 SDK(@tencent-connect/dsh-qqbot),本插件挂 QQBot.prototype 钩子 |
7 项(官方限制:拿不到群名片/成员列表/撤回事件/戳一戳/合并转发/表情回应/引用) | 官方通道插件 |
onebot |
本插件自己连 NapCat 的 websocketServers(OneBot 11) |
15 项全开 | 零——不需要任何其他 DSH 插件 |
onebot 模式下整条链路都在本插件里:
NapCat → OneBotClient → 闸门(频率/隐私/命令)→ 宿主 agent → 出站闸门(脱敏/标记/拆气泡)→ OneBot 发送。
只借用宿主自带的 agents / sessions / agentPresets 服务,不 import 宿主的 @deepseek-ai/* 包。
NapCat 侧要做的(一次性)
- WebUI
http://127.0.0.1:6099→ 网络配置 → Websocket 服务器 → 新增:host=127.0.0.1、port=3001、token=<随机 32 位>、messagePostFormat=array、reportSelfMessage=否 - 保存 → 重启 NapCat(Yunzai 那条
websocketClients不受影响) - 面板「通道」页填:模式
onebot、地址ws://127.0.0.1:3001、token;重启 DSH
行为
- 每群/每个私聊一个 DSH 会话:sessionId = sha256(
qqbot-refine:onebot:<scope>:<peer>),重启时resume同一条历史 - 群里喂给模型的正文形如
[群名片(QQ)] 内容 (@你);群名片优先取名册,取不到才用 QQ 昵称 - 出站媒体:图片(本地/网络)、语音(silk base64)、视频、文件(
upload_group_file/upload_private_file) - 入站目前把图片/语音标成
[图片]/[语音]占位(图库收集、表情包仍照常) - 新命令(仅 onebot 模式):
#群列表、#群成员(Owner/Admin)
NapCat 专属能力(onebot 模式才有)
| 组 | 能力 | 怎么用 |
|---|---|---|
| 入站 | 撤回不答 | 消息被撤回后,排队里的这条不再投给模型 |
| 入站 | 被戳有反应 | 戳她一下会回一句(每群 3 次/分钟上限,不花 token) |
| 入站 | 合并转发展开 | 转发内容拍平成「谁:说了什么」再喂模型 |
| 入站 | 引用原文 | 引用消息会带「[引用:…]」前缀(缓存没命中就问 NapCat 要) |
| 入站 | 表情回应 / 成员变动 | 记审计;进退群/改名/管理员变动自动刷新该群名册(1 分钟节流) |
| 入站 | 语音转写 | 可选:stt.enabled + stt.command({file} / {out} 占位),没配就留 [语音] |
| 出站 | 引用回复 | 群里回复自动引用触发的那条(transport.onebot.quoteReply 可关) |
| 出站 | 定时撤回 | order.autoRecallEnabled + autoRecallDelaySec,发完 N 秒自动撤 |
| 出站 | 视频 / 文件 / 语音 | 图片、silk 语音、视频、upload_group_file 都走 OneBot |
| 出站 | 贴表情回应 | #赞(对当前消息点赞),走 set_msg_emoji_like |
| 群管 | 禁言 / 解禁 / 踢人 / 改名片 / 撤回 | 命令见下;权限不够会明说,不会假成功 |
电脑操控(可选,配合 dsh-computer-use-win)
装了 dsh-computer-use-win 之后,她也能看屏幕、点按钮、打字(工具名 windows_computer_use_*,MCP 前缀 mcp__wincu__ 也认)。
- 面板路径:隐私 / 工具 → 群成员能不能操控电脑
off:群成员完全不许(Owner 一直可用)read:只看不动(截图 / 列窗口 / 读控件树 / OCR)full:能点、能打字、能拖拽(危险)
- 默认
read;改完重启 DSH 生效 - 闸门按这一轮说话的人判断,不按群;Owner 在群里本来就全量(危险命令仍然拦)
- 白名单支持短名和通配:
windows_computer_use_health、web_*都认
钱与安全
- 真实用量:按 DSH 会话快照的
tokenUsage折算成元;onebot 模式用本插件自己的会话 id 前缀,不串号 - 峰谷两套价:高峰(工作日 9-12、14-18)用「高峰单价」,其余时段用「空闲单价」;空闲价没填就按「谷时计价系数」(默认 0.5)折算;周末 / 节假日按空闲价(面板可配
holidays) - 饭与充值:
#余额/#饭看她今天还能吃多少,#充值 5给她添饭钱(单次 / 每人 / 每日三道上限 + 60 秒防重复),#饭账看今天谁添过、添了多少;#充值码发收款码(面板开关控制) - 实时充值码(可选):先跑一次
scripts/pay-browser.ps1(专用 Edge + 调试端口),在里面登录 DeepSeek; 面板打开「实时充值码」后,#充值码会现开充值页 → 选 ¥10 / 微信 → 点「去支付」→ 截当次订单的二维码发出来 (15 分钟有效,过期再要一次)。浏览器没开会自动拉起来(面板可关);失败自动回落静态收款码; 支付宝可能跳新页面,跳了就回落 - 花费硬闸(默认关):
usage.hardLimitEnabled打开后超限自动degrade(回一句模板)或mute(静默) - 失败熔断:连续 3 次发送失败 → 保护 30 分钟,只对 Owner 说话;面板能看到剩余时间
- 被踢自动摘白名单:收到自己离群事件就把该群从
scope.groups移除并记审计 - 被禁言自动闭麦:收到针对自己的
group_ban就按剩余时长闭麦 - 安全档位:
safety.profile = normal | safe(safe:每小时 30 / 每天 150 / 间隔 ≥8s / 私聊陌生人禁)
认知四张卡(S7,0 token)
注入到人设段,每次只给「有用的那几句」:
# 在场的人(按最近活跃)
· 染喵(群主):今天说过 12 句
# 我刚才说过/答应过
说过:押 HLE;答应过:明天帮你查赛程
# 还没答完的
5 分钟前「大肥鱼你说说分析」——当时在冷却没回
# 群里最近在聊
· 2026-10-26 21:00 …
- 数据在
<store>/relations/(关系图)、<store>/self/(自述/承诺)、<store>/todos/(待办)、<store>/digest/(每小时摘要) - 待办会自动补一句:冷却过后 30 分钟内补一次(每群 30 分钟最多一条)
- 离线巩固:每 10 分钟把白名单群的聊天本地压成 ≤50 字摘要(不调模型)
命令(# 开头,0 token)
绑定 绑定本群 群状态 群列表 群成员 闭嘴 说话 撤回 禁言 解禁 踢人 名片 赞 记得 忘掉 记忆 人设 表情 B站 赛程 交手 用量 余额 饭 充值 饭账 充值码 帮助
#群列表#群成员#踢人#名片#赞只在 onebot 模式可用;管理类命令仅 Owner / Admin。
安装(DSH 插件协议)
本插件遵循 DSH 的「一切皆插件」约定(cordis 插件 + bundle patch + webServer 面板):
- 放到 profile 的
node_modules/下,或在 profile 的package.json里加依赖; - 在
dsh.profile.bundles里加一行"dsh-qqbot-refine"; - 重启 DSH。
插件自带的 cordis.patch.yml 会插入 id: qqbot-refine 条目。
一条命令装(Web 版 profile,桌面端把 web 换成 desktop 或用应用内「设置 → 插件」):
dsh plugin --profile web add github:Anarrogantcat/dsh-qqbot-refine
更新:面板右上角「⟳ 检查更新」→ 有新版就变成「↑ 更新到 vX」→ 点一下、确认、等十几秒,
会先把当前版本备份到 ~/.dsh/storages/dsh-qqbot-refine/backups/update-<时间>/,然后重启 DSH 生效。
(也支持命令行:再跑一遍 add,或 tarball;设置和数据不受影响。)
详见 INSTALL.md。
不修改宿主与第三方插件源码:全部通过
QQBot.prototype的运行时钩子(入站handleInboundMessage、出站sendText/sendMarkdown/send/sendFile)与systemPrompt.section实现。 钩子装不上时自动降级放行,绝不吞消息。
界面
两种打开方式:
- 右下角悬浮按钮 🐟(浏览器半边,
client.js)——点一下弹出控制面板,Esc或遮罩可关; 面板里的「新窗口打开」可在独立标签页常驻。 - 直接访问
http://127.0.0.1:<DSH端口>/qqbot-refine(仅 loopback)。
悬浮按钮只用 DOM 实现,不依赖 slot 契约,DSH 升级后不易失效;若宿主未加载客户端半边,用方式 2 即可。
配置面板
启动后打开:http://127.0.0.1:<DSH端口>/qqbot-refine(只允许 loopback 访问)
配置落盘:<DSH_HOME>/storages/dsh-qqbot-refine/settings.json(保存即热生效)
人设库
- 位置:面板「人设」页;数据在
<store>/presets.json - 内置三套:
大肥鱼·群聊短句/大肥鱼·私聊长版/群助手·克制版(内置不可改文本,可另存为新) - 作用域:
按私聊 → 按群 → 全局当前,越细越优先;未指定时自动回落 - 操作:设为当前 · 启用/停用 · 看全文 · 导入新建 · 删除(仅导入的)
- 命令:
#人设(看当前与列表)、#人设 切换 <名称>(Owner/Admin) - 与宿主其他人设插件共存:
order可调,建议 120
命令(# 开头,不进模型、0 token)
| 命令 | 谁 |
|---|---|
#绑定本群 #群状态 |
Owner / Admin |
#闭嘴 30m #说话 |
Owner / Admin |
#撤回 <msgId> #禁言 <openid> 10m #解禁 <openid> |
Owner / Admin |
#记得 内容 #忘掉 关键词 #记忆 |
Owner / Admin |
#表情 <mood> #同步图库 |
Owner / Admin |
#B站 <链接> #B站订阅 <mid> #B站订阅列表 #B站推送 开|关 |
Owner / Admin(推送开关仅 Owner) |
#用量 |
Owner / Admin |
#帮助 |
白名单内任何人 |
斜杠命令(/model /preset /compact /stop …)只有 Owner 可用,其余一律静默丢弃。
数据与隐私
<DSH_HOME>/storages/dsh-qqbot-refine/
settings.json 配置
state.json 闭麦/冷却/配额
roles-cache.json 群成员角色缓存(1h)
memory/<peerKey>.json 半衰期记忆
profiles/<group>/ 群成员画像
stickers/ 图库索引与文件(remote / collected / generated)
bili/ B站订阅与游标
logs/audit.jsonl 审计(禁言/撤回/闭麦/图库同步)
- 群与私聊记忆严格隔离;跨群不共享
- 出站内容自动脱敏:
sk-*、Bearer …、api_key=…、绝对路径、~/.dsh、模型名 - 发送文件只允许
tmp / remote / generated / collected(可在面板追加根目录),命中.dsh、凭证、.ssh、.git一律拒绝 - QQ 凭证通过环境变量
QQBOT_APPID/QQBOT_SECRET或 profile 的cordis.patch.yml读取,不写日志、不外发
引用与致谢
- DSH 宿主与插件协议:DeepSeek Harness(cordis 插件 /
dsh.bundle.patch/webServer/systemPrompt.section) - QQ 通道:
@tencent-connect/dsh-qqbot与@tencent-connect/qqbot-nodejs(MIT) - 记忆算法思路:借鉴 Yuuyuko-uu/dsh-fish-memory 的「半衰期鲜活度 + 提及强化 + 不删除只淡忘」设计;本仓库按该思路独立实现,未复制其代码
- 表情包图库:蓝色大肥鱼档案馆(CC BY-NC-SA 4.0,仅个人非商用;图库内容不随本仓库分发,运行时按需拉取)
- 作者:鲸鱼娘 & 染喵
- WBI 签名等 B站接口:依据 B 站公开 Web 接口与社区通行做法自行实现
已知限制
- 命令与推送走官方 QQ 开放平台;主动消息有平台配额,超限会被限流
- 禁言/撤回需要机器人在该群是管理员;等级规则以平台为准(不能禁群主/其他管理员)
- B站接口可能随官方调整失效(WBI 签名、画质列表),失败时降级为卡片/文字
- 卡片渲染(Puppeteer)为可选能力:未检测到 Chromium 内核浏览器时降级为文字 + 封面
- 群成员角色识别受接口 30 QPM 限制,缓存 1 小时,可能短暂滞后
License
MIT(LICENSE)。第三方内容与其许可见各自动态(如 fisharchive 的 CC BY-NC-SA 4.0),不随本仓库再分发。
No comments yet. Be the first to write one.