### 接口地址 http://as.dun.163yun.com/v4/image/asyncCheck (http://as.dun.163yun.com/v4/image/asyncCheck) ### 接口描述 图片异步检测提交接口,检测参数同图片同步检测接口,version为v4.1 ### 请求参数 公共参数已省略,详细见 请求公共参数 (/help/documents/150429219582824448) ### 基本参数 参数名称 | 类型 | 是否必选 | 最大长度 | 描述 images | String(json数组) | Y | 32张或10MB | images为json数组,支持批量检测 version | String | Y | 4 | 接口版本v4.1 images参数结构说明 字段名称 | 类型 | 是否必选 | 最大长度 | 描述 name | String | Y | 1024 | 图片名称(或图片标识), 该字段为回调信号字段,产品可以根据业务情况自行设计,如json结构、或者为图片url均可 type | Number | Y | 4 | 类型,分别为1:图片URL data | String | Y | 32张 | 图片内容,如type=1,则该值为图片URL callbackUrl | String | N | 256 | 离线结果回调通知到客户的URL。主动回调数据接口超时时间设置为2s,为了保证顺利接收数据,需保证接收接口性能稳定并且保证幂等性。 ### 业务参数 业务扩展参数,有助于通过业务维度辅助反垃圾结果判定,建议传入。 参数名称 | 类型 | 是否必选 | 最大长度 | 描述 用户信息 | - | N | - | 用户信息包含账号、昵称、等级、角色等,请查看 业务扩展参数—用户信息 设备信息 | - | N | - | 设备信息包含设备ID、设备ID类型等,请查看 业务扩展参数—设备信息 场景信息 | - | N | - | 场景信息包含私聊、群聊、直播、帖子等场景字段,请查看 业务扩展参数—场景信息 ip | String | N | 128 | 用户IP地址 checkLabels | String数组 | N | 64 | 业务自定义过检分类,请谨慎写入,并于策略经理充分沟通,以免引起漏判,可多选,过检分类列表:100:色情,110:性感低俗,200:广告,210:二维码,260:广告法,300:暴恐,400:违禁,500:涉政,800:恶心类,900:其他,1100:涉价值观 响应结果 参数名称 | 类型 | 描述 code | Number | 接口调用状态,200:正常,其他值:调用出错,返回码见 响应返回码 (/help/documents/150429283139112960) msg | String | 结果说明,如果接口调用出错,那么返回错误描述,成功返回 ok result | 数组 | 异步检测返回结果与在线检返回结构一致 ### 响应示例 输出结果: Code (json): { "code": 200, "msg": "ok", "result": { "checkImages": [ { "name": "1234", "taskId": "bb0ebeb17e54486ba3985b24eb64540d" } ], "dealingCount": 0 } } ## 图片异步获取检测结果 ### 接口地址 接口地址 http://as.dun.163yun.com/v4/image/callback/results (http://as.dun.163yun.com/v4/image/callback/results) ### 接口描述 图片异步检测,通过离线接口获取异步检测结果。该接口支持批量返回检测结果,返回结果可以根据异步提交返回得taskid对应检测结果。 ### 请求参数 公共参数已省略,详细见 请求公共参数 (/help/documents/150429219582824448) 请求参数说明 参数名称 | 类型 | 描述 version | String | 接口版本v4.1 version版本只有为v4.1时,才会返回机器异步检测结果,通过antispam下resultType区分人审和机器结果 响应结果 参数名称 | 类型 | 描述 code | Number | 接口调用状态,200:正常,其他值:调用出错,返回码见 响应返回码 (/help/documents/150429283139112960) msg | String | 结果说明,如果接口调用出错,那么返回错误描述,成功返回 ok result | 数组 | 异步检测返回结果与在线检返回结构一致,具体结构请参考在线检测antispam数组 (https://support.dun.163.com/documents/2018041902?docId=150429577608613888) antispam下resultType用于区分机器结果还是人审结果,resultType=1(机器结果),resultType=2(人审结果) ### 响应示例 请求示例 Code: { "signature":"30d57ebc7cd95ecce981879c9ca820a2, "businessId":"业务id", "secretId":"产品密钥信息", "nonce":"2343567", "timestamp":"1603854848319, "version":"v4.1", } 输出结果: 注:分类信息,100:色情,110:性感低俗,200:广告,210:二维码,300:暴恐,400:违禁,500:涉政,800:恶心,900:其他,1100:涉价值观 机审示例: Code (json): { "code":200, "msg":"ok", "result":[ { "antispam":{ "censorType":0, "name":"test", "action":0, "resultType":1, "taskId":"7809b5688f914333a86f412486e74926", "status":620, "labels":[ { "subLabels":[ ], "level":0, "rate":1, "label":500 }, { "subLabels":[ ], "level":0, "rate":1, "label":300 }, { "subLabels":[ ], "level":0, "rate":1, "label":100 }, { "subLabels":[ ], "level":0, "rate":1, "label":400 }, { "subLabels":[ ], "level":0, "rate":1, "label":110 }, { "subLabels":[ ], "level":0, "rate":1, "label":800 }, { "subLabels":[ ], "level":0, "rate":1, "label":200 }, { "subLabels":[ ], "level":0, "rate":1, "label":210 }, { "subLabels":[ ], "level":0, "rate":1, "label":900 } ] }, "userRisk":{ "name":"test", "taskId":"7809b5688f914333a86f412486e74926" }, "logo":{ "name":"test", "details":[ ], "taskId":"7809b5688f914333a86f412486e74926" }, "ocr":{ "name":"test", "details":[ ], "taskId":"7809b5688f914333a86f412486e74926" }, "quality":{ "name":"test", "details":[ ], "taskId":"7809b5688f914333a86f412486e74926" }, "face":{ "name":"test", "details":[ ], "taskId":"7809b5688f914333a86f412486e74926" }, "scene":{ "name":"test", "details":[ ], "taskId":"7809b5688f914333a86f412486e74926" } } ] } 人审示例 Code: { "code":200, "msg":"ok", "result":[ { "antispam":{ "name":"test", "taskId":"ef6ce2de3ab44a4b940739c794ae66e3", "action":2, "censorTime":1626855623760, "censorSource":1, "censorRound":1, "resultType":2, "labels":[ { "label":100, "level":2, "rate":1 }, { "label":500, "level":0, "rate":1 }, { "label":300, "level":0, "rate":1 }, { "label":400, "level":0, "rate":1 }, { "label":110, "level":0, "rate":1 }, { "label":800, "level":0, "rate":1 }, { "label":200, "level":0, "rate":1 }, { "label":210, "level":0, "rate":1 }, { "label":900, "level":0, "rate":1 } ], "censorLabels":[ ] } } ] } ## 图片回调方式获取 回调方式以数据为维度,由客户设置回调地址;当机器检测结果发生变化,或者人工进行审核后,会触发主动回调,调用客户提供的回调接口返回审核结果。 ### 回调接入说明 接入回调方式很简单,只需要在调用在线检测接口请求参数中指定了回调通知参数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 | 请求签名,用来验证此次请求的合法性,具体算法见 接口鉴权 (#_9) callbackData | String | Y | 主动推送推送数据,格式为json字符串 secretId,businessId,signature参数用来给数据接收接口做签名鉴权用 ### 接口鉴权 回调结果可以通过业务开通时易盾分配的密钥信息字段进行接口鉴权,鉴权粒度是否要精确到业务级别,用户可以根据需要自行决定 Code (java): /** * 通过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 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); } Code (java): /** * 生成签名信息 * @param secretKey 产品私钥 * @param params 接口请求参数名和参数值map,不包括signature参数名 * @return * @throws UnsupportedEncodingException */ public static String genSignature(String secretKey, Map 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字符串,数据结构如下: 机审示例 Code: { "antispam":{ "censorType":0, "name":"test", "action":0, "resultType":1, "taskId":"7809b5688f914333a86f412486e74926", "status":620, "labels":[ { "subLabels":[ ], "level":0, "rate":1, "label":500 }, { "subLabels":[ ], "level":0, "rate":1, "label":300 }, { "subLabels":[ ], "level":0, "rate":1, "label":100 }, { "subLabels":[ ], "level":0, "rate":1, "label":400 }, { "subLabels":[ ], "level":0, "rate":1, "label":110 }, { "subLabels":[ ], "level":0, "rate":1, "label":800 }, { "subLabels":[ ], "level":0, "rate":1, "label":200 }, { "subLabels":[ ], "level":0, "rate":1, "label":210 }, { "subLabels":[ ], "level":0, "rate":1, "label":900 } ] }, "userRisk":{ "name":"test", "taskId":"7809b5688f914333a86f412486e74926" }, "logo":{ "name":"test", "details":[ ], "taskId":"7809b5688f914333a86f412486e74926" }, "ocr":{ "name":"test", "details":[ ], "taskId":"7809b5688f914333a86f412486e74926" }, "quality":{ "name":"test", "details":[ ], "taskId":"7809b5688f914333a86f412486e74926" }, "face":{ "name":"test", "details":[ ], "taskId":"7809b5688f914333a86f412486e74926" }, "scene":{ "name":"test", "details":[ ], "taskId":"7809b5688f914333a86f412486e74926" } } 人审示例 Code (json): { "antispam":{ "name":"test", "taskId":"35fcb52938694674900b832d064b4a70", "action":0, "censorTime":1619577951222, "censorSource":0, "censorRound":1, "resultType":2, "labels":[ { "label":500, "level":0, "rate":1 }, { "label":300, "level":0, "rate":1 }, { "label":100, "level":0, "rate":1 }, { "label":400, "level":0, "rate":1 }, { "label":110, "level":0, "rate":1 }, { "label":800, "level":0, "rate":1 }, { "label":200, "level":0, "rate":1 }, { "label":210, "level":0, "rate":1 }, { "label":900, "level":0, "rate":1 } ], "censorLabels":[ ] } }