koishi-plugin-qq-chat 夺舍 QQ 官方机器人

koishi-plugin-qq-chat

npm npm downloads

夺舍 QQ 官方机器人:在 Koishi 控制台直接接管官方 QQ 机器人的群聊 —— 收发消息、群管理、指令沙盒一应俱全。

本插件把官方 QQ 机器人变成"能用鼠标操作"的聊天软件:控制台内就是一套接近真机 QQ 的聊天界面,图片 / 语音 / 视频 / 文件收发、群成员管理、Markdown 面板、指令桥接、独立窗口与沙盒模式全部内置。

:camera_flash: 界面演示

控制台主界面

控制台主界面

气泡、头像、群角色徽章、时间、未读提醒全部对齐真机 QQ;左侧是机器人与频道列表,右侧是群成员面板。

消息与频道右键菜单

消息右键菜单 频道右键菜单
消息右键菜单 频道右键菜单

复制 / 查看原始报文 / 转发 / 收藏 / 多选 / 引用 / +1 复读 / @TA / 查看资料 / 查看 OpenID / 撤回 / 删除;频道菜单里可以直接打开独立聊天窗口在沙盒窗口中打开用沙盒模式打开主界面

群成员 / 黑名单面板

群成员面板

成员列表、角色徽章、批量移除、黑名单维护,成员右键即可私聊 / @TA / 禁言。

QQ 表情 与 Markdown 面板

QQ 表情(经典 / 大表情) Markdown 面板
QQ 表情面板 Markdown 面板

表情素材直接用公网 QFace 资源(koishi.js.org/QFace),无需本地素材目录;点一下就以动图 apng 的形式发到 QQ。Markdown 面板支持原生按钮、指令交互按钮(/指令、回车发送、引用),面板里拖入 / 粘贴的图片会走 assets 服务上传。

@ 成员 / 收藏 / 多选

@ 成员面板 收藏 多选操作
@ 成员面板 收藏 多选

群聊天设置

群聊天设置

群备注、置顶、消息免打扰、清空本地聊天记录。

沙盒窗口(独立悬浮窗)

沙盒窗口

/qq-chat/sandbox?bot=<机器人>&channel=<频道>和主界面完全一样的独立窗口:侧边栏、工具栏、右键菜单、群成员面板一个不少。区别只有一点 —— 消息只在本机跑一遍 Koishi 完整中间件,不会发到 QQ

沙盒里发送与渲染图片 / 文件 / 语音 / 视频

沙盒媒体渲染

图片直接渲染、文件是下载卡片、语音是可点击播放的语音条、视频是可播放的 <video>

沙盒回复:发送到当前频道 / 编辑发送

沙盒回复

机器人的回复被拦截后当成普通聊天消息画出来(带「沙盒」标记),点「发送到当前频道」按原始元素发到 QQ,点「编辑发送」可以先改文字、删掉不要的元素再发(图片 / 语音 / 视频不会被压成文本)。

编辑发送弹窗

编辑发送

图片查看器

图片查看器

主界面沙盒模式

主界面沙盒模式

不想开新窗口时,用 /qq-chat?sandbox=1&bot=..&channel=..(或频道右键「用沙盒模式打开主界面」)即可让控制台主页本身进入沙盒语义:顶部有沙盒横幅,随时点「退出沙盒」。

独立聊天窗口

独立聊天窗口

/qq-chat/window?bot=<机器人>&channel=<频道> 只渲染单个频道,可以单独开窗、拖到副屏,或直接 iframe 嵌到别的网页里。

指令桥接(执行指令)

指令桥接

输入框里写 /指令,点工具栏的「执行指令」,插件会在 Koishi 本地执行它、拦截全部输出(含图片 / 语音 / 视频元素),放进可编辑弹窗,改完再发到 QQ —— 不走适配器、不会因为 QQ 侧的指令面板限制而失败。

:sparkles: 功能特性

:speech_balloon: 聊天界面

  • 控制台内直接查看机器人聊天记录,多机器人 / 多频道切换,频道搜索与置顶

  • 接近真机 QQ 的界面:气泡、头像、群主 / 管理员徽章、时间分隔、消息分组、未读角标、"有人@你"提醒

  • 频道备注、消息免打扰、置顶、从列表移除(本地)

  • 合并转发卡片、B 站小程序卡片、网易云音乐卡片解析与播放

  • 引用消息展示(自动补全引用者昵称)、@ 成员胶囊、QQ 表情与"不支持的第三方表情"提示

  • 手机端适配:滑动返回、输入框避让、容器高度可配

:outbox_tray: 消息收发

  • 接收:文本、图片、语音、视频、文件、Markdown、卡片、合并转发、系统提示(入群 / 退群 / 入群申请)

  • 发送:文字、图片、文件、语音、视频、QQ 表情(经典 / 大表情 apng)、Markdown(原生 / 按钮交互)、截图(框选屏幕)

  • 引用回复、@ 成员、+1 复读、多选批量转发、转发到其他频道、收藏(本地)

  • 撤回消息、群成员禁言 / 解除禁言、入群申请处理

:card_index_dividers: 媒体处理

  • 图片 / 语音 / 视频 / 文件 / 头像自动下载并持久化到 data/qq-chat

  • 浏览器端 IndexedDB 图片缓存 + 视频按需加载(点击才下载)

  • 远程图片走本地代理 /qq-chat/fetch-image(QQ CDN 带鉴权,直接引用显示不出来)

  • 配合 koishi-plugin-silk / 系统 ffmpeg 自动完成语音格式转换,QQ 语音在浏览器里直接播放

:test_tube: 沙盒与指令桥接

  • 沙盒窗口/qq-chat/sandbox,独立悬浮窗,完整主界面,消息只在本机执行

  • 主界面沙盒模式/qq-chat?sandbox=1,控制台主页直接进入沙盒语义

  • 指令桥接:控制台里发 /指令 由 Koishi 本地执行,拦截输出 → 可编辑 → 再发 QQ

  • 沙盒回复支持「发送到当前频道 / 编辑发送(按原始元素)」,图片 / 语音 / 视频不会被压成文本

  • 沙盒产生的消息不会写进真实聊天记录,也不会真的发到 QQ

:hammer_and_wrench: 群管理

  • 群成员 / 黑名单面板,成员角色与禁言状态

  • 禁言 / 解除禁言、批量移除成员、黑名单增删

  • 入群申请一键同意 / 拒绝

  • 机器人被移出群聊、群全员禁言、无主动推送权限等状态提示

:art: 外观与持久化

  • 主题:跟随 Koishi 控制台 / 跟随系统 / 深色 / 浅色(独立窗口同样生效)

  • 聊天区自定义背景图(本地路径或 http(s) 链接)+ 模糊度、遮罩浓度

  • 聊天记录分块持久化(data/qq-chat/v2/chat-history),可配置每群上限、分块大小、内存缓存数量,超限自动清理

:package: 安装

在 Koishi 控制台的插件市场搜索 qq-chat 安装,推荐配合 adapter-qq-crack 适配器使用。

可选依赖

插件 说明
koishi-plugin-adapter-qq-crack 推荐:本插件针对该 QQ 适配器做了深度适配,缺少它时群聊相关能力不可用
koishi-plugin-assets-qqbot-part-file 提供 assets 服务。启用后 Markdown 面板里拖入 / 粘贴的图片、QQ 表情才能上传到 QQ 并拿到公网地址
koishi-plugin-silk + 系统 ffmpeg 语音自动转码(QQ 语音 silk → 浏览器可播放的 mp3)

:closed_lock_with_key: 访问控制(配合 auth 插件)

启用 @koishijs/plugin-auth 后,本插件会跟着一起上锁:

范围 未登录时的表现
控制台接口(收发消息、群管理、上传媒体、撤回、删除数据…) 被 auth 插件以 unauthorized 拦截,页面上的操作全部不可用
独立聊天窗口 /qq-chat/window、沙盒窗口 /qq-chat/sandbox 返回 401,页面提示「需要登录 Koishi 控制台」
聊天媒体缓存 /qq-chat/media/persist-media/**、下载接口、图片代理 /qq-chat/fetch-image、背景图 /qq-chat/background 返回 401
机器人消息推送(广播) 未登录的客户端收不到聊天内容

登录一次即可:打开 Koishi 控制台登录后,插件会把登录令牌镜像到本域 cookie 与 localStorage,之后独立窗口 / 沙盒窗口会自动完成 websocket 登录,聊天记录与媒体照常显示。

  • 这套限制只影响浏览器直接访问;机器人自己收发消息、转发媒体不受影响(服务端内部请求照常)

  • 想把窗口 / 媒体重新开放(例如内网大屏、嵌入第三方页面),可在插件配置里关闭 访问控制 → loginRequired

  • 没启用 auth 插件时这些限制完全不生效,行为与以前一模一样

:gear: 配置项

字段 类型 默认值 说明
maxMessagesPerChannel number 500 每个群组最大保存消息数量(50 ~ 1500)
messageChunkSize number 100 单个消息分块文件最大消息数量(20 ~ 500)
channelCacheLimit number 50 内存中最多缓存的频道消息数量(1 ~ 200)
maxPersistImages number 100 持久化存储的图片缓存数量(10 ~ 500)
ocrApiKey string helloworld OCR 接口密钥(OCR.space 免费 key),用于识别 B 站卡片封面上的 UP 主
chatBackground string '' 聊天区背景图:本地图片绝对路径或 http(s) 链接(留空为纯色)
chatBackgroundBlur number 0 背景图片模糊程度(0 ~ 30 px)
chatBackgroundDim number 12 背景图片遮罩浓度(0 ~ 90 %,越大文字越清晰)
theme string koishi 主题:koishi 跟随控制台 / system 跟随系统 / dark 深色 / light 浅色(独立窗口同样生效)
commandBridge boolean true 控制台发送的 /指令 由 Koishi 本地执行,拦截输出后再发到 QQ
commandPrefix string / 本地指令前缀
commandAuthority number 4 执行指令时使用的权限等级(4 = 管理员,保证多数指令可用)
commandTimeoutMs number 50000 指令执行超时(毫秒),绘图类指令建议 ≥ 50000(客户端 RPC 上限 60 秒)
commandMaxLength number 1200 指令输出发送到 QQ 的最大长度
commandEditRules string '' 输出编辑规则:每行一条「查找=>替换」,按顺序应用,用 \n 表示换行
loginRequired boolean true 启用 auth 插件时,独立窗口 / 沙盒窗口与聊天媒体是否要求先登录控制台(关闭后这些地址重新变为公开,仅建议内网调试时关闭)
clearIndexedDBOnStart boolean true 启动时强制清空 IndexedDB 图片缓存(浏览器卡死时的急救开关)
loggerinfo boolean false 日志调试模式(开发者选项)

:card_file_box: 数据目录

路径 内容
data/qq-chat/v2/metadata.json 机器人、频道、置顶等元数据
data/qq-chat/v2/chat-history/<机器人>/<频道>/ 聊天记录(分块 chunk-*.json + index.json
data/qq-chat/temp/ 待发送的图片 / 文件临时目录
data/qq-chat/persist-media/ 图片 / 语音 / 视频 / 头像缓存

:question: 常见问题

Q:为什么 QQ 里的图片显示不出来?

QQ 官方 CDN 的图片链接带鉴权参数,浏览器直接引用会 403。插件会自动把它们改写到本地代理 /qq-chat/fetch-image?u=...,由服务端下载缓存后再显示。

Q:语音点不开 / 没有声音?

QQ 语音是 silk 格式,浏览器播不了。启用 koishi-plugin-silk 并保证系统里有 ffmpeg 即可自动转码。

Q:沙盒里发的消息会不会发到 QQ?

不会。沙盒窗口 / 沙盒模式里的消息只在本地走一遍 Koishi 中间件,回复被拦截后画在界面上;只有你点回复下的「发送到当前频道」或「编辑发送」里的发送按钮,才会真的发到 QQ。

Q:Markdown 面板的图片发到 QQ 后不显示?

需要 assets 服务(推荐 koishi-plugin-assets-qqbot-part-file)。没有它时插件会退回本地地址,QQ 端拉不到图。

Q:开了 auth 插件后,独立窗口 / 沙盒窗口提示「需要登录 Koishi 控制台」?

这是预期行为:未登录的浏览器不允许访问窗口与聊天媒体。先在控制台登录一次,插件会把令牌镜像到本域 cookie,之后重新打开窗口即可。确实要让这些地址公开时,把插件配置里的 访问控制 → loginRequired 关掉。

:memo: 更新日志

3.0.0

  • :sparkles: 新增沙盒窗口/qq-chat/sandbox):独立悬浮窗、完整主界面,消息只在本机执行

  • :sparkles: 新增主界面沙盒模式/qq-chat?sandbox=1)与频道右键「在沙盒窗口中打开 / 用沙盒模式打开主界面」

  • :sparkles: 新增指令桥接:控制台里执行 /指令,拦截输出后编辑再发

  • :sparkles: 沙盒回复支持「发送到当前频道」与「编辑发送」(按原始元素发送,图片 / 语音 / 视频不压文本)

  • :sparkles: 新增独立聊天窗口 /qq-chat/window,可单独开窗或嵌入其它网页

  • :sparkles: 新增聊天背景(图片 + 模糊 + 遮罩)与主题设置

  • :sparkles: 新增 B 站小程序卡片解析(Wbi 签名 + 封面 OCR)、网易云音乐卡片播放

  • :sparkles: 新增群成员 / 黑名单面板、入群申请处理、批量移除成员

  • :closed_lock_with_key: 安全加固:启用 auth 插件后,控制台接口 / 消息推送全部按权限拦截,未登录的客户端无法读聊天记录、发消息或改数据

  • :closed_lock_with_key: 安全加固:独立窗口、沙盒窗口与聊天媒体缓存(图片 / 语音 / 视频 / 头像)、图片代理、背景图在未登录时统一返回 401;登录后由 cookie 自动放行

  • :bug: 修复沙盒消息会被写进真实聊天记录的问题(历史脏数据一并清理)

  • :bug: 修复沙盒里自己发出的消息不显示、沙盒回复里的图片 / 语音 / 视频渲染不出来的问题

  • :bug: 修复编辑发送弹窗里大图预览过大、引用消息发送者显示 unknown 的问题

3.1.0

  • :sparkles: 沙盒发送按钮新增 「以 Markdown 格式发送到当前频道」:输入框内容按 QQ 原生 markdown 直发,格式 / 按钮 / 链接都不丢
  • :sparkles: 沙盒回复新增 「以 MD 发送」:把拦截到的回复(如 /help 的 markdown 菜单)按原生 markdown 发到当前频道
  • :closed_lock_with_key: 沙盒模式隐藏所有「直接发到 QQ」的入口(QQ 表情、发送 Markdown、+1 复读、转发、多选),只保留明确的「发送到当前频道 / 编辑发送 / 以 MD 发送」
  • :bug: 修复**机器人回复被记到「随机群」**的问题:回复一律按会话所在频道落库,不再套用「webui 最后一次发消息的频道」(旧逻辑会导致别人在别的群触发指令时,消息出现在你最后操作过的群里)
  • :bug: 修复沙盒 / 指令桥接拦截下来的 QQ 原生 markdown 在控制台里显示成 ## 原始语法的问题(现在按 markdown 渲染)
  • :bug: 修复发送失败的消息被当成已发送:QQ 拒收 / 无主动推送权限 / 网络错误时,历史里那条会标记「发送失败」(悬停显示失败原因),不再冒充正常消息
  • :bug: 修复指令桥接里插件直接调用官方 API(session.bot.internal.*)时会绕过沙盒、把消息真的发到 QQ 的问题

许可证

本项目采用 MIT 许可证 开源。

本项目基于 chat-patch 修改。

4 个赞

可爱捏

3 个赞

大佬测试一下?

2 个赞

有点意思
image

2 个赞

我去,大佬nb

2 个赞

要不要把这个也做一下?
image
image

已经做完了

1 个赞

花来!

2 个赞

哈? <>

1 个赞

上传语音和文件容易把整个 koishi 搞 timeout

2 个赞

这证明Koishi 威武啊

2 个赞

2.1.0已发布
更新如下

  • 修复

    • 没有管理员时 群成员信息显示撤回
    • 语音无法播放
    • 点击图片弹出预览图片过大导致无法关闭预览窗口
  • 新增功能

    • 发送md消息
    • 群状态获取
    • 禁言
    • 被禁言状态
    • 无主动消息权限提醒
    • 管理群
    • 解析bili视频在webui中直接播放
    • 查看用户 OpenID
    • 机器人被移除提示
    • 等功能
1 个赞

不会做ui 请求来个大佬重写ui!

1 个赞

github有个stapxs qq项目,要不试试看fork那个 or 参考那个做一个?(

或者llbot的webui?

https://github.com/Stapxs/Stapxs-QQ-Lite-2.0/blob/7a895b964a67faf72f912370eb769adce16e37cc/README_EN.md

https://github.com/LLOneBot/LuckyLilliaBot

2 个赞

后续计划更新
fix

  • 没有管理员还获取禁言列表的bug
  • 修复哔哩哔哩视频解析成别的视频的bug

add

  • 调用koishi自身指令并拦截返回结果并编辑后发送
  • qq表情渲染
  • qq原生表情发送
  • 被@强提醒
  • 收藏表情
  • 自定义表情
1 个赞

机器人加的很多群不是管理员,会刷一大堆日志,能不能把这些日志加到调试开关里,关闭的时候不输出呀 :joy:

1 个赞

这个是适配器输出的错误提示

这里已经计划修复了

1 个赞

已经解决请更新2.2.0

1 个赞

2.2.0更新的主要内容
image


image

1 个赞

机器人回复群聊的消息,群聊天框里不显示,显示在私聊(未知用户)的聊天框里是为啥呀 :sob:

1 个赞

这个可能是适配器的问题?
有空我看看

1 个赞