# 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. **安全性**: 确保回调服务器有适当的认证机制