Files
open-im-server-deploy/docs/webhook-config.md
kim.dev.6789 e50142a3b9 复制项目
2026-01-14 22:16:44 +08:00

588 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Webhook 配置说明文档
## 概述
Webhook 配置用于设置 OpenIM 服务器在特定事件发生时的回调通知。配置支持从数据库动态读取,每小时自动刷新一次。如果数据库中没有配置或配置无效,将使用 `config/webhooks.yml` 中的默认配置。
## 配置结构
### 基础字段
- **url** (string, 必填): Webhook 回调服务器的地址,所有回调请求都会发送到这个地址
### BeforeConfig前置回调配置
前置回调在操作执行前触发,可以阻止或修改操作。
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| enable | boolean | 是 | 是否启用该回调 |
| timeout | integer | 是 | 超时时间(秒) |
| failedContinue | boolean | 是 | 回调失败时是否继续执行原操作true=继续false=停止) |
| deniedTypes | array[int32] | 否 | 不触发回调的消息类型列表,空数组表示所有类型都触发 |
### AfterConfig后置回调配置
后置回调在操作执行后触发,用于通知和记录。
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| enable | boolean | 是 | 是否启用该回调 |
| timeout | integer | 是 | 超时时间(秒) |
| attentionIds | array[string] | 否 | 仅对指定用户ID或群组ID触发回调空数组表示所有都触发 |
| deniedTypes | array[int32] | 否 | 不触发回调的消息类型列表,空数组表示所有类型都触发 |
## 支持的回调事件
### 消息相关
| 事件名称 | 类型 | 说明 |
|---------|------|------|
| beforeSendSingleMsg | BeforeConfig | 发送单聊消息前 |
| afterSendSingleMsg | AfterConfig | 发送单聊消息后 |
| beforeSendGroupMsg | BeforeConfig | 发送群聊消息前 |
| afterSendGroupMsg | AfterConfig | 发送群聊消息后 |
| beforeMsgModify | BeforeConfig | 修改消息前(可用于消息过滤) |
| afterMsgSaveDB | AfterConfig | 消息保存到数据库后 |
| afterRevokeMsg | AfterConfig | 撤回消息后 |
| afterGroupMsgRevoke | AfterConfig | 撤回群消息后 |
| afterGroupMsgRead | AfterConfig | 群消息已读后 |
| afterSingleMsgRead | AfterConfig | 单聊消息已读后 |
### 用户相关
| 事件名称 | 类型 | 说明 |
|---------|------|------|
| beforeUserRegister | BeforeConfig | 用户注册前 |
| afterUserRegister | AfterConfig | 用户注册后 |
| beforeUpdateUserInfo | BeforeConfig | 更新用户信息前 |
| afterUpdateUserInfo | AfterConfig | 更新用户信息后 |
| beforeUpdateUserInfoEx | BeforeConfig | 更新用户扩展信息前 |
| afterUpdateUserInfoEx | AfterConfig | 更新用户扩展信息后 |
| afterUserOnline | AfterConfig | 用户上线后 |
| afterUserOffline | AfterConfig | 用户下线后 |
| afterUserKickOff | AfterConfig | 用户被踢下线后 |
### 群组相关
| 事件名称 | 类型 | 说明 |
|---------|------|------|
| beforeCreateGroup | BeforeConfig | 创建群组前 |
| afterCreateGroup | AfterConfig | 创建群组后 |
| beforeSetGroupInfo | BeforeConfig | 设置群组信息前 |
| afterSetGroupInfo | AfterConfig | 设置群组信息后 |
| beforeSetGroupInfoEx | BeforeConfig | 设置群组扩展信息前 |
| afterSetGroupInfoEx | AfterConfig | 设置群组扩展信息后 |
| beforeMemberJoinGroup | BeforeConfig | 成员加入群组前 |
| afterJoinGroup | AfterConfig | 成员加入群组后 |
| beforeApplyJoinGroup | BeforeConfig | 申请加入群组前 |
| beforeInviteUserToGroup | BeforeConfig | 邀请用户加入群组前 |
| afterQuitGroup | AfterConfig | 退出群组后 |
| afterKickGroupMember | AfterConfig | 踢出群成员后 |
| afterDismissGroup | AfterConfig | 解散群组后 |
| afterTransferGroupOwner | AfterConfig | 转移群主后 |
| beforeSetGroupMemberInfo | BeforeConfig | 设置群成员信息前 |
| afterSetGroupMemberInfo | AfterConfig | 设置群成员信息后 |
### 好友相关
| 事件名称 | 类型 | 说明 |
|---------|------|------|
| beforeAddFriend | BeforeConfig | 添加好友前 |
| afterAddFriend | AfterConfig | 添加好友后 |
| beforeAddFriendAgree | BeforeConfig | 同意好友申请前 |
| afterAddFriendAgree | AfterConfig | 同意好友申请后 |
| afterDeleteFriend | AfterConfig | 删除好友后 |
| beforeSetFriendRemark | BeforeConfig | 设置好友备注前 |
| afterSetFriendRemark | AfterConfig | 设置好友备注后 |
| beforeImportFriends | BeforeConfig | 导入好友前 |
| afterImportFriends | AfterConfig | 导入好友后 |
| beforeAddBlack | BeforeConfig | 加入黑名单前 |
| afterRemoveBlack | AfterConfig | 移除黑名单后 |
### 推送相关
| 事件名称 | 类型 | 说明 |
|---------|------|------|
| beforeOfflinePush | BeforeConfig | 离线推送前 |
| beforeOnlinePush | BeforeConfig | 在线推送前 |
| beforeGroupOnlinePush | BeforeConfig | 群组在线推送前 |
### 会话相关
| 事件名称 | 类型 | 说明 |
|---------|------|------|
| beforeCreateSingleChatConversations | BeforeConfig | 创建单聊会话前 |
| afterCreateSingleChatConversations | AfterConfig | 创建单聊会话后 |
| beforeCreateGroupChatConversations | BeforeConfig | 创建群聊会话前 |
| afterCreateGroupChatConversations | AfterConfig | 创建群聊会话后 |
## JSON 配置示例
### 完整配置示例
```json
{
"url": "http://your-webhook-server:8080/callback",
"beforeSendSingleMsg": {
"enable": true,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"afterSendSingleMsg": {
"enable": true,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"beforeSendGroupMsg": {
"enable": true,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"afterSendGroupMsg": {
"enable": true,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"beforeMsgModify": {
"enable": true,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"afterMsgSaveDB": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"afterUserOnline": {
"enable": true,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"afterUserOffline": {
"enable": true,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"afterUserKickOff": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"beforeOfflinePush": {
"enable": false,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"beforeOnlinePush": {
"enable": false,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"beforeGroupOnlinePush": {
"enable": false,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"beforeAddFriend": {
"enable": false,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"beforeUpdateUserInfo": {
"enable": false,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"afterUpdateUserInfo": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"beforeCreateGroup": {
"enable": false,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"afterCreateGroup": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"beforeMemberJoinGroup": {
"enable": false,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"beforeSetGroupMemberInfo": {
"enable": false,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"afterSetGroupMemberInfo": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"afterQuitGroup": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"afterKickGroupMember": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"afterDismissGroup": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"beforeApplyJoinGroup": {
"enable": false,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"afterGroupMsgRead": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"afterSingleMsgRead": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"beforeUserRegister": {
"enable": false,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"afterUserRegister": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"afterTransferGroupOwner": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"beforeSetFriendRemark": {
"enable": false,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"afterSetFriendRemark": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"afterGroupMsgRevoke": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"afterJoinGroup": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"beforeInviteUserToGroup": {
"enable": false,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"afterSetGroupInfo": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"beforeSetGroupInfo": {
"enable": false,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"afterSetGroupInfoEx": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"beforeSetGroupInfoEx": {
"enable": false,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"afterRevokeMsg": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"beforeAddBlack": {
"enable": false,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"afterAddFriend": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"beforeAddFriendAgree": {
"enable": false,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"afterAddFriendAgree": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"afterDeleteFriend": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"beforeImportFriends": {
"enable": false,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"afterImportFriends": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"afterRemoveBlack": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"beforeCreateSingleChatConversations": {
"enable": false,
"timeout": 5,
"failedContinue": false,
"deniedTypes": []
},
"afterCreateSingleChatConversations": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"beforeCreateGroupChatConversations": {
"enable": false,
"timeout": 5,
"failedContinue": false,
"deniedTypes": []
},
"afterCreateGroupChatConversations": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"beforeUpdateUserInfoEx": {
"enable": false,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"afterUpdateUserInfoEx": {
"enable": false,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
}
}
```
### 最小配置示例(仅启用消息回调)
```json
{
"url": "http://your-webhook-server:8080/callback",
"beforeSendSingleMsg": {
"enable": true,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"afterSendSingleMsg": {
"enable": true,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
},
"beforeSendGroupMsg": {
"enable": true,
"timeout": 5,
"failedContinue": true,
"deniedTypes": []
},
"afterSendGroupMsg": {
"enable": true,
"timeout": 5,
"attentionIds": [],
"deniedTypes": []
}
}
```
### 过滤特定消息类型示例
```json
{
"url": "http://your-webhook-server:8080/callback",
"beforeSendSingleMsg": {
"enable": true,
"timeout": 5,
"failedContinue": true,
"deniedTypes": [101, 102]
}
}
```
### 仅关注特定用户/群组示例
```json
{
"url": "http://your-webhook-server:8080/callback",
"afterSendSingleMsg": {
"enable": true,
"timeout": 5,
"attentionIds": ["user001", "user002"],
"deniedTypes": []
},
"afterSendGroupMsg": {
"enable": true,
"timeout": 5,
"attentionIds": ["group001", "group002"],
"deniedTypes": []
}
}
```
## 配置说明
### URL 配置
- **格式**: `http://host:port/path``https://host:port/path`
- **示例**:
- `http://127.0.0.1:8080/callback`
- `http://webhook.example.com:8080/callback`
- `https://webhook.example.com/callback`
### timeout超时时间
- **单位**: 秒
- **建议值**: 5-30 秒
- **说明**: 如果回调服务器在超时时间内没有响应,将根据 `failedContinue` 决定是否继续执行
### failedContinue失败是否继续
- **仅适用于**: BeforeConfig 类型的事件
- **true**: 回调失败时继续执行原操作
- **false**: 回调失败时停止执行原操作
### deniedTypes拒绝的消息类型
- **类型**: 整数数组
- **说明**: 列表中的消息类型不会触发回调
- **空数组**: 表示所有消息类型都触发回调
- **常用消息类型**:
- 101: 文本消息
- 102: 图片消息
- 103: 语音消息
- 104: 视频消息
- 105: 文件消息
### attentionIds关注ID列表
- **仅适用于**: AfterConfig 类型的事件
- **类型**: 字符串数组
- **说明**:
- 对于消息回调仅对指定的用户ID或群组ID触发回调
- 空数组表示所有用户/群组都触发回调
- **示例**: `["user001", "user002", "group001"]`
## 配置存储
### 数据库存储
配置可以存储在 MongoDB 的 `system_configs` 表中:
- **表名**: `system_configs`
- **配置键**: `webhook_config`
- **值类型**: JSON (ValueType = 4)
### 配置优先级
1. **数据库配置**(如果存在且有效)
2. **文件配置**`config/webhooks.yml`
如果数据库中没有配置或配置无效(为空、禁用、格式错误等),将自动使用文件配置。
## 配置刷新
- **刷新间隔**: 30 秒调试模式生产环境建议改为1小时
- **自动刷新**: 服务启动后自动开始定时刷新
- **立即生效**: 配置更新后最多30秒内自动生效无需重启服务
## 注意事项
1. **URL 必须有效**: 配置的 URL 必须可访问,否则回调会失败
2. **超时设置**: 建议根据回调服务器的响应时间合理设置超时时间
3. **失败处理**: BeforeConfig 类型的回调建议设置 `failedContinue: true`,避免因回调失败影响正常业务
4. **性能考虑**: 启用过多回调可能影响系统性能,建议按需启用
5. **安全性**: 确保回调服务器有适当的认证机制