复制项目
This commit is contained in:
587
docs/webhook-config.md
Normal file
587
docs/webhook-config.md
Normal file
@@ -0,0 +1,587 @@
|
||||
# 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. **安全性**: 确保回调服务器有适当的认证机制
|
||||
|
||||
Reference in New Issue
Block a user