- Início
- Plugins
- Ferramentas e funções
- dsh-qq-moony
dsh-qq-moony
seventy-jj/dsh-qq-moony
把 QQ 小号接进 DeepSeek Harness:收发消息、发表情包、发 QQ 空间说说、参与群聊,能自己找话题,自带启动与限速防封。
Instalar
dsh plugin --profile web add github:seventy-jj/dsh-qq-moonyREADME
dsh-qq-moony
把 QQ 小号接进 DeepSeek Harness。
装完之后,Harness 里的 Agent 就有了第二个出口:发消息、收消息、发表情包、发 QQ 空间说说,还能自己主动找人。它只当手,不当腿——QQ 客户端和 NapCat 得你自己先备好。
dsh plugin add dsh-qq-moony
版本以 package.json 和 CHANGELOG.md 为准。这里不写死版本号——写死过一次,后来就忘了改。
装完之后设置页会自己报版本:插件会去 npm 上查最新版,跟本地比一比,有新版本就在顶上提示一句(只提醒,不自动更新)。
一、它能干什么
| 工具 | 干什么 |
|---|---|
qq_status | 小号在不在线、登录的是谁、今天发了多少、还剩多少额度 |
qq_send | 发消息。私聊写 QQ 号,群聊写 group:群号;image 可以只发图或图文一起 |
qq_read | 读最近收到的消息 |
qq_stickers | 列出攒下来的图,带标签(情绪 / 用途 / 一句描述) |
qq_tag_sticker | 把一张图收进表情库并打标签(重复的、糊的、真人照片不收) |
qq_pick_sticker | 按情绪和用途从库里挑一张 |
qq_qzone | 发一条 QQ 空间说说 |
qq_qzone_history | 看自己发过哪些说说(本地账本,不读空间接口) |
除工具之外,还有几件自动的事:
收消息不用外部脚本。 插件启动时自己连 NapCat 的 WebSocket(默认 ws://127.0.0.1:3001),收到的消息进内存缓冲并写盘。
断线自检。 NapCat 每 30 秒发一次心跳;超过 90 秒没有任何帧,插件主动断开重连。连接、断开、自检触发都写进日志——不会再出现"线断了没人知道"。
图片会真的取下来。 别人发图,下载到 <DSH_HOME>/qq-moony/media/,记录里留本地路径,Agent 可以直接打开看。
自动回复(可选)。 收到私聊,随机等 2–7 秒,把来信投进一个专用会话,那边的 Agent 用 qq_send 回过去。投递时自动附一段记忆(memory/MEMORY.md 末尾 + 当天日记,约 2000 字)。
主动说话(可选)。 每隔一段随机时间,给它一次"想说什么就说,也可以不说"的机会。
QQ 空间自动发说说(可选)。 你写一段要求(内容、语气、频率都行),到点把这段原话交给它判断发不发。
群聊(可选,两个开关分开)。
- 接消息:白名单里的群,被 @ 才应。
- 参与聊天:每群记着最近三十条,隔 8–20 分钟给一次"要不要插一句"的机会,把这现场交给它判断,接不住就什么都不发。冷场(五分钟没人说话)不开口;同群冷却十分钟;群里一天最多二十条。
一句一句说。 一段话会按句末标点拆成几条发,中间隔 1–3 秒,像人说话那样。太短的("哦。""!")并进上一句;一轮最多 4 条,多的并到最后一条。
表情包会自己攒、自己配。 收到图先看一眼,值得收才收(重复、糊的、真人照片不收),打三个标签存进库;回话时合适的就配一张,挑不到就不配——一张不配比配错好。
打开 DSH 就自带 NapCat。 启动时探一下 3000 端口,没通就用 -q 快速登录把 NapCat 拉起来——免扫码,几秒上线。而且是静默的:插件生成一个 VBS 用 wscript 起,不会弹黑窗口(windowsHide 对批处理不管用,这是唯一可靠的办法)。
会自己报版本。 插件去 npm 上查最新版,跟本地比一比;有新版本就在设置页顶上提示一句——只提醒,不替你更新。判断是逐段比数字的:本地比 npm 新的时候,不会瞎报"有新版本"。
连不上时有一个按钮。 设置页顶部那块「还差几步才能用」里,会带一个一键连接——点了先探活,没跑就静默拉起 NapCat,最多等 60 秒。它不会替你杀掉旧的 QQ 进程(那会连你主号一起关掉),只会把实况摆出来:现在有几个 QQ 进程、其中几个带着 NapCat 的 hook,然后告诉你下一步该干什么。
别人发文件,她收得到。 图片下到 media/,文件下到 files/(时间戳 + 原文件名);消息交给她的时候会写清"已存到哪,要读就 read / read_image"。取不下来的也会记一笔,不会一声不响。
卡片也能读。 QQ 里转发的图文卡片、小程序卡片,原来只会显示成 [json],现在会把标题、描述、链接挖出来——比如"某某想和你建立情侣关系"。
连发几条会等她说完。 同一个人连着发时,每条都把计时器往后推(默认安静 8 秒算说完),然后把这一批当成一整段,一次答完;最长等 30 秒,不会一直拖着不回。
二、装之前必须先有
- QQ NT(9.9.x)。老版 QQ 9.7 注不进去,这是死条件。
- NapCat Shell 版。Windows 上用
launcher-user.bat启动。 - OneBot 服务开着:HTTP 默认
http://127.0.0.1:3000,WebSocket 默认ws://127.0.0.1:3001,两处都要设 token。
⚠️ 一定要用小号
不要拿常用号、更不要拿主号。
NapCat 是接管整个 QQ 客户端的行为——消息收发、登录态、空间说说,全都在它的手里。QQ 那边对"非官方客户端"的判定不透明,封号也不讲道理。用主号意味着:你的好友、群、聊天记录、空间,一起陪绑。
小号出事的代价是"再注册一个",主号出事的代价是你没法估。
另外:小号也别绑钱包、别实名做要紧的事、别进你非去不可的群。
三、设置页(名字叫「QQ嗦嗨嗨」)
装完重启 DSH,设置里会多一项 QQ嗦嗨嗨。
顶上一块是体检:QQ NT 装没装、NapCat 找不找得到、能不能连上。缺哪样它就列哪样,写明去哪儿下、哪几步——不用盯着一片红猜。
- 连接状态:在线没有、登录的是谁、今天发了多少、上限多少
- 主动说话:开关(点一下即时保存)
- 自动回复:开关
- 主动间隔:最短 / 最长(分钟),每次从区间里随机抽
- 每小时上限 / 每天上限:数字,1–200 / 1–1000
- 群聊:两个开关(接消息 / 参与聊天)+ 群号白名单 + 六个可调的数
- QQ 空间自动发说说:开关 + 一段提示词 + 随机间隔
开关即时生效;数字和提示词走草稿,改完点右下角保存更改。
⚠️ 群聊"参与聊天"很费 token:每给一次机会都等于跑一整轮会话,哪怕它最后决定不说话。间隔别设太短。
人设:默认是中性,不会变成作者的角色
包里不带任何人的身份。persona 留空时,自动回复的会话只被告知"你替这个账号主人在 DSH 里收发消息"——干净、中性,你说什么它就是什么。
想让它有自己的性格,就在设置页「人设」那一栏写几句,或者改 config.json 的 persona:
"persona": "你是这个账号主人在 DSH 里养的助手,说话短、口语,不自我介绍"
填了之后,这段话会跟着每条自动回复一起投给会话。
⚠️ 同理,包里也不带作者的 token 和小号号。cordis.patch.yml 里这几项都是空的,必须你自己在 config.json 填。
四、配置
优先级:本地配置文件 > bundle patch 里的 config > 代码默认值。
<DSH_HOME>/qq-moony/config.json
{
"baseUrl": "http://127.0.0.1:3000",
"token": "你的 OneBot token",
"uin": 123456789,
"wsUrl": "ws://127.0.0.1:3001",
"listen": true,
"staleTimeoutMs": 90000,
"napCatDir": "C:\\path\\to\\napcat",
"qqUin": 123456789,
"autoStartNapCat": true,
"perHour": 20,
"perDay": 60,
"autoReply": false,
"replyTo": [],
"replyDelayMinMs": 2000,
"replyDelayMaxMs": 7000,
"sessionId": "qq-moony-auto",
"cwd": "",
"autoContext": true,
"maxContextChars": 2000,
"groupReply": false,
"groupChat": false,
"groupWhitelist": [],
"groupContextSize": 30,
"groupChatEveryMinMin": 8,
"groupChatEveryMinMax": 20,
"groupActiveWindowMin": 5,
"groupCooldownMin": 10,
"groupPerDay": 20,
"proactive": false,
"proactiveEveryMinMin": 45,
"proactiveEveryMinMax": 90,
"qzoneAuto": false,
"qzonePrompt": "",
"qzoneEveryMinMin": 120,
"qzoneEveryMinMax": 240
}
几个关键项:
token:写错会报token verify failed,这是第一道坎。replyTo:自动回复的私聊白名单;空数组表示谁发都回。groupWhitelist:群白名单;空数组等于群聊没开。cwd:自动回复会话的工作目录。指到你的工作区,它才会带上你的人设文件和记忆。maxContextChars:每条自动回复附多少字记忆。调小省钱,调大记得住。staleTimeoutMs:多久没收到帧就重连。
⚠️ 配置文件不要带 BOM。 PowerShell 的 Set-Content 写 UTF-8 会带 BOM,Node 的 JSON.parse 会抛错,整份配置被当成不存在。用这个写:
[System.IO.File]::WriteAllText("路径", $json, [System.Text.UTF8Encoding]::new($false))
(插件读的时候已经会剥 BOM,但写文件那边的坑还是留着。)
五、防封
写在代码里,不靠自觉:
- 每条消息发出前随机等 2–7 秒
- 一小时 / 一天上限按「轮」算(一轮 = 一次回复,可能拆成几条),到顶直接拒发(不是提醒,是拒绝)
- 每分钟硬上限按「条」算(默认 6)。这条不跟"轮"妥协——风控只看得见条数,看不见你以为的"一轮"
- 群里默认不接;开了也只接白名单 + 被 @ 的,且同群冷却 10 分钟、全群日额 20
- 额度记账在
<DSH_HOME>/qq-moony/sent.log(条)和rounds.log(轮),跨会话累计 - 留了一个「不限条数」开关,给确实需要的人——开了就没有上面那两道闸,自己掂量
真正决定会不会被封的是拿它做什么。插件只能保证不让你手滑:
只回不主动、不群发、不刷屏、不加好友、不发链接。
群聊的额外一条
放进熟人群之前想清楚:那儿的人未必认识这个号。一个陌生头像突然接话,第一反应是"这谁"。要是正赶上聊私事(家人、成绩、室友之间的事),插一句就不只是尴尬。
建议:先只开"接消息",让别人 @ 一次看看反应;觉得合适再开"参与聊天"。
六、已知限制
- 不装 NapCat、不注入 QQ。 那部分在客户端侧,插件碰不到。
- 不是官方机器人。 走客户端协议端,有封号风险,别拿主号试。
- QQ 空间只能发,不能读。 NapCat 只给"发说说 / 删说说"两个接口,读动态、点赞、评论一律"不支持的 Api"(逐个试过)。所以只有本地账本
qq_qzone_history,没有"刷空间"功能。 - 不支持语音、文件。 目前只处理文字和图片。
- 主动、空间、自动回复、群聊共用一个会话(
qq-moony-auto),理论上会互相排队。 - 自动回复是"另一个我":同工作区、共享记忆和文件,但不共享你正在聊的那个窗口的上下文。
七、出问题先看这里
<DSH_HOME>/qq-moony/debug.log
常见症状按顺序排查:
token verify failed→ token 写错,或 NapCat 那边没设。- 能发不能收 → 看 debug.log 有没有
WebSocket 已连上;没有就查 3001 端口和 NapCat 的websocketServers。 - 收到消息但不回 → 看有没有"自动回复检查"那行;有检查没投递,多半是白名单或
autoReply没开;投递了没回应,看sessionId对应的会话起没起来。 - 页面报
SyntaxError: ... not valid JSON→ 接口没挂上,重启一次 DSH。 - 设置页改了没生效 → 检查是不是带 BOM;数字项要点"保存更改"。
八、版本
见 CHANGELOG.md。
License
MIT
Plugins relacionados
archify (deepseek-harness)
tt-a1i/archify
WeKnora (dsh-weknora)
tencent/weknora
weknora
tencent/weknora
BrowserSkill (dsh-plugin-browserskill)
tencent/browserskill