点播信息提交接口

接口地址

http://as.dun.163yun.com/v3/video/submit

接口描述

提交点播视频相关信息接口,信息提交后,易盾会根据客户自己设置的截图频率对点播视频进行截图检测,检测结果需产品自行定期调用视频结果获取接口获取。

支持格式

检测接口支持的视频封装格式:flv、mkv 、mp4 、rmvb 、avi 、wmv、3gp、ts、mov等。

大小限制

视频大小限制:<5G。

请求参数

公共参数已省略,详细见 请求公共参数

基本参数

参数名称类型是否必选最大长度描述
urlStringY512点播视频地址
dataIdStringY128点播视频唯一标识
versionStringY4接口版本号,可选值 v3.1
titleStringN512视频名称
callbackStringN512数据回调参数,产品根据业务情况自行设计,当获取离线检测结果时,易盾内容安全服务会返回该字段
callbackUrlStringN256离线结果回调通知到客户的URL。主动回调数据接口超时时间设置为2s,为了保证顺利接收数据,需保证接收接口性能稳定并且保证幂等性。
uniqueKeyStringN256客户个性化视频唯一性标识,传入后,将以此值作为重复检测依据,若不传,默认以URL作为查重依据

业务扩展参数

业务扩展参数,有助于通过业务维度辅助反垃圾结果判定

参数名称类型是否必选最大长度描述
accountStringN128用户唯一标识
ipStringN128用户 IP 地址

截帧频率指定

参数名称类型是否必选最大长度描述
scFrequencyNumberN4默认截帧设置,默认5秒截图检测一次,可设置范围为0.5~600秒
advancedFrequencyjson字符串N128高级截帧设置,此项填写,默认截帧策略失效

advancedFrequency字符串数据结构

参数名称类型是否必选最大长度描述
durationPoints数组Y5视频时长区间分割,单位为秒
frequencies数组Y6视频时长区间对应的截帧频率,可设置范围为0.5~600秒

高级截帧配置说明

◆ 高级截帧配置适用于需要根据视频时长,设定不同截帧频率的场景,例如您需将5分钟以内的视频按照1s/帧截图,5分钟-10分钟的视频按照5s/帧截图,大于10分钟的视频按照10s/帧截图,advancedFrequency字符串应传入:

{

"durationPoints":[300,600],

"frequencies":[1,5,10]

}

◆ 高级截帧频率配置后,默认截帧频率即失效

响应结果

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

参数名称类型描述
taskIdString本次请求数据标识,可以根据该标识查询数据最新结果
statusNumber检测结果,0:成功,1:失败
dealingCountNumber缓冲池排队待处理数据量

缓冲池排队待处理量说明

为减少用户重试,优化用户体验,易盾为点播视频用户提供了缓冲池功能,点播视频正式的并发处理为30路,提交超并发后即自动进入缓冲池排队过检,您可以根据缓冲池排队积压量评估您目前的并发处理速度是否合适,如需调整处理并发请联系您的专属商务处理。

请求示例

/*
 * @(#) VideoSubmitAPIDemo.java 2016年8月23日
 *
 * Copyright 2010 NetEase.com, Inc. All rights reserved.
 */
package com.netease.is.antispam.demo.v3;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import org.apache.http.Consts;
import org.apache.http.client.HttpClient;

import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.netease.is.antispam.demo.utils.HttpClient4Utils;
import com.netease.is.antispam.demo.utils.SignatureUtils;

/**
 * 调用易盾内容安全服务视频点播信息提交接口API示例,该示例依赖以下jar包:
 * 1. httpclient,用于发送http请求
 * 2. commons-codec,使用md5算法生成签名信息,详细见SignatureUtils.java
 * 3. gson,用于做json解析
 *
 * @author hzdingyong
 * @version 2016年8月23日
 */
public class VideoSubmitAPIDemo {
    /** 产品密钥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 = "http://as.dun.163yun.com/v3/video/submit";
    /** 实例化HttpClient,发送http请求使用,可根据需要自行调参 */
    private static HttpClient httpClient = HttpClient4Utils.createHttpClient(100, 20, 1000, 1000, 1000);

    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");
        params.put("timestamp", String.valueOf(System.currentTimeMillis()));
        params.put("nonce", String.valueOf(new Random().nextInt()));

        // 2.设置私有参数
        params.put("url", "http://xxx.xxx.com/xxxx");
        params.put("dataId", "fbfcad1c-dba1-490c-b4de-e784c2691765");
        // params.put("callback", "{\"p\":\"xx\"}");
        // params.put("scFrequency", "5");

        // 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 result = jObject.getAsJsonObject("result");
            int status = result.get("status").getAsInt();
            String taskId = result.get("taskId").getAsString();
            if (status == 0) {
                System.out.println(String.format("推送成功!taskId=%s", taskId));
            } else {
                System.out.println(String.format("推送失败!taskId=%s", taskId));
            }
        } 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版本:python3.7
运行:
    1. 修改 SECRET_ID,SECRET_KEY 为对应申请到的值
    2. $ python videosolution_submit.py
"""
__author__ = 'yidun-dev'
__date__ = '2019/11/27'
__version__ = '0.2-dev'

import hashlib
import time
import random
import urllib.request as urlrequest
import urllib.parse as urlparse
import json


class VideoSolutionSubmitAPIDemo(object):
    """点播音视频解决方案检测提交接口示例代码"""

    API_URL = "http://as.dun.163yun.com/v1/videosolution/submit"
    VERSION = "v1"

    def __init__(self, secret_id, secret_key):
        """
        Args:
            secret_id (str) 产品密钥ID,产品标识
            secret_key (str) 产品私有密钥,服务端生成签名信息使用
        """
        self.secret_id = secret_id
        self.secret_key = secret_key

    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.encode("utf8")).hexdigest()

    def check(self, params):
        """请求易盾接口
        Args:
            params (object) 请求参数
        Returns:
            请求结果,json格式
        """
        params["secretId"] = self.secret_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 = urlparse.urlencode(params).encode("utf8")
            request = urlrequest.Request(self.API_URL, params)
            content = urlrequest.urlopen(request, timeout=1).read()
            return json.loads(content)
        except Exception as ex:
            print("调用API接口失败:", str(ex))


if __name__ == "__main__":
    """示例代码入口"""
    SECRET_ID = "your_secret_id"  # 产品密钥ID,产品标识
    SECRET_KEY = "your_secret_key"  # 产品私有密钥,服务端生成签名信息使用,请严格保管,避免泄露
    api = VideoSolutionSubmitAPIDemo(SECRET_ID, SECRET_KEY)

    # 私有请求参数
    # images: list = []
    # image1 = {
    #     "name": "http://p1.music.126.net/lEQvXzoC17AFKa6yrf-ldA==/1412872446212751.jpg",
    #     "type": 1,
    #     "data": "http://p1.music.126.net/lEQvXzoC17AFKa6yrf-ldA==/1412872446212751.jpg"
    # }
    # image2 = {
    #     "name": "{\"imageId\": 33451123, \"contentId\": 78978}",
    #     "type": 2,
    #     "data": "xxx"
    # }
    # images.append(image1)
    # images.append(image2)
    params = {
        "dataId": "fbfcad1c-dba1-490c-b4de-e784c2691765",
        "url": "http://xxx.xx",
        # "images": json.dumps(images)
    }

    ret = api.check(params)

    code: int = ret["code"]
    msg: str = ret["msg"]
    if code == 200:
        result: dict = ret["result"]
        taskId: str = result["taskId"]
        dataId: str = result["dataId"]
        print("SUBMIT SUCCESS: taskId=%s, dataId=%s" % (taskId, dataId))
    else:
        print("ERROR: code=%s, 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", "http://as.dun.163yun.com/v3/video/submit");
/** api version */
define("VERSION", "v3");
/** API timeout*/
define("API_TIMEOUT", 1);
require("../util.php");

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

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

	$result = curl_post($params, API_URL, API_TIMEOUT);
	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"=>"fbfcad1c-dba1-490c-b4de-e784c2691765",
		"url"=>"http://xxx.xxx.com/xxxx"
		// "callback"=>"{\"p\":\"xx\"}",
	);

	$ret = check($params);
	var_dump($ret);
	if ($ret["code"] == 200) {
		$result = $ret["result"];
        // status 0:成功,1:失败
        $status = $result["status"];
        $taskId = $result["taskId"];
        if($status === 0){
            echo "提交成功,taskId=".$taskId;
        }else{
            echo "提交失败,taskId=".$taskId;
        }
    }else{
    	var_dump($ret);
    }
}

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

namespace Com.Netease.Is.Antispam.Demo
{
    class VideoSubmitApiDemo
    {

        public static void videoSubmit()
        {
            /** 产品密钥ID,产品标识 */
            String secretId = "your_secret_id";
            /** 产品私有密钥,服务端生成签名信息使用,请严格保管,避免泄露 */
            String secretKey = "your_secret_key";
            /** 业务ID,易盾根据产品业务特点分配 */
            String businessId = "your_business_id";
            /** 易盾内容安全服务视频点播信息提交接口地址  */
            String apiUrl = "http://as.dun.163yun.com/v3/video/submit";
            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");
            parameters.Add("timestamp", time);
            parameters.Add("nonce", new Random().Next().ToString());

            // 2.设置私有参数
            parameters.Add("url", "http://xxx.xxx.com/xxxx");
            parameters.Add("dataId", "fbfcad1c-dba1-490c-b4de-e784c2691765");
            // parameters.Add("callback", "{\"p\":\"xx\"}");
            // parameters.Add("scFrequency", "5");

            // 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);
            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 status = resultObject["status"].ToObject<Int32>();
                    if(status == 0)
                    {
                        Console.WriteLine("推送成功!");
                    }
                    else
                    {
                        Console.WriteLine("推送失败!");
                    }

                }
                else
                {
                    Console.WriteLine(String.Format("ERROR: code={0}, msg={1}", code, msg));
                }
            }
            else
            {
                Console.WriteLine("Request failed!");
            }

        }
    }
}
/**
 * 易盾工具集合,包含:
 * 1:noncer 产生随机整数
 * 2:genSignature 生成Md5签名
 * 3:sendHttpRequest 发送http请求
 */
var utils=(function(){
    var http = require('https');
    var urlutil=require('url');
    var querystring = require('querystring');
    var crypto = require('crypto');
    //产生随机整数--工具方法
    var noncer=function(){
        var range=function(start,end){
            var array=[];
            for(var i=start;i<end;++i){
                array.push(i);
            }
            return array;
        };
        var nonce = range(0,6).map(function(x){
            return Math.floor(Math.random()*10);
        }).join('');
        return nonce;
    };
    //生成签名算法--工具方法
    var genSignature=function(secretKey,paramsJson){
        var sorter=function(paramsJson){
            var sortedJson={};
            var sortedKeys=Object.keys(paramsJson).sort();
            for(var i=0;i<sortedKeys.length;i++){
                sortedJson[sortedKeys[i]] = paramsJson[sortedKeys[i]]
            }
            return sortedJson;
        }
        var sortedParam=sorter(paramsJson);
        var needSignatureStr="";
        for(var key in sortedParam){
            var value=sortedParam[key];
            needSignatureStr=needSignatureStr+key+value;
        }
        needSignatureStr+=secretKey;
        var md5er = crypto.createHash('md5');//MD5加密工具
        md5er.update(needSignatureStr,"UTF-8");
        return md5er.digest('hex');
    };
    //发送post请求
    var sendHttpRequest=function(url,type,data,callback){
        var content = querystring.stringify(data,null,null,null);
        var urlObj=urlutil.parse(url);
        var host=urlObj.hostname;
        var path=urlObj.path;
        var port=urlObj.port;
        var options = {
                hostname: host,
                port: port,
                path: path,
                method: type,
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
                    'Content-Length': Buffer.byteLength(content)
                }
            };
        var responseData="";
        var req = http.request(options, function (res) {
            res.setEncoding('utf8');
            res.on('data', function (chunk) {
                responseData+=chunk;
            });
            res.on('end', function () {
                callback(responseData);
            });
            //设置超时
            req.setTimeout(1000,function(){
                console.log('request timeout!');
                req.abort();
            });
            req.on('error', function (e) {
                console.log('request ERROR: ' + e.message);
            });
        });
        req.write(content);
        req.end();
    };
    return {
        noncer:noncer,
        genSignature:genSignature,
        sendHttpRequest:sendHttpRequest
    }
})();
//产品密钥ID,产品标识
var secretId="your_secret_id";
// 产品私有密钥,服务端生成签名信息使用,请严格保管,避免泄露
var secretKey="your_secret_key";
// 业务ID,易盾根据产品业务特点分配
var businessId="your_business_id";
// 易盾内容安全服务视频点播信息提交接口地址
var apiurl="http://as.dun.163yun.com/v3/video/submit";
//请求参数
var post_data = {
    // 1.设置公有有参数
    secretId:secretId,
    businessId:businessId,
    version:"v3",
    timestamp:new Date().getTime(),
    nonce:utils.noncer(),
    // 2.设置私有参数
    dataId:"myid",
    url:"www.xxxx.com/xxx"
    // callback:"mycallback",
    // scFrequency:"1"
};
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;
        if(result){
            console.log("推送成功");
        }else{
            console.log("推送失败");
        }
    }else{
         console.log('ERROR:code=' + code+',msg='+msg);
    }

}
utils.sendHttpRequest(apiurl,"POST",post_data,responseCallback);
/*
@Author : yidun_dev
@Date : 2020-01-20
@File : video_submit.go
@Version : 1.0
@Golang : 1.13.5
@Doc : http://dun.163.com/api.html
*/
package main

import (
	"crypto/md5"
	"encoding/hex"
	"encoding/json"
	"fmt"
	simplejson "github.com/bitly/go-simplejson"
	"io/ioutil"
	"math/rand"
	"net/http"
	"net/url"
	"sort"
	"strconv"
	"strings"
	"time"
)

const (
	apiUrl     = "http://as.dun.163yun.com/v3/video/submit"
	version    = "v3"
	secretId   = "your_secret_id"   //产品密钥ID,产品标识
	secretKey  = "your_secret_key"  //产品私有密钥,服务端生成签名信息使用,请严格保管,避免泄露
	businessId = "your_business_id" //业务ID,易盾根据产品业务特点分配
)

//请求易盾接口
func check(params url.Values) *simplejson.Json {
	params["secretId"] = []string{secretId}
	params["businessId"] = []string{businessId}
	params["version"] = []string{version}
	params["timestamp"] = []string{strconv.FormatInt(time.Now().UnixNano()/1000000, 10)}
	params["nonce"] = []string{strconv.FormatInt(rand.New(rand.NewSource(time.Now().UnixNano())).Int63n(10000000000), 10)}
	params["signature"] = []string{genSignature(params)}

	resp, err := http.Post(apiUrl, "application/x-www-form-urlencoded", strings.NewReader(params.Encode()))

	if err != nil {
		fmt.Println("调用API接口失败:", err)
		return nil
	}

	defer resp.Body.Close()

	contents, _ := ioutil.ReadAll(resp.Body)
	result, _ := simplejson.NewJson(contents)
	return result
}

//生成签名信息
func genSignature(params url.Values) string {
	var paramStr string
	keys := make([]string, 0, len(params))
	for k := range params {
		keys = append(keys, k)
	}
	sort.Strings(keys)
	for _, key := range keys {
		paramStr += key + params[key][0]
	}
	paramStr += secretKey
	md5Reader := md5.New()
	md5Reader.Write([]byte(paramStr))
	return hex.EncodeToString(md5Reader.Sum(nil))
}

func main() {
	params := url.Values{
		"dataId": []string{"fbfcad1c-dba1-490c-b4de-e784c2691765"},
		"url":    []string{"http://xxx.xxx.com/xxxx"},
		//"callback": []string{"{\"p\":\"xx\"}"},
		//"scFrequency": []string{"5"},
		//"callbackUrl": []string{"http://***"},  //主动回调地址url,如果设置了则走主动回调逻辑
	}

	ret := check(params)

	code, _ := ret.Get("code").Int()
	message, _ := ret.Get("msg").String()
	if code == 200 {
		result, _ := ret.Get("result").Map()
		status, _ := result["status"].(json.Number).Int64()
		taskId := result["taskId"].(string)
		if status == 0 {
			fmt.Printf("推送成功!, taskId: %s", taskId)
		} else {
			fmt.Printf("推送失败!")
		}
	} else {
		fmt.Printf("ERROR: code=%d, msg=%s", code, message)
	}
}

响应示例

输出结果:

{
    "code": 200,
    "msg": "ok",
    "result": {
        "taskId": "8965560a6c9f34783bdce47e16858458",
        "status": 0
    }
}
QQ咨询:反馈更及时 在线咨询 电话咨询:95163223