推送模式
2024.08.29 10:06:43
投诉举报解决方案的推送模式用于将异步检测结果或人工审核结果主动推送给客户,可以保证客户最快地获取到结果。客户需要按照以下规范实现接收结果的接口。推送模式与轮询模式互斥,只能选取一种模式进行结果获取。
接口说明
结果主动推送模式以数据为维度,将人工审核结果或者异步机器检测结果推送给客户,客户在调用检测接口时需要设置回调地址callbackUrl参数。客户方需要保证回调接收接口的可用性和稳定性,确保能正常接收推送过来的结果数据。
鉴权说明
客户接口可以通过业务开通时易盾分配的密钥信息字段进行接口鉴权,鉴权粒度是否要精确到业务级别,用户可以根据需要自行决定,请参见接口鉴权。
接入说明
- 协议说明:检测接口请求参数中指定了回调地址参数callbackUrl(即一个http(s)协议接口的URL)。主动推送接口需要支持http协议,支持POST方法,传输数据编码采用utf-8。
- 接口性能:推送结果接口默认超时时间为2s,为了保证顺利接收数据,客户需要保证接收接口的可用性和性能稳定。
- 失败重试:客户接口处理结果数据,并返回应答。如果客户接口请求异常,超时或收到的应答不符合规范,易盾会认为推送失败;我们将每隔10分钟推送一次,如果一直失败,持续一天后不再推送。
- 幂等性:结果推送时,同样的结果可能会多次请求客户接口。客户接口需要保证幂等性,能够正确处理重复结果数据。
接口耗时
客户接收接口需要保证接口的可用性和性能稳定,易盾请求超时时间为2s,客户接口尽量保证在1s内返回应答,如有特殊要求,可联系易盾运营适当调整超时时间。
请求
请求地址
名称 | 值 |
---|---|
HTTP URL | 回调地址callbackUrl |
HTTP Method | POST |
请求头
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
Content-Type | String | 是 | 固定值:"application/x-www-form-urlencoded" |
请求参数
名称 | 类型 | 必填 | 最大长度 | 描述 |
---|---|---|---|---|
secretId | String | 是 | 32 | 产品秘钥 id ,由易盾内容安全云服务分配,产品标识 |
signature | String | 是 | 32 | 请求签名,用来验证此次请求的合法性,具体算法见接口鉴权 |
callbackData | String | 是 | - | 主动推送结果数据,格式为json字符串,主动推送数据格式和字段描述请参考轮询模式响应结果格式说明 |
请求体示例
callbackData=***&signature=xxx&secretId=xxx
请求体 callbackData 格式如下,callbackData 为 JSON 字符串格式,请自行解析或者反转成 JSON 对象使用。
异步检测结果请求体示例
{
"antispam": {
"checkStatus": 2,
"dataId": "123",
"suggestion": 2,
"callback": "i am callback",
"evidences": {
"images": [
{
"dataId": "525875",
"field": "content",
"suggestion": 2,
"censorType": 0,
"name": "mp84l9cwy8eqfxydqnx53vug05009pgw",
"resultType": 1,
"labels": [
{
"subLabels": [
{
"subLabel": "50003",
"rate": 1.0,
"details": {
"hitInfos": [
{
"y1": 0.1756,
"y2": 0.7165,
"x1": 0.1711,
"x2": 0.8457,
"value": "李四"
}
]
}
}
],
"level": 2,
"rate": 1.0,
"label": 500
},
{
"level": 0,
"rate": 1.0,
"label": 300
}
],
"status": 2
}
],
"texts": [
{
"dataId": "216292",
"field": "content",
"suggestion": 2,
"censorType": 0,
"isRelatedHit": false,
"resultType": 1,
"labels": [
{
"subLabels": [
{
"subLabel": "100080",
"details": {
"hitInfos": [
{
"positions": [
{
"fieldName": "content",
"startPos": 0,
"endPos": 2
}
],
"value": "测试"
}
],
"keywords": [
{
"word": "测试"
}
]
}
},
{
"subLabel": "100002"
}
],
"level": 2,
"label": 100
},
{
"subLabels": [
{
"subLabel": "500001",
"details": {
"hitInfos": [
{
"positions": [
{
"fieldName": "content",
"startPos": 15,
"endPos": 18
}
],
"value": "测试"
}
]
}
},
{
"subLabel": "500015"
}
],
"level": 2,
"label": 500
},
{
"level": 0,
"label": 200
}
]
}
],
"audios": [
{
"duration": 25000,
"checkTime": 1630485845599,
"dataId": "330957",
"field": "content",
"suggestion": 2,
"resultType": 1,
"segments": [
{
"startTime": 0,
"endTime": 25,
"type": 0,
"content": "测试文本测试文本",
"labels": [
{
"subLabels": [
{
"subLabel": "500013",
"details": {
"hitInfos": [
{
"value": "测试"
},
{
"value": "测,测试"
}
]
}
}
],
"level": 2,
"label": 500
}
]
}
],
"status": 2
}
],
"audiovideos": [
{
"duration": 71339,
"checkTime": 1630485848287,
"dataId": "709664",
"field": "content",
"suggestion": 2,
"evidences": {
"audio": {
"duration": 71,
"suggestion": 2,
"resultType": 1,
"segments": [
{
"startTime": 12,
"endTime": 17,
"type": 1,
"content": "命中声纹检测",
"labels": [
{
"subLabels": [
{
"subLabel": "13000",
"details": {
"hitInfos": [
{
"value": "1.00"
}
]
}
}
],
"level": 2,
"label": 100
}
]
},
{
"startTime": 15,
"endTime": 20,
"type": 1,
"content": "命中声纹检测",
"labels": [
{
"subLabels": [
{
"subLabel": "13000",
"details": {
"hitInfos": [
{
"value": "1.00"
}
]
}
}
],
"level": 2,
"label": 100
}
]
}
],
"status": 2
},
"video": {
"duration": 71,
"suggestion": 2,
"resultType": 1,
"pictures": [
{
"backPics": [
{
"url": "https://123.jpg"
}
],
"frontPics": [
{
"url": "https://456.jpg"
}
],
"startTime": 5000,
"endTime": 5000,
"type": 1,
"url": "789.jpg",
"labels": [
{
"subLabels": [
{
"subLabel": "10007",
"rate": 0.926,
"details": {
"hitInfos": [
{
"value": "卡通色情",
"group": "色情部位分组"
}
]
}
}
],
"level": 2,
"rate": 0.95157,
"label": 100
}
]
}
],
"status": 2
}
},
"resultType": 1,
"status": 2
}
]
},
"resultType": 1,
"taskId": "mp84l9cwy8eqfxydqnx53vug05009pgw"
}
}
人工审核结果请求体示例
{
"censor": {
"censorLabels": [
{
"code": "1600759147543",
"name": "变形金刚",
"desc": "变形金刚/地球"
},
{
"code": "1600762076926",
"name": "地球",
"desc": ""
}
],
"suggestion": 2,
"censorRound": 0,
"censorTime": 1630549946549,
"reviewEvidences": {
"reason": "其他",
"remark": "",
"detail": {
"images": [
{
"censorResult": 0,
"reasons": [
{
"censorLabels": [
],
"reason": "违规图片",
"url": "https://image.jpg"
}
],
"dataId": "809577",
"field": "content"
}
],
"texts": [
{
"censorResult": 2,
"reasons": [
{
"censorLabels": [
],
"reason": "违规文本",
"text": "异常的的异常"
}
],
"dataId": "427331",
"field": "content"
},
{
"censorResult": 1,
"dataId": "8114",
"field": "content"
}
],
"audios": [
{
"censorResult": 2,
"dataId": "855180",
"field": "content",
"reasons": [
{
"censorLabels": [
],
"reason": "音频违规",
"startTime": 0,
"endTime": 0,
"url": "https://audio.mp3"
}
]
}
],
"files": [
{
"censorResult": 2,
"dataId": "855180",
"field": "content",
"texts": [
{
"censorLabels": [
],
"reason": "违规文本",
"text": "异常的的异常"
}
],
"images": [
{
"censorLabels": [
],
"reason": "违规图片",
"url": "https://image.jpg"
}
]
}
],
"videos": [
{
"censorResult": 2,
"dataId": "855180",
"field": "content",
"reasons": [
{
"censorLabels": [
],
"reason": "视频中图片违规",
"startTime": 0,
"endTime": 0,
"url": "https://video.mp4"
}
]
}
],
"audiovideos": [
{
"censorResult": 2,
"dataId": "855180",
"field": "content",
"audios": [
{
"censorLabels": [
],
"reason": "音频违规",
"startTime": 0,
"endTime": 0,
"url": "https://video.mp4"
}
],
"videos": [
{
"censorLabels": [
],
"reason": "视频中图片违规",
"startTime": 0,
"endTime": 0,
"url": "https://video.mp4"
}
]
}
]
}
},
"skipCensor": 0,
"censorSource": 0,
"resultType": 2,
"taskId": "x4vo2xy2whrd3ovnsb7dplhg05009phe"
}
}
响应
响应结果
- 客户接口接收到我们回调的结果后,需要返回应答信息,接口响应HTTP状态码为200,当回调处理异常时,应答的HTTP状态码应为500,或者4xx;
- 目前推送方式默认连接超时(connect timeout)150ms,回调超时(socket timeout)为2s,建议收到推送检测结果后,优先返回response应答信息,异步处理检测结果,避免因为回调超时,易盾侧未收到响应重复推送结果。如业务侧对于超时配置有特殊要求,可联系易盾策略经理调整配置。
- 应答信息为JSON格式,字段定义如下:
名称 | 类型 | 必须返回 | 描述 |
---|---|---|---|
code | Number | 是 | 应答code,易盾方解析code为200表示推送成功 |
msg | String | 否 | 具体描述信息 |
响应体示例
{
"code": 200,
"msg": "接收成功"
}