模式 | 说明 | 配置值 |
云端审核 | 使用腾讯云 Chat 内置的云端审核引擎,自动拦截违规消息。 | cloud |
用户自有审核 | 适用于直播间实时互动审核场景。通过消息发送前置拦截机制,将用户消息提交至人工审核流程,仅审核通过的消息才允许进入直播间展示。 | custom |

cd packages/custom-moderation-server# 安装依赖npm install# 复制配置文件cp config/example.env config/.env# 启动(端口 9001)npm start
CUSTOM_MODERATION_BASE_URL。packages/server/config/.env:# 切换到自定义审核模式MODERATION_MODE=custom# 用户审核服务器地址(Demo 服务器默认 http://localhost:9001)CUSTOM_MODERATION_BASE_URL=http://localhost:9001# API Key(可选,Demo 服务器默认未配置,留空即可)# CUSTOM_MODERATION_API_KEY=your_api_key
http://your-domain:9001/im-callback),点击确定。# 模拟 IM 回调(消息被拦截)curl -X POST http://localhost:9001/im-callback \\-H "Content-Type: application/json" \\-d '{"CallbackCommand": "Group.CallbackBeforeSendMsg","GroupId": "test_live_room","From_Account": "user_001","MsgBody": [{"MsgType": "TIMTextElem", "MsgContent": {"Text": "您好"}}]}'# 查看审核列表curl -X POST http://localhost:9001/moderation/list \\-H "Content-Type: application/json" \\-d '{"Receiver": "test_live_room", "PageNo": 1, "PageSize": 10}'
{CUSTOM_MODERATION_BASE_URL} 为前缀,通过 env 配置。CUSTOM_MODERATION_API_KEY,LiveKit Manager 在所有请求中携带:X-Api-Key: {CUSTOM_MODERATION_API_KEY}
GET /moderation/toggle{"ActionStatus": "OK","ErrorCode": 0,"Enabled": true}
POST /moderation/toggle{"Enabled": true}
{"ActionStatus": "OK","ErrorCode": 0,"Enabled": true}
Enabled: true 表示开启全员审核(所有消息被拦截),false 表示关闭(消息正常投递)。POST /moderation/list{"Receiver": "live_room_id","PageNo": 1,"PageSize": 20}
字段 | 类型 | 必填 | 说明 |
Receiver | string | 是 | 直播间 ID(对应 GroupId)。 |
PageNo | number | 是 | 页码(从 1 开始)。 |
PageSize | number | 是 | 每页条数(最大 100)。 |
DescribeCloudAuditRecordDetailV2.Data 数组格式):{"TotalCount": 100,"RequestId": "req_1234567890","Data": [{"ContentId": "msg_001","From_Account": "user_alice","Content": "被拦截的消息内容","Time": "2026-06-30 14:30:00.000"}]}
字段 | 类型 | 必填 | 说明 |
TotalCount | number | 是 | 总记录数(用于分页计算)。 |
RequestId | string | 否 | 请求 ID。 |
Data[].ContentId | string | 是 | 消息唯一 ID(用于后续删除/放行)。 |
Data[].From_Account | string | 是 | 发送者 Chat 账号。 |
Data[].Content | string | 是 | 消息文本内容。 |
Data[].Time | string | 是 | 消息时间(格式 YYYY-MM-DD HH:mm:ss.SSS)。 |
Label(审核标签)字段。前端对应列会被隐藏。POST /moderation/delete{"ContentIds": ["msg_001", "msg_002"]}
{"ActionStatus": "OK","ErrorCode": 0,"DeletedCount": 2,"RequestId": "req_1234567890"}
字段 | 类型 | 说明 |
DeletedCount | number | 实际删除的记录数。 |
{"ActionStatus": "FAIL","ErrorCode": 500,"ErrorInfo": "错误描述"}
{"CallbackCommand": "Group.CallbackBeforeSendMsg","GroupId": "live_room_123","Type": "Public","From_Account": "user_456","Operator_Account": "","Random": 123456,"MsgBody": [{"MsgType": "TIMTextElem","MsgContent": {"Text": "用户发送的消息内容"}}]}
字段 | 说明 |
GroupId | 直播间 ID。 |
From_Account | 发送者 Chat 账号。 |
MsgBody[].MsgContent.Text | 文本消息内容。 |
{"ActionStatus": "OK","ErrorCode": 1,"ErrorInfo": "Message intercepted for moderation"}
{"ActionStatus": "OK","ErrorCode": 0,"ErrorInfo": ""}
ErrorCode 为 0 表示放行,非 0 表示拦截。回调超时默认放行(保障消息可达性)。send_group_msg(带 NoMsgCheck 跳过再审)以原始用户身份重发消息。POST /moderation/delete 删除对应记录。POST /moderation/delete 删除对应记录。功能 | cloud 模式 | custom 模式 |
审核数据来源 | 腾讯云 DescribeCloudAuditRecordDetailV2 | 用户自有数据库 |
审核列表字段 | id / 用户 ID / 内容 / 识别类型 / 时间 | id / 用户 ID / 内容 / 时间 |
操作按钮 | 放行 / 删除 / 更多(纠错白名单) | 放行 / 删除 |
全员审核开关 | 无 | 有 |
删除实现 | IndexedDB 前端标记 | 用户服务器 DELETE |
放行实现 | send_group_msg + IndexedDB 标记 | send_group_msg + 用户服务器 DELETE |
纠错白名单 | 支持 | 不支持 |
MODERATION_MODE 改回 cloud 并重启服务即可。切换不丢失数据——用户服务器的数据仍然保留。// callback.jsconst db = require('./db'); // 数据库模块,提供 insertMessage 等 APIconst blockedWords = ['敏感词1', '敏感词2'];// 从 MsgBody 提取文本内容(假设只处理第一条文本消息)const content = req.body.MsgBody[0]?.MsgContent?.Text || '';if (content && blockedWords.some(w => content.includes(w))) {// 拦截,并将消息存入数据库db.insertMessage({content_id: `msg_${Date.now()}`,group_id: req.body.GroupId,from_account: req.body.From_Account,content: content,msg_body: JSON.stringify(req.body.MsgBody)});res.json({ ActionStatus: 'OK', ErrorCode: 1 });} else {// 放行res.json({ ActionStatus: 'OK', ErrorCode: 0 });}
文档反馈