Vai al contenuto principale
S

dsh-qq-moony

seventy-jj/dsh-qq-moony

把 QQ 小号接进 DeepSeek Harness:收发消息、发表情包、发 QQ 空间说说、参与群聊,能自己找话题,自带启动与限速防封。

Installazione

dsh plugin --profile web add github:seventy-jj/dsh-qq-moony

README

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 秒,不会一直拖着不回。


二、装之前必须先有

  1. QQ NT(9.9.x)。老版 QQ 9.7 注不进去,这是死条件。
  2. NapCat Shell 版。Windows 上用 launcher-user.bat 启动。
  3. 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

常见症状按顺序排查:

  1. token verify failed → token 写错,或 NapCat 那边没设。
  2. 能发不能收 → 看 debug.log 有没有 WebSocket 已连上;没有就查 3001 端口和 NapCat 的 websocketServers。
  3. 收到消息但不回 → 看有没有"自动回复检查"那行;有检查没投递,多半是白名单或 autoReply 没开;投递了没回应,看 sessionId 对应的会话起没起来。
  4. 页面报 SyntaxError: ... not valid JSON → 接口没挂上,重启一次 DSH。
  5. 设置页改了没生效 → 检查是不是带 BOM;数字项要点"保存更改"。

八、版本

见 CHANGELOG.md。

License

MIT

Plugin correlati