SDK
@snowluma/sdk —— 类型完备的 OneBot 客户端,独立于 SnowLuma 运行时
@snowluma/sdk 是一个 类型完备的 OneBot v11 客户端,用 TypeScript 编写。它面向第三方消费者:你不需要在同一个进程里跑 SnowLuma,也不依赖 SnowLuma 运行时——它只是通过 OneBot 的 HTTP / WebSocket 端口连到任意一个正在运行的 SnowLuma 实例。
包可以直接从 npm 安装,与 SnowLuma 核心 共享 action 类型,因此调用参数和返回值不会随版本漂移。
端口从哪来
SDK 连接的是 SnowLuma 暴露的 OneBot 端口:HTTP 默认 0.0.0.0:3000、WebSocket 默认 0.0.0.0:3001。accessToken 同样来自 OneBot 配置。先在 配置 页确认这些网络适配器已启用。
安装
npm install @snowluma/sdk需要 Node.js ≥ 22(推荐 Node 24 LTS)。包是纯 ESM("type": "module"),自带类型声明。
支持的传输
| 传输 | 客户端类 | 默认端点 |
|---|---|---|
| HTTP(POST JSON) | SnowLumaHttpClient | http://127.0.0.1:3000/ |
| WebSocket(正向 / 反向,含事件) | SnowLumaWebSocketClient | ws://127.0.0.1:3001/ |
两个客户端都继承自抽象基类 SnowLumaApiClient,因此 call() / request() 以及所有 camelCase action 快捷方法在两种传输上一致。HTTP 适合纯请求-响应的脚本;WebSocket 在此之上还能 实时接收事件。
构造客户端
HTTP
import { } from '@snowluma/sdk';
const = new ({
: 'http://127.0.0.1:3000/', // 默认值
: ..,
: 30_000, // 默认 30s
});SnowLumaHttpClientOptions:
baseUrl?—— OneBot HTTP 端点,默认http://127.0.0.1:3000/。accessToken?—— OneBot 配置里的 token;存在时自动加Authorization: Bearer <token>。requestTimeoutMs?—— 默认超时(毫秒),默认30000。fetch?—— 自定义fetch实现(测试或非标准运行时用)。headers?—— 每次请求附带的额外请求头。
WebSocket
import { } from '@snowluma/sdk';
const = new ({
: 'ws://127.0.0.1:3001/', // 默认值
: ..,
: true, // 开启自动重连
});SnowLumaWebSocketClientOptions:
url?—— OneBot WebSocket 端点,默认ws://127.0.0.1:3001/。accessToken?—— 通过查询参数附加到连接 URL。requestTimeoutMs?—— 默认请求超时,默认30000。role?—— 客户端声明的角色:'Api'|'Event'|'Universal'(默认'Universal')。reconnect?——true或一个ReconnectOptions(retries/minDelayMs/maxDelayMs),开启意外断开后的自动重连。protocols?/webSocket?—— 可选子协议、可选自定义WebSocket构造器(Node 运行时或测试用)。
Node 自定义 WebSocket
浏览器和 Node 24 都自带全局 WebSocket,可直接用。若想用 ws 包等实现,把它传给 webSocket 选项即可。
两个工厂函数
createHttpClient(options?)和createWebSocketClient(options?)与new等价,按个人偏好选用。
调用一个 action
高频接口提供类型完备的 camelCase 方法(getLoginInfo、sendGroupMessage、setGroupBan……)。任意已注册的 action 都能用 raw / rawResponse 调用。
import { , } from '@snowluma/sdk';
const = new ({ : .. });
// 快捷方法
const = await .();
await .(123456, (`你好,我是 ${.}`).('all'));
// 任意 action:raw() 返回 data,失败时抛错
const = await .('get_group_file_system_info', { : 123456 });
// rawResponse() 保留完整 OneBot 响应信封(status / retcode / data / echo)
const = await .('get_status');底层方法:
call(action, params?, options?)—— 发送 action,返回data;当status为failed或retcode !== 0时抛SnowLumaApiError。request(action, params?, options?)—— 返回完整响应信封,不抛业务错。
每次请求都可通过 RequestOptions 覆盖行为:echo(关联值)、timeoutMs(0 表示禁用超时)、signal(AbortSignal)。
const = new ();
const = .({ : 5_000, : . });
.();
await ; // 抛 SnowLumaAbortError订阅事件
事件订阅是 WebSocket 客户端独有的能力。客户端用 echo 关联 API 响应,把没有 echo 的包当作事件分发。
import { , } from '@snowluma/sdk';
const = new ({
: ..,
: true,
});
// 类型化事件助手
.(async (, ) => {
if (. === '/ping') {
await .(('pong').(.));
}
});
.('friend', async (, ) => {
await .();
});
// 注册命令
.('echo', async (, , ) => {
await .((. || 'empty'));
});
await .();可用的事件助手:onMessage / onPrivateMessage / onGroupMessage / onNotice(type?) / onRequest(type?) / onMetaEvent / command(),以及更底层的 onEvent、when(predicate, handler)、use(middleware)。生命周期事件用 on('open' | 'close' | 'error' | 'response' | 'raw', …);每个 on / when / use 都返回一个取消订阅的函数。
事件上下文(ctx)内置快捷操作:
ctx.reply(message)—— 按私聊 / 群聊自动回复。ctx.approve()/ctx.reject(reason)—— 处理好友或群请求。ctx.quickOperation(operation)—— 调用.handle_quick_operation。ctx.stopPropagation()—— 停止后续中间件分发。
消息构造器
SDK 自带链式消息构造器和段工厂,发送接口直接接受它的产物:
import { , , , } from '@snowluma/sdk';
// 链式
await .(123456, ('收到 ').(10001).('/tmp/a.png'));
// 段数组
await .(123456, [.('Hello'), .('all')]);
// CQ 码互转
const = ([.(42), .('hi')]);
const = ('hi[CQ:at,qq=all]');内置段:text、br、face、at、atAll、reply、image、record、video、json、xml、poke、forward、node、share、music、location、contact、raw。reply() 在一条链里只能出现一次。
自动重连、ack 关联与共享类型
- ack 关联 —— WebSocket 客户端给每个请求生成
echo,把响应路由回对应的Promise,因此并发请求不会串台。可通过RequestOptions.echo覆盖关联值。 - 自动重连 ——
reconnect: true(或ReconnectOptions)启用指数退避(minDelayMs默认 1000,maxDelayMs默认 30000)。断线时所有挂起请求会以SnowLumaConnectionError拒绝。 - 共享 action 类型 —— action 名、参数和结果类型与
@snowluma/core同源,因此调用面始终与服务端一致。 - 统一错误体系 —— 所有错误继承
SnowLumaError:业务失败抛SnowLumaApiError(鉴权类 retcode 走SnowLumaAuthError),传输层抛SnowLumaTransportError基类下的SnowLumaConnectionError/SnowLumaParseError/SnowLumaTimeoutError/SnowLumaAbortError。
子路径导入
除了主入口,包还提供分模块导出:@snowluma/sdk/client、/messages、/events、/types、/errors、/actions。按需精确导入即可。
相关链接
这篇文档有帮助吗?
最后更新于