# 易盾内容安全 API 调用文档 ## 📋 目录 - [概述](#概述) - [配置说明](#配置说明) - [模式切换](#模式切换) - [API接口列表](#api接口列表) - [文本检测](#1-文本检测) - [图片检测](#2-图片检测) - [视频检测](#3-视频检测) - [回调与轮询接口](#回调与轮询接口) - [错误码说明](#错误码说明) - [常见问题](#常见问题) --- ## 概述 本项目集成了网易易盾内容安全SDK,提供文本、图片、视频的内容安全检测服务。 ### 产品凭证 | 检测类型 | SecretID | SecretKey | BusinessID | |---------|----------|-----------|------------| | **音视频检测** | f58a38341ca6227014df7c3bf0e6f16f | 526aa631ba5d518aedeb70b5a3b67371 | 需从易盾控制台获取 | | **图片检测** | 9a82f90bfec61eb40d1c95605b894817 | f73a78954417a3713c36ec2d14eb2b5f | 需从易盾控制台获取 | | **文本检测** | 待配置 | 待配置 | 待配置 | ### 服务地址 ``` http://localhost:3001 ``` --- ## 配置说明 配置文件位置:`config.yml` ```yaml yidun: # 回调模式开关: true=使用回调模式(需要公网地址), false=使用轮询模式 callback_mode: false # 视频检测配置 video: secret_id: "f58a38341ca6227014df7c3bf0e6f16f" secret_key: "526aa631ba5d518aedeb70b5a3b67371" callback_url: "http://your-domain.com:3001/yidun/callback/receiveVideo" # 图片检测配置 image: business_id: "your_image_business_id" secret_id: "9a82f90bfec61eb40d1c95605b894817" secret_key: "f73a78954417a3713c36ec2d14eb2b5f" callback_url: "http://your-domain.com:3001/yidun/callback/receiveImage" # 文本检测配置 text: business_id: "YOUR_TEXT_BUSINESS_ID" secret_id: "YOUR_TEXT_SECRET_ID" secret_key: "YOUR_TEXT_SECRET_KEY" # 内容送检定时任务配置 content_check: batch_size: 10 # 每批处理数量 image_enabled: true # 是否启用图片检测 video_enabled: true # 是否启用视频检测 interval_seconds: 30 # 定时任务执行间隔(秒) ``` --- ## 模式切换 ### 轮询模式(无公网地址) 适用于开发测试环境或没有公网地址的场景。 ```yaml yidun: callback_mode: false # 使用轮询模式 ``` **工作流程**: ``` 定时任务 → 提交检测 → 保存taskId → 手动轮询 → 获取结果 → 更新状态 ``` ### 回调模式(有公网地址) 适用于生产环境,需要配置公网可访问的回调地址。 ```yaml yidun: callback_mode: true # 使用回调模式 image: callback_url: "http://your-public-domain.com:3001/yidun/callback/receiveImage" video: callback_url: "http://your-public-domain.com:3001/yidun/callback/receiveVideo" ``` **工作流程**: ``` 定时任务 → 提交检测 → 易盾检测完成 → 易盾推送结果 → 自动更新状态 ``` --- ## API接口列表 ### 送检接口 | 接口名称 | 请求方法 | 路径 | 说明 | |---------|---------|------|------| | 文本检测提交 | POST | `/yidun/detect-text` | 提交文本进行异步检测 | | 图片检测提交 | POST | `/yidun/detect-image` | 提交图片进行异步检测 | | 视频检测提交 | POST | `/yidun/detect-video` | 提交视频进行检测 | ### 回调模式接口 | 接口名称 | 请求方法 | 路径 | 说明 | |---------|---------|------|------| | 接收图片回调 | POST | `/yidun/callback/receiveImage` | 接收易盾图片检测结果推送 | | 接收视频回调 | POST | `/yidun/callback/receiveVideo` | 接收易盾视频检测结果推送 | ### 轮询模式接口 | 接口名称 | 请求方法 | 路径 | 说明 | |---------|---------|------|------| | 轮询所有结果 | POST | `/yidun/callback/poll` | 轮询所有待处理结果(图片+视频) | | 轮询图片结果 | POST | `/yidun/callback/pollImage` | 仅轮询图片待处理结果 | | 轮询视频结果 | POST | `/yidun/callback/pollVideo` | 仅轮询视频待处理结果 | | 查询单个结果 | POST | `/yidun/callback/pollTask` | 根据taskId查询单个结果 | | 获取待处理数量 | GET | `/yidun/callback/pendingCount` | 查看待处理结果数量 | **注意**:检测结果是异步的,提交接口只返回 `task_id`,需要通过回调或轮询获取结果。 --- ## 1. 文本检测 ### 提交文本检测任务 **接口地址**: `POST /yidun/detect-text` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | data_id | string | 是 | 数据唯一标识 | | content | string | 是 | 待检测的文本内容 | | ip | string | 否 | 用户IP地址 | | token | string | 否 | 用户token(反作弊) | **请求示例**: ```bash curl -X POST http://localhost:3002/yidun/detect-text \ -H "Content-Type: application/json" \ -d '{ "data_id": "text-001", "content": "这是一段需要检测的文本内容", "ip": "192.168.1.100" }' ``` **响应示例**: ```json { "code": 0, "message": "", "data": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6" } ``` **响应说明**: | 字段名 | 类型 | 说明 | |--------|------|------| | data | string | 任务ID (task_id),用于后续查询检测结果 | --- ## 2. 图片检测 ### 2.1 提交图片检测任务 **接口地址**: `POST /yidun/detect-image` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | data_id | string | 是 | 数据唯一标识 | | image_url | string | 是 | 图片URL地址 | | callback_url | string | 否 | 回调地址 | **请求示例**: ```bash curl -X POST http://localhost:3002/yidun/detect-image \ -H "Content-Type: application/json" \ -d '{ "data_id": "img-001", "image_url": "https://example.com/image.jpg" }' ``` **响应示例**: ```json { "code": 0, "message": "", "data": { "taskId": "b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7", "name": "img-001", "dataId": "img-001", "dealingCount": 0 } } ``` **响应说明**: | 字段名 | 类型 | 说明 | |--------|------|------| | taskId | string | 任务ID,用于后续查询检测结果 | | name | string | 图片唯一标识 | | dataId | string | 客户图片唯一标识 | | dealingCount | int64 | 缓冲池排队待处理数据量 | ### 2.2 查询图片检测结果(轮询模式) **接口地址**: `POST /yidun/GetImageResult` **SDK调用信息**: - SDK方法: `ImageClient.ImageCallback(request)` - 请求地址: `http://as.dun.163.com/v5/image/callback/results` - 请求参数: `yidunRequestId` (taskId) **请求示例**: ```bash curl -X POST "http://localhost:3002/yidun/GetImageResult" \ -H "Content-Type: application/json" \ -d '{"taskId": "b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7"}' ``` **响应示例**: ```json { "code": 0, "message": "", "data": { "taskId": "b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7", "status": 2, "suggestion": 0, "label": 100, "resultType": 2, "dataId": "img-001", "name": "img-001", "censorTime": 1629426386079, "url": "https://example.com/image.jpg", "antispam": { "taskId": "b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7", "name": "img-001", "dataId": "img-001", "status": 2, "suggestion": 0, "label": 100, "resultType": 2, "censorTime": 1629426386079, "censorSource": 0, "censorRound": 1, "labels": [ { "label": 400, "level": 2, "rate": 1.0 } ], "censorLabels": [ { "code": "审核标签编码", "customCode": "自定义标签编码", "name": "审核标签名称", "desc": "风景" } ], "remark": "人审备注信息" }, "ocr": { ... }, "face": { ... }, "quality": { ... }, "logo": { ... }, "discern": { ... }, "ad": { ... }, "userRisk": { ... }, "anticheat": { ... }, "riskControl": { ... }, "aigc": { ... }, "llmCheckInfo": [ ... ] } } ``` **antispam 字段完整说明**: | 字段名 | 类型 | 说明 | |--------|------|------| | taskId | string | 任务ID | | name | string | 图片名称 | | dataId | string | 客户数据ID | | status | int | 检测状态:0=未开始,1=检测中,2=检测成功,3=检测失败 | | suggestion | int | 处置建议:0=通过,1=嫌疑,2=不通过 | | label | int | 一级分类 | | secondLabel | string | 二级分类 | | thirdLabel | string | 三级分类 | | riskDescription | string | 风险描述 | | resultType | int | 结果类型:1=机器结果,2=人审结果 | | censorTime | int64 | 审核完成时间(毫秒时间戳) | | censorSource | int | 审核来源 | | censorRound | int | 审核轮数 | | censorLabels | array | 审核标签数组 | | remark | string | 审核备注 | | overAllMarkDesc | string | 整体审核备注 | | detailMarks | array | 细节标注 | | labels | array | 分类标签详情 | | url | string | 图片URL | | imgMd5 | string | 图片MD5 | | frameSize | int | 分帧数 | | customLabels | array | 客户自定义标签 | | censorExtension | object | 人审拓展字段 | | strategyVersions | array | 策略版本 | | hitType | int | 命中策略类型 | | strategyType | int | 策略类型:1=公有策略,2=私有策略 | | hitResult | string | 命中结果 | | hitSource | int | 特征添加来源 | | hidden | bool | 是否有隐藏文件 | | hiddenFormat | string | 隐藏文件格式 | | publicOpinionInfo | string | 舆情信息 | **labels 数组结构**: | 字段名 | 类型 | 说明 | |--------|------|------| | label | int | 标签类型 | | level | int | 判断结果:0=正常,1=不确定,2=确定 | | rate | float | 置信度 | | subLabels | array | 二级分类详情 | | explain | string | LLM解释说明 | | isLlmCheck | bool | 是否LLM检测命中 | **censorLabels 数组结构**: | 字段名 | 类型 | 说明 | |--------|------|------| | code | string | 审核标签编码 | | customCode | string | 自定义标签编码 | | name | string | 审核标签名称 | | desc | string | 审核标签描述 | | parentLabelId | string | 父标签ID | | depth | int | 标签深度 | ### 2.3 接收图片检测回调(推送模式) **接口地址**: `POST /yidun/receive-image-callback` **易盾回调配置**: - HTTP URL: 回调地址 `callbackUrl` - HTTP Method: POST - Content-Type: application/x-www-form-urlencoded **请求参数** (form-data): | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | secretId | string | 是 | 产品密钥ID | | businessId | string | 是 | 业务ID | | signature | string | 是 | 请求签名 | | callbackData | string | 是 | 回调数据(JSON字符串) | **请求体示例**: ``` callbackData={"antispam":{...}}&signature=xxx&secretId=xxx&businessId=xxx ``` **回调数据格式**: ```json { "antispam": { "taskId": "a2e53718f9c348d09206e4671304ca7c", "suggestion": 2, "remark": "人审备注信息,填写才会返回", "dataId": "dataId", "name": "name", "labels": [ { "label": 400, "level": 2, "rate": 1.0 }, { "label": 500, "level": 0, "rate": 1.0 } ], "censorLabels": [ { "code": "审核标签编码", "customCode": "自定义标签编码", "name": "审核标签名称", "desc": "风景" } ], "resultType": 2, "censorTime": 1622036595467, "censorSource": 0, "censorRound": 1 } } ``` **Suggestion值说明**: | 值 | 含义 | |----|------| | 0 | 通过 | | 1 | 嫌疑,需人工审核 | | 2 | 不通过 | **Status值说明**: | 值 | 含义 | |----|------| | 0 | 未开始 | | 1 | 检测中 | | 2 | 检测成功 | | 3 | 检测失败 | --- ## 3. 视频检测 ### 提交视频检测任务 **接口地址**: `POST /yidun/detect-video` **请求参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | data_id | string | 是 | 数据唯一标识 | | video_url | string | 是 | 视频URL地址 | | callback_url | string | 否 | 回调地址 | **请求示例**: ```bash curl -X POST http://localhost:3002/yidun/detect-video \ -H "Content-Type: application/json" \ -d '{ "data_id": "video-001", "video_url": "https://example.com/video.mp4" }' ``` **响应示例**: ```json { "code": 0, "message": "", "data": { "taskId": "c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8", "dataId": "video-001", "dealingCount": 0 } } ``` **响应说明**: | 字段名 | 类型 | 说明 | |--------|------|------| | taskId | string | 任务ID,用于后续查询检测结果 | | dataId | string | 调用检测时传递的数据ID | | dealingCount | int64 | 缓冲池排队待处理数据量 | **注意**: 视频检测是异步的,检测时间取决于视频长度(几分钟到几十分钟)。建议配置回调地址接收结果。 ### 3.2 查询视频检测结果(轮询模式) **接口地址**: `POST /yidun/GetVideoResult` **SDK调用信息**: - SDK方法: `VideoClient.Callback(request)` - 请求地址: `http://as.dun.163.com/v2/videosolution/callback/results` - 请求参数: `yidunRequestId` (taskId) **请求示例**: ```bash curl -X POST "http://localhost:3002/yidun/GetVideoResult" \ -H "Content-Type: application/json" \ -d '{"taskId": "c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8"}' ``` **响应示例**: ```json { "code": 0, "message": "", "data": { "taskId": "18xrunm6fr35t49nnv506ukg02009q66", "status": 2, "suggestion": 2, "label": 100, "resultType": 1, "dataId": "video-001", "censorTime": 1633759853762, "duration": 71339, "antispam": { "taskId": "18xrunm6fr35t49nnv506ukg02009q66", "suggestion": 2, "status": 2, "resultType": 1, "censorSource": 2, "checkTime": 1633759861164, "censorTime": 1633759853762, "duration": 71339, "censorLabels": [ { "code": "101", "desc": "自定义标签", "customCode": "68684" } ], "evidences": { "images": [...], "text": {...}, "audio": {...}, "video": {...} } }, "language": { ... }, "voice": { ... }, "asr": { ... }, "ocr": { ... }, "discern": { ... }, "logo": { ... }, "face": { ... }, "aigc": { ... }, "quality": { ... } } } ``` **antispam 字段完整说明**: | 字段名 | 类型 | 说明 | |--------|------|------| | taskId | string | 任务ID | | dataId | string | 客户数据ID | | callback | string | 回调参数 | | suggestion | int | 处置建议:0=通过,1=嫌疑,2=不通过 | | status | int | 检测状态:0=未开始,1=检测中,2=检测成功,3=检测失败 | | resultType | int | 结果类型:1=机器结果,2=人审结果 | | censorRound | int | 人审轮次 | | censor | string | 人审操作人 | | censorSource | int | 审核来源:0=易盾人审,1=客户人审,2=易盾机审 | | checkTime | int64 | 机器检测结束时间 | | censorTime | int64 | 人工审核完成时间 | | duration | int64 | 音视频时长(毫秒) | | durationMs | int64 | 音频时长(毫秒) | | label | int | 一级垃圾类型 | | secondLabel | string | 二级垃圾类型 | | thirdLabel | string | 三级垃圾类型 | | riskDescription | string | 风险描述 | | picCount | int64 | 截图数量 | | censorLabels | array | 审核标签数组 | | censorExtension | object | 质检扩展结果 | | evidences | object | 机器检测证据信息 | | solutionExtra | object | 额外信息 | | reviewEvidences | object | 人审证据信息 | **evidences 对象说明**: | 字段名 | 类型 | 说明 | |--------|------|------| | text | object | 文本证据(标题、简介等) | | images | array | 图片证据(封面、截图中的图片) | | audio | object | 音频证据(人声内容) | | video | object | 视频证据(视频画面) | **CensorSource值说明**: | 值 | 含义 | |----|------| | 0 | 易盾人审 | | 1 | 客户人审 | | 2 | 易盾机审 | ### 3.3 接收视频检测回调(推送模式) **接口地址**: `POST /yidun/receive-video-callback` **易盾回调配置**: - HTTP URL: 回调地址 `callbackUrl` - HTTP Method: POST - Content-Type: application/x-www-form-urlencoded **请求参数** (form-data): | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | secretId | string | 是 | 产品密钥ID | | signature | string | 是 | 请求签名 | | callbackData | string | 是 | 回调数据(JSON字符串) | **请求体示例**: ``` callbackData={"antispam":{...}}&signature=xxx&secretId=xxx ``` **回调数据格式**: ```json { "antispam": { "taskId": "18xrunm6fr35t49nnv506ukg02009q66", "suggestion": 2, "status": 2, "resultType": 1, "censorSource": 2, "checkTime": 1633759861164, "censorTime": 1633759853762, "duration": 71339, "censorLabels": [ { "code": "101", "desc": "自定义标签", "customCode": "68684" } ], "evidences": { "images": [ { "censorType": 0, "labels": [ { "label": 100, "level": 2, "rate": 0.9999, "subLabels": [ { "details": { "hitInfos": [ { "group": "色情部位分组", "value": "女胸" } ] }, "rate": 1, "subLabel": 10002 } ] } ], "name": "gpqis0e92czvfliemjpa3neg02009q6a", "resultType": 1, "status": 2, "suggestion": 2, "taskId": "0b2dd0e561a8457fbfcf7d79378eec37" } ], "text": { "taskId": "44i3effo1j5w5for9l8xtdjg02009q6a", "suggestion": 2, "resultType": 1, "censorType": 0, "isRelatedHit": false, "labels": [ { "label": 200, "level": 2, "subLabels": [ { "subLabel": "200009", "details": { "hitInfos": [ { "value": "加我", "positions": [ { "fieldName": "content", "startPos": 5, "endPos": 8 } ] } ] } } ] } ] }, "audio": { "taskId": "18xrunm6fr35t49nnv506ukg02009q66", "dataId": "", "status": 2, "suggestion": 2, "label": 100, "resultType": 1, "callback": "", "censorSource": 2, "censorTime": 1633759861065, "segments": [ { "startTime": 0, "endTime": 6, "content": "第一次用这个软件上了半天,全是长得漂亮呢?", "type": 0, "labels": [ { "label": 100, "level": 2, "subLabels": [ { "subLabel": "100001", "details": { "hitInfos": [ { "value": "120", "startTime": 1684201, "endTime": 1684201 } ], "keywords": [ { "word": "自定义敏感词" } ], "libInfos": [ { "listType": 1, "entity": "127.0.0.1" } ] } } ] } ] } ], "duration": 71 }, "video": { "taskId": "18xrunm6fr35t49nnv506ukg02009q66", "dataId": "", "status": 2, "suggestion": 2, "resultType": 1, "censorSource": 2, "censorTime": 1633759858920, "pictures": [ { "type": 1, "url": "https://xxx.nosdn.127.net/xxx.jpg", "startTime": 5000, "endTime": 5000, "labels": [ { "label": 100, "level": 2, "rate": 0.95157, "subLabels": [ { "subLabel": 10007, "rate": 0.926, "details": { "hitInfos": [ { "value": "卡通色情", "group": "色情部位分组" } ] } } ] } ], "censorSource": 2, "frontPics": [ { "url": "https://xxx.nosdn.127.net/xxx_0_0.jpg" } ], "backPics": [ { "url": "https://xxx.nosdn.127.net/xxx_2_10000.jpg" } ] } ] } } } } ``` **Suggestion值说明**: | 值 | 含义 | |----|------| | 0 | 通过 | | 1 | 嫌疑,需人工审核 | | 2 | 不通过 | **Status值说明**: | 值 | 含义 | |----|------| | 0 | 未开始 | | 1 | 检测中 | | 2 | 检测成功 | | 3 | 检测失败 | **images/images.labels 结构说明**: | 字段名 | 类型 | 说明 | |--------|------|------| | label | int | 标签类型 | | level | int | 级别:0=正常,1=嫌疑,2=确定违规 | | rate | float | 置信度 | | subLabels | array | 二级分类详情 | | subLabels.details.hitInfos | array | 命中信息 | | subLabels.details.hitInfos.group | string | 分组名称 | | subLabels.details.hitInfos.value | string | 命中值 | **audio.segments 结构说明**: | 字段名 | 类型 | 说明 | |--------|------|------| | startTime | int | 开始时间(秒) | | endTime | int | 结束时间(秒) | | content | string | 语音识别原文 | | type | int | 片段类型:0=语音识别,1=声纹检测 | | labels | array | 分类标签 | | labels.details.keywords | array | 自定义敏感词 | | labels.details.libInfos | array | 自定义名单 | | labels.details.hitInfos | array | 命中内容 | **video.pictures 结构说明**: | 字段名 | 类型 | 说明 | |--------|------|------| | type | int | 截图类型 | | url | string | 截图URL | | startTime | int64 | 开始时间(毫秒) | | endTime | int64 | 结束时间(毫秒) | | labels | array | 分类标签 | | frontPics | array | 关联前帧图片 | | backPics | array | 关联后帧图片 | --- ## 回调与轮询接口 ### 轮询模式接口详解 #### 轮询所有待处理结果 ``` POST /yidun/callback/poll ``` **说明**:轮询所有图片和视频的待处理检测结果 **响应示例**: ```json { "code": 200, "msg": "轮询完成,成功处理 5 条,失败 1 条", "data": { "success_count": 5, "fail_count": 1, "pending_count": 10 } } ``` #### 获取待处理数量 ``` GET /yidun/callback/pendingCount ``` **响应示例**: ```json { "code": 200, "data": { "pending_count": 15, "description": "待查询结果的日志数量(状态为pending且有taskID)" } } ``` #### 查询单个结果 ``` POST /yidun/callback/pollTask?taskId=xxx&type=image ``` **参数说明**: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | taskId | string | 是 | 易盾任务ID | | type | string | 否 | 类型:`image`/`video`,不填则自动识别 | **响应示例**: ```json { "code": 200, "msg": "查询并处理成功" } ``` --- ## 使用示例 ### 轮询模式使用流程 ```bash # 1. 查看待处理数量 curl http://localhost:3001/yidun/callback/pendingCount # 2. 执行轮询(所有) curl -X POST http://localhost:3001/yidun/callback/poll # 3. 或分别轮询 curl -X POST http://localhost:3001/yidun/callback/pollImage curl -X POST http://localhost:3001/yidun/callback/pollVideo # 4. 查询单个结果 curl -X POST "http://localhost:3001/yidun/callback/pollTask?taskId=abc123&type=image" ``` ### 配置定时轮询 ```bash # 每分钟轮询一次 */1 * * * * curl -X POST http://localhost:3001/yidun/callback/poll # 或更保守的频率(每5分钟) */5 * * * * curl -X POST http://localhost:3001/yidun/callback/poll ``` --- ## 状态说明 ### 检测状态转换 ``` ┌─────────────────────────────────────────────────────────────┐ │ 送检前 │ │ tencent_image/tencent_video: status = "pending" │ └─────────────────────────────────────────────────────────────┘ ↓ ↓ 定时任务/手动送检 ↓ ┌─────────────────────────────────────────────────────────────┐ │ 提交检测 │ │ material_verify_log: verify_status = "PENDING" │ │ material_verify_log: task_id = "易盾任务ID" │ │ tencent_xxx: status = "submitting" │ └─────────────────────────────────────────────────────────────┘ ↓ ↓ 等待检测完成 ↓ (回调模式)或(轮询查询) ↓ ┌─────────────────────────────────────────────────────────────┐ │ 检测完成 │ │ material_verify_log: verify_status = "VERIFIED" (通过) │ │ 或 "REJECTED" (不通过) │ │ 或 "PENDING" (嫌疑,需人工审核) │ │ tencent_xxx: status = "VERIFIED"/"REJECTED"/"PENDING" │ └─────────────────────────────────────────────────────────────┘ ``` ### 状态值说明 | 状态值 | 说明 | 触发条件 | |--------|------|----------| | `pending` / `PENDING` | 待检测 | 素材创建时 | | `submitting` | 送检中 | 提交至易盾检测 | | `VERIFIED` | 校验通过 | 易盾建议通过(suggestion=0)| | `REJECTED` | 校验不通过 | 易盾建议不通过(suggestion=2)或检测失败 | | `PENDING` (人审) | 嫌疑待审 | 易盾建议人工审核(suggestion=1)| ### 易盾处置建议对照 | suggestion值 | 说明 | 系统状态 | |-------------|------|----------| | 0 | 通过 | VERIFIED | | 1 | 嫌疑,需人工审核 | PENDING | | 2 | 不通过 | REJECTED | --- ## 常见问题 ### Q1: 轮询后待处理数量没有减少? **可能原因**: 1. 检测仍在进行中(易盾尚未返回结果) 2. 上次查询出错,状态已更新为 REJECTED **排查方法**: ```bash # 查看日志 grep "检测仍在进行中" resource/log/server/cid.log # 查看数据库状态 SELECT id, task_id, verify_status FROM material_verify_log WHERE task_id = 'xxx'; ``` ### Q2: 如何判断是图片还是视频? ```bash # 方法1:查询日志 SELECT id, material_type, task_id, verify_status FROM material_verify_log WHERE task_id = 'xxx'; # 方法2:调用接口指定类型 curl -X POST "http://localhost:3001/yidun/callback/pollTask?taskId=xxx&type=image" ``` ### Q3: 回调模式收不到回调? **排查步骤**: 1. 确认公网地址可访问:`curl http://your-domain.com:3001/yidun/callback/receiveImage` 2. 确认易盾控制台配置了正确的回调地址 3. 检查服务器防火墙/安全组是否开放端口 4. 查看日志确认请求是否到达:`grep "收到易盾" resource/log/server/cid.log` ### Q4: 状态不一致? 如果 `material_verify_log` 和 `tencent_image/video` 表状态不一致,检查: 1. 代码执行过程中是否有报错 2. 是否有并发更新导致覆盖 3. 日志表和原表更新是否在同一事务中 --- ## 错误码说明 | code | 说明 | |------|------| | 0 | 成功 | | 400 | 请求参数错误 | | 500 | 服务器内部错误 | **易盾API错误码**: | 错误码 | 说明 | |--------|------| | 200 | 成功 | | 401 | 认证失败(SecretID/SecretKey错误) | | 403 | 权限不足 | | 429 | 请求频率超限 | --- ## Go代码调用示例 ```go // 文本检测 func detectText() (string, error) { req := map[string]interface{}{ "data_id": "text-001", "content": "这是一段测试文本", } jsonData, _ := json.Marshal(req) resp, err := http.Post("http://localhost:3002/yidun/detect-text", "application/json", bytes.NewBuffer(jsonData)) // ... } // 图片检测 func detectImage() (string, error) { req := map[string]interface{}{ "data_id": "img-001", "image_url": "https://example.com/image.jpg", } jsonData, _ := json.Marshal(req) resp, err := http.Post("http://localhost:3002/yidun/detect-image", "application/json", bytes.NewBuffer(jsonData)) // ... } // 视频检测 func detectVideo() (string, error) { req := map[string]interface{}{ "data_id": "video-001", "video_url": "https://example.com/video.mp4", } jsonData, _ := json.Marshal(req) resp, err := http.Post("http://localhost:3002/yidun/detect-video", "application/json", bytes.NewBuffer(jsonData)) // ... } ``` --- **最后更新**: 2026-05-14