跳转至

SnowLuma 接入

SnowLuma 是面向 QQ 客户端的新一代互操作运行时,把 QQ 原生会话转成 OneBot 接口。 它在 Windows 上体验最完整;Linux 也能跑,但 QQ 扫码登录需要一块能看见的远程桌面。

前置:月璃后端已经能跑(第一次启动与配置), 准备好两个不同的 QQ 号——机器人号用小号。

先看清这四件事

接入时最容易卡住的就是这四个问题,动手前先花一分钟看完。

一、要建的是「正向 WebSocket 服务端」

这个服务由协议端开出来、等着月璃去连,所以叫正向。 在 SnowLuma 的 OneBot 网络配置里对应的条目是 wsServers:

  • wsServers(服务端)—— 对的。SnowLuma 监听端口,月璃主动连上来。
  • wsClients(客户端)—— 方向反了,月璃不会去当服务端,连不上。
  • 只开 HTTP 服务端 —— 不满足,月璃走的是 WebSocket。

这一条还要同时提供事件与动作:当前配置形态里 role 填 Universal, 只接事件或只收 API 都会出现「收得到消息、发不出回复」。

二、一共涉及四个端口,只有一个要填进月璃

端口 谁在用它 要填进月璃吗
协议端管理面板端口(默认 5099) 浏览器打开 SnowLuma 的 WebUI 改配置 不填
OneBot HTTP 服务端口 HTTP 上报或 API 调用 本接入方式用不到
正向 WebSocket 端口 月璃连过去收发消息 要填,就是 [snowluma].port,示例用 8095
月璃后端端口 7999 浏览器打开月璃的管理面板 不填,和协议端没有关系

四个端口互不通兑。只有 WebSocket 那个要出现在月璃的配置里, 另外三个填进去都会连不上。

三、一共三个 token,也只有一个要填进月璃

名字 干什么用 填到哪
协议端 OneBot 访问令牌(accessToken) 月璃连协议端时握手用的凭据 月璃的 [snowluma].token;协议端没设这项就留空
协议端管理面板初始密码 登录 SnowLuma 自己的 WebUI 不填
月璃面板 token 登录月璃的管理面板 不填

前两个都在协议端,但只有第一个是给月璃用的 —— 把管理面板密码填进 token 是接入时最常犯的错,表现是握手返回 401 或 403。

四、月璃这边要改两个文件

两个文件都在项目目录下(项目装在 D:\YueLiBot 就是 D:\YueLiBot\config\adapter.toml 与 D:\YueLiBot\adapters\yueli-snowluma-adapter\config.toml),用记事本打开即可。

  • config/adapter.toml:只改 plugin 一行
  • adapters/yueli-snowluma-adapter/config.toml:改 [snowluma] 与 [owner] 段里的几个值

两个文件的分工,见适配器配置。

第一步:装 SnowLuma

两条都可以:

走桌面控制台——到 NapCatQQ Desktop 的 Releases 下载 NapCatQQ-Desktop-<版本>-x64.msi 安装。这个控制台同时管 NapCat 和 SnowLuma,能一键装组件、起停、看日志。

走官方发行包——到 SnowLuma 的 Releases 下载 Windows 完整发行包,解压到独立目录,运行 launcher.bat。

Lite 版不带运行时,需要自己装 Node.js 22.13 以上(23 系要 23.4 以上)。 不确定就下完整版。

下载对应平台的完整发行包解压,然后:

chmod +x launcher.sh
./launcher.sh

QQ 的扫码登录需要图形界面;无头服务器要先准备可见的远程桌面。 月璃不提供代登录入口,这一步必须由你在协议端完成。

第二步:登录机器人 QQ

打开桌面 QQ 并用机器人小号登录,然后启动 SnowLuma。 两者应当用同一个 Windows 用户、相同的权限等级运行,否则注入会失败。

启动日志里会打印 WebUI 地址,默认是:

http://localhost:5099

用日志里给的初始密码登录(全新数据目录时由启动日志提供)。 这个密码是 SnowLuma 自己的管理面板密码,不是 OneBot 访问令牌。

进面板先看 QQ 的连接/注入状态:状态不对时先解决协议端自己的问题, 这时候去连月璃只会白费功夫。

第三步:建一个正向 WebSocket 服务端

在 SnowLuma 的面板里进入 OneBot 网络配置,新建一个 wsServers 条目。

不同版本的字段名略有出入,但只要看到下面这几项,就说明找对地方了:

界面上的字段 填什么 月璃那边对应哪个值
启用 打开(只保存不启用,端口不会真的监听) 插件连接段的 enabled = true
主机 / 监听地址 127.0.0.1(同机部署) host = "127.0.0.1"
端口 8095,或任意没被占用的端口 port,两边必须一模一样
角色 / role Universal(事件与动作都要) 不用填
路径 /(月璃固定用根路径,不支持自定义路径) 不用填
访问令牌 / accessToken 自定义;不想设就留空 有值就原样填进 token,留空则 token = ""
消息格式 array 适配器按消息段解析

注意端口那一行是唯一需要两边抄一致的数字。上面的管理面板端口、 下面的 HTTP 端口都不要填进月璃,见上面第二节。

保存后确认服务真的开始监听——只保存草稿、没有启用,端口是不会开的。

消息上报必须是数组格式

SnowLuma 不同版本的配置键名不一样:有的界面叫 messagePostFormat, 当前的配置文档用的是 messageFormat。哪个存在就改哪个,都设成 array。

只识别新键名的版本里,写旧键名不会报错但也不生效—— 最终判据是事件里的 message 是数组而不是字符串。

第四步:在月璃这边选插件、填连接

要改两个文件,都在项目目录下,用记事本打开就行(右键 → 打开方式 → 记事本)。

先打开 config/adapter.toml。项目装在 D:\YueLiBot 的话,完整路径就是 D:\YueLiBot\config\adapter.toml。把 plugin 改成:

plugin = "yueli-snowluma-adapter"

再打开第二个文件:adapters/yueli-snowluma-adapter/config.toml,同样在项目目录下。 它可能还不存在 —— 那就从 连接模板 复制一份内容,存成这个路径。

改下面这几个值,其余字段保留模板里的原样:

[snowluma]
enabled = true            # 启用前先在协议端建好 wsServers 条目
self_qq = "123456789"     # 机器人小号,与协议端登录的号一致
host = "127.0.0.1"        # 只填地址,不带 ws://、端口和路径
port = 8095               # 与协议端实际监听端口一致
token = ""                # 填成协议端的 accessToken;没有就留空

[owner]
qq = "987654321"          # 你自己的 QQ 号,与上面必须是两个不同的号

段名必须是 [snowluma],不能沿用别家插件的段名。 token 填的是协议端的 accessToken;三个 token 的区别见 上面第三节。

地址怎么填才对

host 只填主机名或 IP。 月璃当前固定使用普通 ws://主机:端口 连接, 不支持自定义路径——协议端必须在根路径 / 上提供服务。

服务器上写 0.0.0.0 是监听范围,不是连接地址。 月璃这边要填能连到的实际地址。

容器里的 127.0.0.1 指容器自己。 月璃跑在宿主机就填映射到宿主机的端口; 月璃也在容器里,就填容器网络里能到达的地址。

别把端口搞混:管理面板端口、OneBot HTTP 端口和 WebSocket 端口是三回事, 只有 WS 端口能填进 port。

第五步:启动并确认

保持 QQ 与 SnowLuma 在线,在月璃项目根目录运行:

uv run bot.py

看后端终端里的适配器连接状态与识别到的登录号,然后:

  1. 用你自己的 QQ 私聊机器人号,确认 QQ 里收到回复
  2. 把测试群写进 [group] 名单,重启月璃
  3. 在群里用 @ 提及机器人,确认群里有回复

连不上的常见原因

现象 先查这里
面板能打开,但 QQ 里没反应 QQ 登录了吗、注入成功了吗、版本对得上吗
WS 连接失败 wsServers 条目启用了吗、端口与容器映射一致吗
401 / 403 填的是 accessToken 吗,是不是把管理员密码填了进去
收得到事件、发不出消息 服务端的 role 是不是 Universal,看动作报错
消息格式校验失败 实际生效的那个格式键(messageFormat 或 messagePostFormat)设成 array 了吗
插件配置校验失败 段名是不是 [snowluma],两个 QQ 号是不是填成了同一个
私聊正常、群里不回 群号进白名单了吗、@ 到了吗、她是不是在睡眠

reconnect_interval_sec 管断线重连,action_timeout_sec 管动作等待。 端口、鉴权或账号错了,把等待时间调长解决不了问题。

配置能读通、连接能建立、QQ 真收到回复——这三件事要分别确认。 只读自检见适配器配置。