本文档将指导您如何为QQ频道机器人客户端开发插件。
插件结构
每个插件都是一个标准的 JavaScript 文件,需要导出一个包含以下字段的对象:
1 | // 插件对象 |
API 说明
1. 消息对象(message)
消息对象包含了消息的完整信息:
1 | { |
2. 频道对象(channel)
频道对象包含了频道的基本信息:
1 | { |
3. 上下文对象(context)
上下文对象提供了插件运行时的环境和工具:
1 | { |
插件功能界面预览
消息处理流程
消息接收
- 系统接收到新消息时,会检查消息内容是否以配置的命令前缀开始
- 解析出命令和参数
- 查找所有匹配的已启用插件
插件执行
- 对每个匹配的插件:
- 创建独立的插件上下文对象
- 调用插件的handler函数
- 等待处理结果
- 多个插件可以使用相同的命令
- 插件按照加载顺序依次执行
- 某个插件执行失败不会影响其他插件
- 对每个匹配的插件:
响应处理
- 每个插件的handler如果返回字符串,系统会自动发送响应消息
- 每个响应都是独立的,会分别发送到频道
- 发送的消息可能进入审核状态(code: 304023)
- 审核通过或拒绝会触发相应的事件
权限处理
系统会自动计算机器人的权限:
管理员权限
- 频道主
- 管理员
- 超级管理员
- 子频道管理员
拥有以上角色时自动获得所有权限(1099511627775)
普通权限
- 根据角色的permissions值按位计算
- 多个角色的权限值进行按位或运算
- 可以使用api.hasPermission检查特定权限
最佳实践
错误处理
1
2
3
4
5
6
7
8
9
10handler: async (message, channel, context) => {
try {
// 处理逻辑
context.log.info('处理成功', { messageId: message.id })
return '成功消息'
} catch (error) {
context.log.error('处理失败', { error, messageId: message.id })
return '处理失败,请稍后重试'
}
}数据持久化
1
2
3
4// 使用storage API保存数据
const records = context.storage.get('records') || {}
records[userId] = { /* 数据 */ }
context.storage.set('records', records)消息审核处理
1
2
3
4
5
6const response = await context.api.sendMessage(channelId, content)
if (response.code === 304023) {
context.log.info('消息进入审核', {
auditId: response.data.message_audit.audit_id
})
}权限检查
1
2
3if (!context.api.hasPermission(channel.permissions, 'MANAGE_MESSAGES')) {
return '权限不足,需要管理消息的权限'
}
么么扎~~