网站解决方案-单URL离线结果获取v2.0
接口地址
https://as.dun.163.com/v2/crawler/callback/results
接口描述
异步获取检测结果。建议您使用POST请求, 且仅接受 application/x-www-form-urlencoded 编码格式。
接口请求频率
小于10次/秒,一次请求最多返回50条待回调的数据,请求频率过快服务器会拒绝处理。
请求参数
该接口参数与请求公共参数一致,businessId可不传,详细见 请求公共参数
参数名称 | 类型 | 是否必选 | 最大长度 | 描述 |
---|---|---|---|---|
version | String | Y | 4 | 接口版本,当前版本为 v2.0 |
响应结果
响应字段如下,响应通用字段已省略,详细见 响应通用字段:
result 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
taskId | String | 数据请求标识,可以根据该标识查询融媒体数据最新结果 |
dataId | String | 调用融媒体检测时传递的dataId字段 |
callback | String | 调用检测时传递的callback字段 |
result | Number | 检测结果, 0:无结果(检测失败);1:正常; 2:异常 ;3:疑似; |
failureReason | Number | 网站检测失败原因,1:爬虫失败;2:试用量超限;3:业务已关闭;4:爬取内容为空;5:连接失败;6:404网页不存在;7:URL正在爬取,请勿同时重复提交;100:其他原因 |
evidences | json对象 | 机审证据信息 |
evidences 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
texts | json数组 | 文本证据信息 |
images | json数组 | 图片证据信息 |
audios | json数组 | 语音证据信息 |
videos | json数组 | 视频证据信息 |
files | json数组 | 文档证据信息 |
texts 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
dataId | String | 提交检测时标识的数据id |
action | Number | 检测结果,0:通过,1:嫌疑,2:不通过 |
labels | json数组 | 分类信息 详细数据与文本在线检测labels数据结构一致 |
callback | String | 调用检测时传递的callback字段 |
labels 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
label | Number | 分类信息,100:色情,200:广告,260:广告法,300:暴恐,400:违禁,500:涉政,600:谩骂,700:灌水,900:其他 |
level | Number | 分类级别,0:通过, 1:嫌疑,2:不通过 |
details | json对象 | 其他信息 |
details 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
hint | json数组 | 线索信息,用于定位文本中有问题的部分,辅助人工审核 |
images 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
name | String | 图片标识 |
dataId | String | 提交检测时标识的数据id |
imageUrl | String | 图片下载地址 |
status | Number | 图片检测状态码,定义为:0:检测成功,610:图片下载失败,620:图片格式错误,630:其它 |
action | Number | 检测结果,0:通过,1:嫌疑,2:不通过 |
labels | json数组 | 分类信息 |
callback | String | 调用检测时传递的callback字段 |
labels 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
label | Number | 分类信息,100:色情,110:性感低俗,200:广告,210:二维码,260:广告法,300:暴恐,400:违禁,500:涉政,900:其他 |
level | Number | 分类级别,0:通过,1:嫌疑,2:不通过 |
rate | Number | 置信度分数,0-1之间取值,1为置信度最高,0为置信度最低。若level为正常,置信度越大,说明正常的可能性越高。若level为不确定或确定,置信度越大,说明垃圾的可能性越高 |
audios 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
dataId | String | 提交检测时标识的数据id |
audioUrl | String | 风险音频的下载地址 |
asrStatus | Number | 音频翻译结果,2:检测中,3:检测完成,4:检测失败 |
asrResult | Number | 音频翻译检测失败原因,1:文件格式错误,2:文件下载失败,3:解析失败,4:音频流不存在 |
action | Number | 检测结果,0:通过,1:嫌疑,2:不通过 |
labels | json数组 | 分类信息 |
labels 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
label | Number | 分类信息,100:色情,200:广告,260:广告法,300:暴恐,400:违禁,500:涉政,600:谩骂 |
level | Number | 分类级别,0:通过,1:嫌疑,2:不通过 |
details | json对象 | 其他信息 |
details 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
hint | json数组 | 线索信息,用于定位文本中有问题的部分,辅助人工审核 |
hitType | Number | 命中检测器类型:10:用户名单 11:IP名单 12:设备名单 30:敏感词 110:IP地区限制 130:声纹检测 |
hint 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
value | String | 命中的敏感词或者声纹检测的分值 |
segments | json数组 | 命中敏感词或者声纹检测的音频时间点 |
segments 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
startTime | Number | 最近开始时间点,单位毫秒 |
endTime | Number | 最近结束时间点,单位毫秒 |
videos 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
dataId | String | 提交检测时标识的数据id |
videoUrl | String | 风险视频的下载地址 |
status | Number | 视频处理状态码,定义为:0:检测成功,110:请求重复,120:参数错误,130:解析错误,140:数据类型错误 |
level | Number | 视频级别信息,分为0:正常,1:不确定,2:确定,其中不确定的建议人工复审 |
evidences | json对象数组 | 证据信息数组 |
evidences 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
beginTime | Number | 证据开始相对时间,单位为毫秒,调用方获取后可自行格式化为可视化时间,如:149000 转换为"00:02:29" |
endTime | Number | 证据结束相对时间,单位为毫秒,调用方获取后可自行格式化为可视化时间,如:149000 转换为"00:02:29" |
type | Number | 1:图片,2:视频 |
url | String | 证据信息 |
labels | json对象数组 | 证据结果数组 |
labels 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
label | Number | 分类信息,100:色情,110:性感;200:广告,210:二维码,260:广告法,300:暴恐,400:违禁,500:涉政,1020:黑屏,1030:挂机 |
level | Number | 级别信息,分为1:不确定,2:确定 |
rate | Number | 分数 |
files 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
dataId | String | 提交检测时标识的数据id |
fileUrl | String | 风险文件的下载地址 |
result | Number | 检测结果 0:无结果(检测失败), 1:正常 2:异常 3:嫌疑 |
failureReason | Number | 检测失败原因 |
evidences | json对象 | 证据信息数组 |
failureReason 说明
错误码 | 描述 |
---|---|
1000 | 文档大小超过上限 |
1001 | 文档格式不支持 |
1002 | 文档下载失败 |
2000 | 文档内容提取失败 |
2001 | 文档内容提取超时 |
3000 | 文档检测失败 |
3001 | 文档文本检测失败 |
3002 | 文档图片检测失败 |
evidences 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
texts | json对象数组 | 文本证据信息 |
images | json对象数组 | 图片证据信息 |
texts 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
taskId | String | 当前分段检测数据标识 |
sequence | Number | 当前文本在原始文档中的分段(5000字符/段)序号 |
startText | String | 每段文本的起始20个字符 |
endText | String | 每段文本的结尾20个字符 |
action | Number | 检测结果,0:通过,1:嫌疑,2:不通过 |
labels | json对象数组 | 分类信息 详细数据与文本在线检测labels数据结构一致 |
images 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
taskId | String | 当前图片检测数据标识 |
sequence | Number | 当前图片在原始文档中的序号 |
imageUrl | String | 图片下载地址 |
level | Number | 分类级别,0:正常,1:不确定,2:确定 |
labels | json对象数组 | 分类信息 详细数据与图片在线检测labels数据结构一致 |
响应示例
当获取机器检测离线结果时,输出示例如下:
{
"code": 200,
"msg": "ok",
"result": [
{
"dataId": "10086_",
"taskId": "15ed9fefe068427cb45724f6f17ee7db",
"callback": "callback123456789",
"result": 2,
"evidences": {
"texts": [
{
"action": 0,
"dataId": "de56f6120c5447508fe6ca78f5ea84c9",
"labels": []
}
],
"images": [
{
"name": "http://xxx/tools/webtest",
"dataId": "9de507726f9a4860b25f25c20452ba46",
"imageUrl":"https://xxxxxx.png",
"status": 0,
"action": 0,
"labels": [
{
"label": 500,
"level": 0,
"rate": 1
},
{
"label": 300,
"level": 0,
"rate": 1
},
{
"label": 100,
"level": 0,
"rate": 0.99985105
}
]
},
{
"name": "http://xxx/tools/webtest",
"dataId": "c6392dca1b994d13ab8ae43032618a93",
"imageUrl":"https://xxxxxx.png",
"status": 0,
"action": 0,
"labels": [
{
"label": 500,
"level": 0,
"rate": 1
},
{
"label": 300,
"level": 0,
"rate": 1
}
]
}
],
"audios": [
{
"action": 0,
"asrStatus": 4,
"dataId": "3eb8f886bd2e4c3789e5efe95073a6e9",
"labels": []
},
{
"action": 0,
"asrStatus": 4,
"dataId": "a7d11d939f754ebd8cad69c0cbb84b69",
"labels": []
}
],
"videos": [
{
"dataId": "0de61712290f45e798506005bea5966a",
"status": 120,
"level": 0,
"evidences": []
},
{
"dataId": "607b57d42f5b45d983b48c7bf739e01b",
"status": 120,
"level": 0,
"evidences": []
}
],
"files": []
}
},
{
"dataId": "10086_",
"taskId": "3e942eccccd04fd8b080ecb43a83bbc1",
"callback": "callback123456789",
"result": 0,
"failureReason": 100,
"evidences": {
"texts": [],
"images": [],
"audios": [],
"videos": [],
"files": []
}
},
{
"dataId": "10086_",
"taskId": "a58fcfead10b49e2b8c715c045e88226",
"callback": "callback123456789",
"result": 0,
"failureReason": 100,
"evidences": {
"texts": [],
"images": [],
"audios": [],
"videos": [],
"files": []
}
}
]
}
当无最新离线结果需要获取时,输出示例如下:
{
"code": 200,
"msg": "ok",
"result":[]
}
网站解决方案主动回调说明
接口描述
易盾提供主动回调和被动回调数据两种方式,主动回调以数据为维度根据提交时设置的回调地址,检测完成之后将结果推送到回调地址。
主动回调接入
客户接入主动回调的方式很简单,只需要在调用在线检测接口请求参数中指定回调通知参数callbackUrl(即一个http(s)协议接口的URL)
业务类型 | 回调参数名称 | 类型 | 最大长度 | 描述 |
---|---|---|---|---|
网站检测 | callbackUrl | String | 256 | 提交参数中添加callbackUrl字段 |
请求回调接口说明
客户提供的回调地址,需支持 POST 方法,请求数据编码皆为 utf-8。
回调成功时需要响应json结果:{ "code": 200, "message": "xxxx" },回调失败时响应code非200,如{ "code": 500, "message": "回调处理失败" }。
针对回调失败的数据可以通过被动回调的方式来查询到结果。
返回参数结构
参数名称 | 类型 | 是否必传 | 描述 |
---|---|---|---|
secretId | String | Y | 产品秘钥 id ,由易盾反垃圾云服务分配,产品标识 |
signature | String | Y | 请求签名,用来验证此次请求的合法性,具体算法见 接口鉴权 |
callbackData | String | Y | 主动回调推送数据,格式为json字符串,callbackData返回结构与离线结构一致,具体返回结构请查看响应示例 |
接口鉴权
客户主动回调接收接口可以通过业务开通时易盾分配的密钥信息字段进行接口鉴权
/**
* 通过HttpServletRequest做签名验证
*/
public static boolean verifySignature(HttpServletRequest request) {
String secretId = request.getParameter("secretId");
String businessId = request.getParameter("businessId");
String signature = request.getParameter("signature");
if (StringUtils.isEmpty(secretId) || StringUtils.isEmpty(signature)) {
// 签名参数为空,直接返回失败
return false;
}
Map<String, String> params = Maps.newHashMap();
for (String paramName : request.getParameterMap().keySet()) {
if (!"signature".equals(paramName)) {
params.put(paramName, request.getParameter(paramName));
}
}
// SECRETKEY:产品私有密钥 SECRETID:产品密钥ID BUSINESSID:业务ID,开通服务时,易盾会提供相关密钥信息
String serverSignature = getSignature(SECRETKEY, params);
return signature.equals(serverSignature) && SECRETID.equals(secretId) && BUSINESSID.equals(businessId);
}
/**
* 生成签名信息
* @param secretKey 产品私钥
* @param params 接口请求参数名和参数值map,不包括signature参数名
*/
public static String genSignature(String secretKey, Map<String, String> params) throws UnsupportedEncodingException {
// 1. 参数名按照ASCII码表升序排序
String[] keys = params.keySet().toArray(new String[0]);
Arrays.sort(keys);
// 2. 按照排序拼接参数名与参数值
StringBuffer paramBuffer = new StringBuffer();
for (String key : keys) {
paramBuffer.append(key).append(params.get(key) == null ? "" : params.get(key));
}
// 3. 将secretKey拼接到最后
paramBuffer.append(secretKey);
// 4. MD5是128位长度的摘要算法,用16进制表示,一个十六进制的字符能表示4个位,所以签名后的字符串长度固定为32个十六进制字符。
return DigestUtils.md5Hex(paramBuffer.toString().getBytes("UTF-8"));
}
网站检测解决方案主动回调响应示例
{
"dataId": "10086_",
"taskId": "15ed9fefe068427cb45724f6f17ee7db",
"callback": "callback123456789",
"result": 2,
"evidences": {
"texts": [
{
"action": 0,
"dataId": "de56f6120c5447508fe6ca78f5ea84c9",
"labels": []
}
],
"images": [
{
"name": "http://xxx/tools/webtest",
"dataId": "9de507726f9a4860b25f25c20452ba46",
"imageUrl":"https://xxxxxx.png",
"status": 0,
"action": 0,
"labels": [
{
"label": 500,
"level": 0,
"rate": 1
},
{
"label": 300,
"level": 0,
"rate": 1
},
{
"label": 100,
"level": 0,
"rate": 0.99985105
},
{
"label": 400,
"level": 0,
"rate": 1
},
{
"label": 200,
"level": 0,
"rate": 0.9889235
}
]
},
{
"name": "http://xxx/tools/webtest",
"dataId": "c6392dca1b994d13ab8ae43032618a93",
"imageUrl":"https://xxxxxx.png",
"status": 0,
"action": 0,
"labels": [
{
"label": 500,
"level": 0,
"rate": 1
},
{
"label": 300,
"level": 0,
"rate": 1
},
{
"label": 100,
"level": 0,
"rate": 0.99997765
},
{
"label": 400,
"level": 0,
"rate": 1
},
{
"label": 200,
"level": 0,
"rate": 0.99996674
}
]
}
],
"audios": [
{
"action": 0,
"asrStatus": 4,
"dataId": "3eb8f886bd2e4c3789e5efe95073a6e9",
"labels": []
},
{
"action": 0,
"asrStatus": 4,
"dataId": "a7d11d939f754ebd8cad69c0cbb84b69",
"labels": []
}
],
"videos": [
{
"dataId": "0de61712290f45e798506005bea5966a",
"status": 120,
"level": 0,
"evidences": []
},
{
"dataId": "607b57d42f5b45d983b48c7bf739e01b",
"status": 120,
"level": 0,
"evidences": []
}
],
"files": []
}
},
{
"dataId": "10086_",
"taskId": "3e942eccccd04fd8b080ecb43a83bbc1",
"callback": "callback123456789",
"result": 0,
"failureReason": 100,
"evidences": {
"texts": [],
"images": [],
"audios": [],
"videos": [],
"files": []
}
},
{
"dataId": "10086_",
"taskId": "a58fcfead10b49e2b8c715c045e88226",
"callback": "callback123456789",
"result": 0,
"failureReason": 100,
"evidences": {
"texts": [],
"images": [],
"audios": [],
"videos": [],
"files": []
}
}
}