@zhin.js/adapter-onebot11
Version:
zhin adapter for onebot11
390 lines (297 loc) • 7.82 kB
Markdown
# @zhin.js/adapter-onebot11
Zhin.js OneBot v11 协议适配器,通过 WebSocket 连接各种支持 OneBot 协议的 QQ 机器人实现(如 go-cqhttp、Shamrock、LagrangeGo 等)。
## 功能特性
- 🔌 完整 OneBot v11 协议兼容
- 🌐 WebSocket 客户端和服务器模式
- 🔐 Access Token 认证支持
- 🔄 自动重连机制
- 💓 心跳检测
- 📨 群聊和私聊消息处理
- 🛠️ 完整的 API 调用支持
- 📝 消息段(Message Segment)完整支持
## 安装
```bash
pnpm add @zhin.js/adapter-onebot11 ws
```
## 配置
### WebSocket 客户端模式(正向 WS)
```typescript
// zhin.config.ts
import { defineConfig } from 'zhin.js'
export default defineConfig({
bots: [
{
context: 'onebot11',
type: 'ws', // WebSocket 客户端
name: 'my-bot',
url: 'ws://localhost:8080', // OneBot 服务地址
access_token: process.env.ONEBOT_TOKEN, // 访问令牌(可选)
reconnect_interval: 5000, // 重连间隔(毫秒)
heartbeat_interval: 30000 // 心跳间隔(毫秒)
}
],
plugins: [
'adapter-onebot11'
]
})
```
### WebSocket 服务器模式(反向 WS)
```typescript
export default defineConfig({
bots: [
{
context: 'onebot11.wss', // WebSocket 服务器
type: 'ws_reverse',
name: 'my-bot',
path: '/onebot/ws', // WebSocket 路径
access_token: process.env.ONEBOT_TOKEN, // 访问令牌(可选)
heartbeat_interval: 30000
}
],
plugins: [
'http', // 需要 HTTP 服务
'adapter-onebot11'
]
})
```
## 支持的 OneBot 实现
### 推荐实现
| 实现 | 协议支持 | 稳定性 | 推荐度 |
|------|---------|--------|--------|
| [go-cqhttp](https://github.com/Mrs4s/go-cqhttp) | ✅ 完整 | ⭐⭐⭐⭐⭐ | 高 |
| [LagrangeGo](https://github.com/LagrangeDev/Lagrange.Core) | ✅ 完整 | ⭐⭐⭐⭐ | 高 |
| [Shamrock](https://github.com/whitechi73/OpenShamrock) | ✅ 完整 | ⭐⭐⭐⭐ | 中 |
| [NapCat](https://github.com/NapNeko/NapCatQQ) | ✅ 完整 | ⭐⭐⭐⭐ | 中 |
### 配置示例
#### go-cqhttp
```yaml
# config.yml
servers:
- ws:
host: 0.0.0.0
port: 8080
access-token: "your_token_here"
```
#### Shamrock
在 Shamrock 设置中:
1. 启用 WebSocket 服务
2. 设置端口(默认 5800)
3. 配置 Access Token(可选)
## 使用示例
### 基础消息处理
```typescript
import { addCommand, MessageCommand } from 'zhin.js'
addCommand(new MessageCommand('hello <name:text>')
.action(async (message, result) => {
return `你好,${result.params.name}!`
})
)
```
### 群聊消息
```typescript
import { onGroupMessage } from 'zhin.js'
onGroupMessage(async (message) => {
console.log(`群 ${message.$channel.id} 收到消息`)
await message.$reply('收到了!')
})
```
### 私聊消息
```typescript
import { onPrivateMessage } from 'zhin.js'
onPrivateMessage(async (message) => {
await message.$reply('你好!')
})
```
### 发送图片
```typescript
addCommand(new MessageCommand('pic <url:text>')
.action(async (message, result) => {
return [
{ type: 'image', data: { file: result.params.url } }
]
})
)
```
### 使用 CQ 码
```typescript
addCommand(new MessageCommand('cq')
.action(async (message) => {
return [
{ type: 'face', data: { id: '123' } },
{ type: 'text', data: { text: '表情' } }
]
})
)
```
## 消息类型支持
### 接收消息类型
- ✅ 文本消息(text)
- ✅ 图片消息(image)
- ✅ 语音消息(record)
- ✅ 视频消息(video)
- ✅ @ 提及(at)
- ✅ 表情(face)
- ✅ 引用回复(reply)
- ✅ 戳一戳(poke)
- ✅ 分享(share)
- ✅ 位置(location)
- ✅ 音乐分享(music)
- ✅ JSON 卡片(json)
- ✅ XML 卡片(xml)
### 发送消息类型
- ✅ 文本消息
- ✅ 图片消息(支持 URL、Base64、本地文件)
- ✅ 语音消息
- ✅ 视频消息
- ✅ @ 提及
- ✅ 表情
- ✅ 引用回复
- ✅ 戳一戳
- ✅ 分享卡片
- ✅ 音乐分享
- ✅ JSON/XML 卡片
## API 方法
### 消息相关
```typescript
const bot = app.adapters.get('onebot11')?.bots.get('my-bot')
// 发送群消息
await bot.callApi('send_group_msg', {
group_id: 123456,
message: '消息内容'
})
// 发送私聊消息
await bot.callApi('send_private_msg', {
user_id: 123456,
message: '消息内容'
})
// 撤回消息
await bot.callApi('delete_msg', {
message_id: 123456
})
```
### 信息获取
```typescript
// 获取登录信息
const loginInfo = await bot.callApi('get_login_info')
// 获取用户信息
const userInfo = await bot.callApi('get_stranger_info', {
user_id: 123456
})
// 获取群信息
const groupInfo = await bot.callApi('get_group_info', {
group_id: 123456
})
// 获取群成员列表
const memberList = await bot.callApi('get_group_member_list', {
group_id: 123456
})
```
### 群管理
```typescript
// 踢出群成员
await bot.callApi('set_group_kick', {
group_id: 123456,
user_id: 654321
})
// 禁言群成员
await bot.callApi('set_group_ban', {
group_id: 123456,
user_id: 654321,
duration: 600 // 秒
})
// 设置群名片
await bot.callApi('set_group_card', {
group_id: 123456,
user_id: 654321,
card: '新名片'
})
```
## 连接模式对比
### 正向 WebSocket(客户端模式)
**优点:**
- ✅ 配置简单
- ✅ 主动连接,无需开放端口
- ✅ 适合本地开发
**缺点:**
- ❌ 需要 OneBot 实现提供 WebSocket 服务
### 反向 WebSocket(服务器模式)
**优点:**
- ✅ OneBot 实现主动连接
- ✅ 支持多个客户端连接
- ✅ 适合生产环境
**缺点:**
- ❌ 需要开放端口或使用内网穿透
- ❌ 配置相对复杂
## 消息 ID 格式
OneBot11 适配器的消息 ID 格式:`{message_id}`
撤回消息时直接使用数字 ID。
## 注意事项
### Access Token
建议配置 Access Token 增强安全性:
```typescript
{
access_token: process.env.ONEBOT_TOKEN
}
```
OneBot 实现需要配置相同的 Token。
### 重连机制
适配器会自动重连,可配置重连间隔:
```typescript
{
reconnect_interval: 5000 // 5秒后重连
}
```
### 心跳检测
心跳机制确保连接活跃:
```typescript
{
heartbeat_interval: 30000 // 30秒发送一次心跳
}
```
### API 超时
API 调用默认 30 秒超时,可在代码中调整。
## 常见问题
### Q: 连接不上 OneBot 服务?
A: 检查:
1. OneBot 服务是否启动
2. WebSocket 地址是否正确
3. Access Token 是否匹配
4. 防火墙是否阻止连接
### Q: 消息发送失败?
A: 可能原因:
1. 未登录或登录失败
2. 被风控限制
3. 群/好友不存在
4. 消息格式错误
### Q: 反向 WS 无法连接?
A: 确认:
1. HTTP 服务已启动
2. WebSocket 路径配置正确
3. OneBot 配置的反向 WS 地址正确
4. 端口已开放
### Q: 如何处理 CQ 码?
A: OneBot11 适配器自动处理 CQ 码转换,使用消息段格式即可:
```typescript
[
{ type: 'text', data: { text: '文本' } },
{ type: 'image', data: { file: 'url' } }
]
```
## 相关链接
- [OneBot 标准](https://github.com/botuniverse/onebot-11)
- [go-cqhttp](https://github.com/Mrs4s/go-cqhttp)
- [LagrangeGo](https://github.com/LagrangeDev/Lagrange.Core)
- [Shamrock](https://github.com/whitechi73/OpenShamrock)
- [Zhin.js 官方文档](https://github.com/zhinjs/zhin)
## 依赖项
- `ws` - WebSocket 客户端/服务器库
- `zhin.js` - Zhin 核心框架
## 开发
```bash
pnpm build # 构建
pnpm clean # 清理构建文件
```
## 许可证
MIT License
## 贡献
欢迎提交 Issue 和 Pull Request!