文本在线检测

接口地址

https://as.dun.163yun.com/v3/text/check

接口描述

根据发布的内容、发布者、ip、设备id等信息来检测是否为需拦截内容。接口同步返回易盾内容安全服务实时反垃圾引擎检测结果,产品可以根据该结果对数据进行初步过滤。该接口返回结果状态分以下三种:

  • 不通过:表示是确认内容非法,产品可对数据做删除隐藏处理。
  • 嫌疑:表示该内容疑似非法,需内容安全云服务离线检测模块进一步确认处理,确认结果需产品自行定期调用文本离线检测结果获取获取,产品对嫌疑数据可以做特殊策略处理,如本人可见等。
  • 通过:表示云安全反垃圾云服务实时反垃圾引擎未识别为非法内容,产品对该类数据可以直接放过,发表成功。云安全反垃圾云服务离线检测模块也会对这些数据做进一步分析处理,分析结果需产品自行定期调用文本离线检测结果获取获取。

文本限制

单次请求<5000字符,字段长度超过5000字符,会截取前面5000字符进行检测和存储;

请求参数

公共参数已省略,详细见 请求公共参数,其他参数如下:

参数名称类型是否必选最大长度描述
dataIdStringY128数据唯一标识,能够根据该值定位到该条数据,如对数据结果有异议,可以发送该值给客户经理查询
contentStringY2^24-1用户发表内容,建议对内容中JSON、表情符、HTML标签、UBB标签等做过滤,只传递纯文本,以减少误判概率。
dataTypeNumberN4子数据类型,与易盾内容安全服务约定即可
versionStringY4接口版本号,可选值 v3.1
ipStringN32用户IP地址
accountStringN128用户唯一标识,如果无需登录则为空
deviceTypeNumberN4用户设备类型,1:web, 2:wap, 3:android, 4:iphone, 5:ipad, 6:pc, 7:wp
deviceIdStringN128用户设备 id
callbackStringN2^16-1数据回调参数,调用方根据业务情况自行设计,当调用文本离线结果获取接口时,该接口会原样返回该字段,详细见文本离线检测结果获取。作为数据处理标识,因此该字段应该设计为能唯一定位到该次请求的数据结构,如对用户的昵称进行检测,dataId可设为用户标识(用户ID),用户修改多次,每次请求数据的dataId可能一致,但是callback参数可以设计成定位该次请求的数据结构,比如callback字段设计成json,包含dataId和请求的时间戳等信息,当然如果不想做区分,也可以直接把callback设置成dataId的值。
publishTimeNumberN13发表时间,UNIX 时间戳(毫秒值)
callbackUrlStringN256人工审核结果回调通知到客户的URL。主动回调数据接口超时时间设置为2s,为了保证顺利接收数据,需保证接收接口性能稳定并且保证幂等性。

响应结果

响应字段如下,响应通用字段已省略,详细见响应通用字段

result 数据结构

参数名称类型描述
actionNumber检测结果,0:通过,1:嫌疑,2:不通过
taskIdString本次请求数据标识,可以根据该标识查询数据最新结果
labelsjson数组分类信息

labels 数据结构

参数名称类型描述
labelNumber分类信息,100:色情,200:广告,400:违禁,500:涉政,600:谩骂,700:灌水,900:其他
levelNumber分类级别,1:不确定,2:确定
detailsjson对象其他信息

details 数据结构

参数名称类型描述
hintjson数组线索信息,用于定位文本中有问题的部分,辅助人工审核
hitInfosjson数组线索详细信息

hitInfos 数据结构

参数名称类型描述
hitTypeNumber线索分类信息,返回10:表示命中用户自定义添加用户名单,返回11:表示命中用户自定义添加ip名单,返回30:表示命中用户自定义添加敏感词

请求示例

    /** 产品密钥ID,产品标识 */
    private final static String SECRETID = "your_secret_id";
    /** 产品私有密钥,服务端生成签名信息使用,请严格保管,避免泄露 */
    private final static String SECRETKEY = "your_secret_key";
    /** 业务ID,易盾根据产品业务特点分配 */
    private final static String BUSINESSID = "your_business_id";
    /** 易盾内容安全文本在线检测接口地址 */
    private final static String API_URL = "https://as.dun.163yun.com/v3/text/check";
    /** 实例化HttpClient,发送http请求使用,可根据需要自行调参 */
    private static HttpClient httpClient = HttpClient4Utils.createHttpClient(100, 20, 2000, 2000, 2000);

    /**
     *
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        Map<String, String> params = new HashMap<String, String>();
        // 1.设置公共参数
        params.put("secretId", SECRETID);
        params.put("businessId", BUSINESSID);
        params.put("version", "v3.1");
        params.put("timestamp", String.valueOf(System.currentTimeMillis()));
        params.put("nonce", String.valueOf(new Random().nextInt()));

        // 2.设置私有参数
        params.put("dataId", "ebfcad1c-dba1-490c-b4de-e784c2691768");
        params.put("content", "易盾测试内容!v3接口!");
        // params.put("dataType", "1");
        // params.put("ip", "123.115.77.137");
        // params.put("account", "java@163.com");
        // params.put("deviceType", "4");
        // params.put("deviceId", "92B1E5AA-4C3D-4565-A8C2-86E297055088");
        // params.put("callback", "ebfcad1c-dba1-490c-b4de-e784c2691768");
        // params.put("publishTime", String.valueOf(System.currentTimeMillis()));

        // 3.生成签名信息
        String signature = SignatureUtils.genSignature(SECRETKEY, params);
        params.put("signature", signature);

        // 4.发送HTTP请求,这里使用的是HttpClient工具包,产品可自行选择自己熟悉的工具包发送请求
        String response = HttpClient4Utils.sendPost(httpClient, API_URL, params, Consts.UTF_8);

        // 5.解析接口返回值
        JsonObject jObject = new JsonParser().parse(response).getAsJsonObject();
        int code = jObject.get("code").getAsInt();
        String msg = jObject.get("msg").getAsString();
        if (code == 200) {
            JsonObject resultObject = jObject.getAsJsonObject("result");
            int action = resultObject.get("action").getAsInt();
            String taskId = resultObject.get("taskId").getAsString();
            JsonArray labelArray = resultObject.getAsJsonArray("labels");
            /*for (JsonElement labelElement : labelArray) {
                JsonObject lObject = labelElement.getAsJsonObject();
                int label = lObject.get("label").getAsInt();
                int level = lObject.get("level").getAsInt();
                JsonObject detailsObject=lObject.getAsJsonObject("details");
                JsonArray hintArray=detailsObject.getAsJsonArray("hint");
            }*/
            if (action == 0) {
                System.out.println(String.format("taskId=%s,文本机器检测结果:通过", taskId));
            } else if (action == 1) {
                System.out.println(String.format("taskId=%s,文本机器检测结果:嫌疑,需人工复审,分类信息如下:%s", taskId, labelArray.toString()));
            } else if (action == 2) {
                System.out.println(String.format("taskId=%s,文本机器检测结果:不通过,分类信息如下:%s", taskId, labelArray.toString()));
            }
        } else {
            System.out.println(String.format("ERROR: code=%s, msg=%s", code, msg));
        }

    }
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""云安全(易盾)文本在线检测接口python示例代码
接口文档: http://dun.163.com/api.html
python版本:python2.7
运行:
    1. 修改 SECRET_ID,SECRET_KEY,BUSINESS_ID 为对应申请到的值
    2. $ python text_check_api_demo.py
"""
__author__ = 'yidun-dev'
__date__ = '2016/3/10'
__version__ = '0.1-dev'

import hashlib
import time
import random
import urllib
import urllib2
import json

class TextCheckAPIDemo(object):
    """文本在线检测接口示例代码"""
    API_URL = "https://as.dun.163yun.com/v3/text/check"
    VERSION = "v3.1"

    def __init__(self, secret_id, secret_key, business_id):
        """
        Args:
            secret_id (str) 产品密钥ID,产品标识
            secret_key (str) 产品私有密钥,服务端生成签名信息使用
            business_id (str) 业务ID,易盾根据产品业务特点分配
        """
        self.secret_id = secret_id
        self.secret_key = secret_key
        self.business_id = business_id

    def gen_signature(self, params=None):
        """生成签名信息
        Args:
            params (object) 请求参数
        Returns:
            参数签名md5值
        """
        buff = ""
        for k in sorted(params.keys()):
            buff += str(k)+ str(params[k])
        buff += self.secret_key
        return hashlib.md5(buff).hexdigest()

    def check(self, params):
        """请求易盾接口
        Args:
            params (object) 请求参数
        Returns:
            请求结果,json格式
        """
        params["secretId"] = self.secret_id
        params["businessId"] = self.business_id
        params["version"] = self.VERSION
        params["timestamp"] = int(time.time() * 1000)
        params["nonce"] = int(random.random()*100000000)
        params["signature"] = self.gen_signature(params)

        try:
            params = urllib.urlencode(params)
            request = urllib2.Request(self.API_URL, params)
            content = urllib2.urlopen(request, timeout=1).read()
            return json.loads(content)
        except Exception, ex:
            print "调用API接口失败:", str(ex)

if __name__ == "__main__":
    """示例代码入口"""
    SECRET_ID = "your_secret_id" # 产品密钥ID,产品标识
    SECRET_KEY = "your_secret_key" # 产品私有密钥,服务端生成签名信息使用,请严格保管,避免泄露
    BUSINESS_ID = "your_business_id" # 业务ID,云安全(易盾)根据产品业务特点分配
    text_api = TextCheckAPIDemo(SECRET_ID, SECRET_KEY, BUSINESS_ID)

    params = {
        "dataId": "ebfcad1c-dba1-490c-b4de-e784c2691768",
        "content": "易盾测试内容!"
        # "dataType": "1",
        # "ip": "123.115.77.137",
        # "account": "python@163.com",
        # "deviceType": "4",
        # "deviceId": "92B1E5AA-4C3D-4565-A8C2-86E297055088",
        # "callback": "ebfcad1c-dba1-490c-b4de-e784c2691768",
        # "publishTime": str(int(time.time() * 1000))
    }
    ret = text_api.check(params)
    if ret["code"] == 200:
        action = ret["result"]["action"]
        taskId = ret["result"]["taskId"]
        labelArray=json.dumps(ret["result"]["labels"],ensure_ascii=False)
        if action == 0:
            print "taskId=%s,文本机器检测结果:通过" % (taskId)
        elif action == 1:
            print "taskId=%s,文本机器检测结果:嫌疑,需人工复审,分类信息如下:%s" %(taskId,labelArray)
        elif action == 2:
            print "taskId=%s,文本机器检测结果:不通过,分类信息如下:%s" % (taskId,labelArray)
    else:
        print "ERROR: ret.code=%s, ret.msg=%s" % (ret["code"], ret["msg"])
<?php
/** 产品密钥ID,产品标识 */
define("SECRETID", "your_secret_id");
/** 产品私有密钥,服务端生成签名信息使用,请严格保管,避免泄露 */
define("SECRETKEY", "your_secret_key");
/** 业务ID,易盾根据产品业务特点分配 */
define("BUSINESSID", "your_business_id");
/** 易盾内容安全服务文本在线检测接口地址 */
define("API_URL", "https://as.dun.163yun.com/v3/text/check");
/** api version */
define("VERSION", "v3.1");
/** API timeout*/
define("API_TIMEOUT", 2);
/** php内部使用的字符串编码 */
define("INTERNAL_STRING_CHARSET", "auto");

/**
 * 计算参数签名
 * $params 请求参数
 * $secretKey secretKey
 */
function gen_signature($secretKey, $params){
    ksort($params);
    $buff="";
    foreach($params as $key=>$value){
        if($value !== null) {
           $buff .=$key;
           $buff .=$value;
        }
    }
    $buff .= $secretKey;
    return md5($buff);
}

/**
 * 将输入数据的编码统一转换成utf8
 * @params 输入的参数
 */
function toUtf8($params){
    $utf8s = array();
    foreach ($params as $key => $value) {
        $utf8s[$key] = is_string($value) ? mb_convert_encoding($value, "utf8", INTERNAL_STRING_CHARSET) : $value;
    }
    return $utf8s;
}

/**
 * 内容安全请求接口简单封装
 * $params 请求参数
 */
function check($params){
    $params["secretId"] = SECRETID;
    $params["businessId"] = BUSINESSID;
    $params["version"] = VERSION;
    $params["timestamp"] = sprintf("%d", round(microtime(true)*1000));// time in milliseconds
    $params["nonce"] = sprintf("%d", rand()); // random int

    $params = toUtf8($params);
    $params["signature"] = gen_signature(SECRETKEY, $params);
    // var_dump($params);

    $options = array(
        'http' => array(
            'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
            'method'  => 'POST',
            'timeout' => API_TIMEOUT, // read timeout in seconds
            'content' => http_build_query($params),
        ),
    );
    $context  = stream_context_create($options);
    $result = file_get_contents(API_URL, false, $context);
    if($result === FALSE){
        return array("code"=>500, "msg"=>"file_get_contents failed.");
    }else{
        return json_decode($result, true);
    }
}

// 简单测试
function main(){
    echo "mb_internal_encoding=".mb_internal_encoding()."\n";
    $params = array(
        "dataId"=>"ebfcad1c-dba1-490c-b4de-e784c2691768",
        "content"=>"易盾测试内容!v3接口!"
        // "dataType"=>"1",
        // "ip"=>"123.115.77.137",
        // "account"=>"php@163.com",
        // "deviceType"=>"4",
        // "deviceId"=>"92B1E5AA-4C3D-4565-A8C2-86E297055088",
        // "callback"=>"ebfcad1c-dba1-490c-b4de-e784c2691768",
        // "publishTime"=>round(microtime(true)*1000)
    );

    $ret = check($params);
    var_dump($ret);
    if ($ret["code"] == 200) {
        $action = $ret["result"]["action"];
        $taskId = $ret["result"]["taskId"];
        $labelArray = $ret["result"]["labels"];
               if ($action == 0) {
            echo "taskId={$taskId},文本机器检测结果:通过\n";
              } else if ($action == 1) {
                  echo "taskId={$taskId},文本机器检测结果:嫌疑,需人工复审,分类信息如下:".json_encode($labelArray)."\n";
        } else if ($action == 2) {
            echo "taskId={$taskId},文本机器检测结果:不通过,分类信息如下:".json_encode($labelArray)."\n";
        }
        }else{
            var_dump($ret); // error handler
        }
}

main();
?>
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Net.Http;

namespace Com.Netease.Is.Antispam.Demo
{
    class TextCheckApiDemo
    {
        public static void textCheck()
        {
            /** 产品密钥ID,产品标识 */
            String secretId = "your_secret_id";
            /** 产品私有密钥,服务端生成签名信息使用,请严格保管,避免泄露 */
            String secretKey = "your_secret_key";
            /** 业务ID,易盾根据产品业务特点分配 */
            String businessId = "your_business_id";
            /** 易盾内容安全服务文本在线检测接口地址 */
            String apiUrl = "https://as.dun.163yun.com/v3/text/check";
            Dictionary<String, String> parameters = new Dictionary<String, String>();

            long curr = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
            String time = curr.ToString();

            // 1.设置公共参数
            parameters.Add("secretId", secretId);
            parameters.Add("businessId", businessId);
            parameters.Add("version", "v3.1");
            parameters.Add("timestamp", time);
            parameters.Add("nonce", new Random().Next().ToString());

            // 2.设置私有参数
            parameters.Add("dataId", "ebfcad1c-dba1-490c-b4de-e784c2691768");
            parameters.Add("content", "易盾测试内容!v3接口!");
            // parameters.Add("dataType", "1");
            // parameters.Add("ip", "123.115.77.137");
            // parameters.Add("account", "csharp@163.com");
            // parameters.Add("deviceType", "4");
            // parameters.Add("deviceId", "92B1E5AA-4C3D-4565-A8C2-86E297055088");
            // parameters.Add("callback", "ebfcad1c-dba1-490c-b4de-e784c2691768");
            // parameters.Add("publishTime", time);

            // 3.生成签名信息
            String signature = Utils.genSignature(secretKey, parameters);
            parameters.Add("signature", signature);

            // 4.发送HTTP请求
            HttpClient client = Utils.makeHttpClient();
            String result = Utils.doPost(client, apiUrl, parameters, 1000);
            Console.WriteLine(result);
            if(result != null)
            {
                JObject ret = JObject.Parse(result);
                int code = ret.GetValue("code").ToObject<Int32>();
                String msg = ret.GetValue("msg").ToObject<String>();
                if (code == 200)
                {
                    JObject resultObject = (JObject)ret["result"];
                    String taskId = resultObject["taskId"].ToObject<String>();
                    int action = resultObject["action"].ToObject<Int32>();
                    JArray labelArray = (JArray)resultObject.SelectToken("labels");
                    if (action == 0)
                    {
                        Console.WriteLine(String.Format("taskId={0},文本机器检测结果:通过", taskId));
                    }
                    else if (action == 1)
                    {
                        Console.WriteLine(String.Format("taskId={0},文本机器检测结果:嫌疑,需人工复审,分类信息如下:{1}", taskId, labelArray));
                    }
                    else if (action == 2)
                    {
                        Console.WriteLine(String.Format("taskId={0},文本机器检测结果:不通过,分类信息如下:{1}", taskId, labelArray));
                    }
                }
                else
                {
                    Console.WriteLine(String.Format("ERROR: code={0}, msg={1}", code, msg));
                }
            }
            else
            {
                Console.WriteLine("Request failed!");
            }

        }
    }
}
var utils=require("./utils");
//产品密钥ID,产品标识
var secretId="your_secret_id";
// 产品私有密钥,服务端生成签名信息使用,请严格保管,避免泄露
var secretKey="your_secret_key";
// 业务ID,易盾根据产品业务特点分配
var businessId="your_business_id";
// 易盾内容安全服务文本在线检测接口地址
var apiurl="https://as.dun.163yun.com/v3/text/check";
//请求参数
var post_data = {
    // 1.设置公有有参数
    secretId:secretId,
    businessId:businessId,
    version:"v3.1",
    timestamp:new Date().getTime(),
    nonce:utils.noncer(),
    // 2.设置私有参数
    dataId:"ebfcad1c-dba1-490c-b4de-e784c2691768",
    content:"易盾测试内容!v3接口!"
    // ip:"123.115.77.137",
    // dataType:"1",
    // account:"nodejs@163.com",
    // deviceType:"4",
    // deviceId:"92B1E5AA-4C3D-4565-A8C2-86E297055088",
    // callback:"ebfcad1c-dba1-490c-b4de-e784c2691768",
    // publishTime:new Date().getTime()
};
var signature=utils.genSignature(secretKey,post_data);
post_data.signature=signature;
//http请求结果
var responseCallback=function(responseData){
    var data = JSON.parse(responseData);
    var code=data.code;
    var msg=data.msg;
    if(code==200){
        var result=data.result;
        var taskId=result.taskId;
        var action=result.action;
        var labelArray=result.labels;
        if(action==0){
            console.log("taskId="+taskId+",文本机器检测结果:通过")
        }else if(action==1){
            console.log("taskId="+taskId+",文本机器检测结果:嫌疑,需人工复审,分类信息如下:"+JSON.stringify(labelArray))
        }else if(action==2){
            console.log("taskId="+taskId+",文本机器检测结果:不通过,分类信息如下:"+JSON.stringify(labelArray))
        }
    }else{
         console.log('ERROR:code=' + code+',msg='+msg);
    }
}
utils.sendHttpRequest(apiurl,"POST",post_data,responseCallback);

响应示例

结果为不通过时,输出示例如下:

{
    "code": 200,
    "msg": "ok",
    "result": {
        "taskId": "079560a6c9f34783bdce47e168510038",
        "action": 2,
        "labels": [
            {
                "label": 100,
                "level": 2,
                "details": {
                    "hint": [
                        "xxx",
                        "ooo"
                    ],
                    "hitInfos": [
                        {
                            "hitType": 30
                        }
                    ]
                }
            }
        ]
    }
}

结果为通过时,输出示例如下:

{
    "code": 200,
    "msg": "ok",
    "result": {
        "taskId": "079560a6c9f34783bdce47e168510038",
        "action": 0,
        "labels": [
            
        ]
    }
}
Online Chat Tel:95163223