文本人工审核结果和异步检测结果回调接口
离线接口获取地址
http://as.dun.163.com/v4/text/callback/results
接口描述
通过resultType字段区分机审和人审结果。
1.在线检测接口结果中嫌疑的数据,会进行离线分析和人工审核,这些数据的离线结果需要客户通过该接口进行定时获取。获取离线处理的数据后,下次调用,不会再次返回之前获取过的离线数据。
2.异步检测,离线接口获取异步检测结果,如果使用主动回调方式请文本在线提交接口使用v4.1版本及以上,v4.1版本以下默认只返回人工审核结果,增加resultType字段区分机审和人审结果。
3.接口对请求频率做了限制,请求频率过快服务器会拒绝处理,最快请求频率是10s/20次,接口一次最多返回200个结果,建议30秒获取一次。建议您使用POST请 求, 且仅接受 application/x-www-form-urlencoded 编码格式。
请求参数
该接口参数与请求公共参数一致,详细见 请求公共参数
参数名称 | 类型 | 是否必选 | 最大长度 | 描述 |
---|---|---|---|---|
version | String | Y | 4 | 接口版本v4.2 |
响应结果
响应字段如下,响应通用字段已省略,详细见 响应通用字段:
返回通用结构:
参数名称 | 数据类型 | 是否必填 | 描述 |
---|---|---|---|
code | Integer | Y | 返回错误码, 取值见官网公共返回错误码定义 |
msg | String | Y | 返回错误消息 |
result | List |
Y | 离线结果 |
result数据结构
参数名称 | 类型 | 描述 |
---|---|---|
antispam | json对象 | 文本反垃圾检测结果 |
anticheat | json对象 | 反作弊检测结果,如有需要请联系您的专属商务,未开通状态下json对象返回为空 |
emotionAnalysis | json对象 | 情感分析检测结果,如有需要请联系您的专属商务,未开通状态下json对象返回为空 |
resultType | Integer | 离线结果类型,1:机器结果,2:人工结果 |
userRisk | json对象 | 用户画像检测结果,如有需要请联系您的专属商务,未开通状态下json对象返回为空 |
反垃圾结果
antispam 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
action | Number | 检测结果,0:通过,1:嫌疑(机审结果返回,人审没有嫌疑状态)2:不通过 |
censorSource | Number | 审核来源,0:易盾人审,1:客户人审,2:易盾机审,3:用户质检,4:易盾质检,版本支持v3.1及以上 |
censorRound | Number | 审核轮数,1:第1轮人审,2:第2轮人审,3:第3轮人审,4:第4轮人审,5:第5轮人审,未设置审核模式默认返回0 |
censorTime | Number | 人工审核完成时间,毫秒单位时间戳(13位) |
taskId | String | 在线接口检测返回的数据请求标识,可以根据该标识查询数据最新结果 |
callback | String | 产品调用文本在线检测传递的 callback 字段数据。 |
labels | json数组 | 分类信息 |
censorLabels | json数组 | 支持在智能审核系统自定义标签分类信息 |
labels 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
label | Number | 分类信息,100:色情,200:广告,260:广告法,300:暴恐,400:违禁,500:涉政,600:谩骂,700:灌水,1100:涉价值观 |
level | Number | 分类级别,0:正常,1:不确定,2:确定 |
details | json对象 | 其他信息 |
details 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
hint | json数组 | 线索信息,用于定位文本中有问题的部分,辅助人工审核 |
hints | json数组 | hint字段内容+线索命中的坐标信息,仅接口版本v4.1及以上会返回该字段 |
hitInfos | json数组 | 线索详细信息 |
hints 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
hint | String | 线索信息 |
positions | json数组 | 线索命中的坐标信息 |
positions数据结构
参数名称 | 类型 | 描述 |
---|---|---|
positionType | Number | 位置类型,0:内容,1:标题 |
startPos | Number | 线索起始坐标,如果命中第一个字符,起始坐标返回0 |
endPos | Number | 线索结束坐标,如果命中第一个字符,结束坐标返回1 |
hitInfos 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
hitType | Number | 线索分类信息,返回10:表示命中用户自定义添加用户名单,返回11:表示命中用户自定义添加ip名单,返回30:表示命中用户自定义添加敏感词,返回140:标识命中反作弊(hitReason为反作弊命中原因,1:数据异常 2:行为模型 3:设备模型 4:业务类型 5:校验异常 6:模拟器 7:越狱或root 8:浏览器异常 9:ip异常 10:易盾黑名单 11:自定义黑名单 12:自定义白名单) |
hitClues | Json数组 | hitTyp命中30自定义添加敏感词,返回命中的自定义敏感词内容,如果没有命中hitType:30,则不返回该字段 |
censorLabels 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
code | Number | 在智能系统配置自定义标签之后会生成一个唯一的标签ID |
desc | String | 在智能审核系统配置自定义标签备注 |
情感分析结果
emotionAnalysis 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
taskId | String | 本次请求数据标识,可以根据该标识查询数据最新结果 |
sentiment | String | negative(负向情绪),neutral(中性情绪),positive(正向情绪),unknown(未知) |
positiveProb | Number | 0~1,代表正向情绪倾向,分数越高,正向情绪越高 |
negativeProb | number | 0~1,代表负向情绪倾向,分数越高,负向情绪越高 |
反作弊结果
anticheat 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
taskId | String | 本次请求数据标识,可以根据该标识查询数据最新结果 |
action | Number | 检测结果,0:通过,10:嫌疑,20:不通过 |
hitInfos | List | 命中信息,例如:[{"hitType":5,"hitMsg":"无SDK数据"}],其中hitType类型为int,含义是命中类型,详见 hitType返回码及含义表 ,hitMsg类型为String,含义是命中详情,可定制返回值。 |
用户画像结果
userRisk 数据结构
参数名称 | 类型 | 描述 |
---|---|---|
taskId | String | 本次请求数据标识,可以根据该标识查询数据最新结果 |
dataId | String | 本次请求提交的客户数据标识 |
account | String | 用户账号信息 |
accountLevel | Number | 用户账号风险等级,0:正常,1:嫌疑,2:确定 |
响应示例
当获取到离线结果时,输出示例如下:
{
"code":200,
"msg":"ok",
"result":[
{
"antispam":{
"taskId":"80c6a65315bd4602bee9cc8af367e893",
"action":2,
"censorType":0,
"isRelatedHit":false,
"lang":[
],
"labels":[
{
"label":200,
"level":2,
"details":{
"hint":[
],
"hitInfos":[
],
"hints":[
{
"hint":"加微信",
"positions":[
{
"positionType":0,
"startPos":0,
"endPos":3
}
]
}
]
},
"subLabels":[
{
"subLabel":"200012"
}
]
}
],
"censorLabels":[
]
},
"emotionAnalysis":{
},
"anticheat":{
},
"userRisk":{
},
"resultType":1
}
]
}
当无最新离线结果需要获取时,输出示例如下:
{
"code": 200,
"msg": "ok",
"result": [
]
}
文本回调方式获取
回调方式以数据为维度由客户设置回调地址;当人工进行审核后,或者文本异步检测,会触发主动回调,调用客户提供的回调接口返回审核结果。
回调接入说明
接入回调方式很简单,只需要在调用在线检测接口请求参数中指定了回调通知参数callbackUrl(即一个http(s)协议接口的URL)。需要您的回调接口支持http协议,支持POST方法,传输数据编码采用utf-8。
业务类型 | 回调参数名称 | 类型 | 最大长度 | 描述 |
---|---|---|---|---|
文本 | callbackUrl | String | 256 | 文本在线检测参数中添加callbackUrl字段 |
回调状态
您服务端接收到我们回调的结果后,返回的HTTP状态码为200时,表示推送成功,其他的HTTP状态码均视为您接收失败,我们将每隔10分钟推送一次,如果一直失败,持续一天后不再推送;回调接口超时时间设置为2s,为了保证顺利接收数据,客户需保证接收接口性能稳定并且保证幂等性。
请求公共参数
参数名称 | 类型 | 是否必传 | 描述 |
---|---|---|---|
secretId | String | Y | 产品秘钥 id ,由易盾反垃圾云服务分配,产品标识 |
businessId | String | Y | 业务id ,由易盾反垃圾云服务分配,业务标识 |
signature | String | Y | 请求签名,用来验证此次请求的合法性,具体算法见 接口鉴权 |
callbackData | String | Y | 主动推送推送数据,格式为json字符串 |
secretId,businessId,signature参数用来给数据接收接口做签名鉴权用
接口鉴权
回调结果可以通过业务开通时易盾分配的密钥信息字段进行接口鉴权,鉴权粒度是否要精确到业务级别,用户可以根据需要自行决定
/**
* 通过HttpServletRequest做签名验证
*
* @param request
* @return
*/
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参数名
* @return
* @throws UnsupportedEncodingException
*/
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"));
}
文本回调数据结构
callbackData为Json字符串,数据结构如下:
{
"resultType":2,
"antispam":{
"censorSource":0,
"censorRound":0,
"censorTime":1624348621608,
"censorLabels":[
],
"taskId":"9a2e767c313f4585b3dde4659f26a418",
"action":2,
"censorType":0,
"isRelatedHit":false,
"lang":[
],
"labels":[
{
"label":100,
"level":2,
"details":{
"hint":[
"[\"加个微信\"]"
],
"hitInfos":[
],
"hints":[
]
},
"subLabels":[
{
"subLabel":"100001"
}
]
}
]
},
"emotionAnalysis":{
},
"anticheat":{
},
"userRisk":{
}
}