添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
威武的马铃薯  ·  Set-PSReadLineOption ...·  2 天前    · 
玩足球的莴苣  ·  spring 4 ...·  4 小时前    · 
爱逃课的小狗  ·  关于vue-select ...·  10 月前    · 

Hi,您好,欢迎使用有道智云文档翻译API接口服务。

本文档主要针对需要集成HTTP API的技术开发工程师,详细描述文档翻译能力相关的技术内容。

如果您有与我们商务合作的需求,可以通过以下方式联系我们:

商务邮箱: [email protected]

如果您对文档内容有任何疑问,可以通过以下几种方式联系我们:

客服QQ:1906538062

智云翻译技术交流QQ 1群: 652880659

智云翻译技术交流QQ 2群: 669384425

智云翻译技术交流QQ 3群: 807539209

智云翻译技术交流QQ 4群: 936752411

联系邮箱: [email protected]

温馨提示:

  • 本文档主要针对开发人员,接入测试前需要获取应用ID和应用密钥;如果您还没有,请按照 新手指南 获取。
  • 平台向每个账户赠送50元的体验金,供用户集成前测试所用,具体资费规则详见 文档翻译服务报价
  • 文档翻译API接口提供有道的文档翻译服务。您只需要通过调用文档翻译API,传入文档的Base64编码,指定源语言与目标语言,通过POST请求方式,就可以将文档中的文字内容进行翻译。

    文档翻译 API HTTPS地址:

  • 文档上传接口
  • https://openapi.youdao.com/file_trans/upload

  • 进度查询接口
  • https://openapi.youdao.com/file_trans/query

  • 文档下载接口
  • https://openapi.youdao.com/file_trans/download

    调用方在集成文本翻译API时,请遵循以下规则。

    HTTPS 统一使用UTF-8 编码

    接口调用参数

    调用API需要向接口发送以下字段来访问服务。

  • 文档上传接口
  • input = Base64(q)字符串 (当Base64(q)长度小于等于20) input = Base64(q)前10个字符前10个字符 + Base64(q)长度 + Base64(q)后十个字符 (当Base64(q)长度大于20)

    input = flownumber字符串 (当flownumber长度小于等于20)。 input = flownumber前10个字符前10个字符 + flownumber长度 + flownumber后十个字符 (当flownumber长度大于20)

    不同语言获取时间戳,请参看 此链接

    如果对签名有疑问,可以参看文档末尾各语言demo。

    返回的结果是json格式,具体说明如下:

    import org.apache.http.Header;
    import org.apache.http.HttpEntity;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import java.io.*;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.util.*;
    public class Demo {
        private static Logger logger = LoggerFactory.getLogger(Demo.class);
        private static final String YOUDAO_URL_UPLOAD = "https://openapi.youdao.com/file_trans/upload";
        private static final String YOUDAO_URL_QUERY = "https://openapi.youdao.com/file_trans/query";
        private static final String YOUDAO_URL_DOWNLOAD = "https://openapi.youdao.com/file_trans/download";
        private static final String APP_KEY = "您的应用ID";
        private static final String APP_SECRET = "您的应用密钥";
        public static void main(String[] args) throws IOException {
            upload();
            query();
            download();
        public static void upload() throws IOException {
            Map<String,String> params = new HashMap<String,String>();
            String q = loadAsBase64("文件的路径");
            String salt = String.valueOf(System.currentTimeMillis());
            String curtime = String.valueOf(System.currentTimeMillis() / 1000);
            String signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRET;
            String sign = getDigest(signStr);
            params.put("q", q);
            params.put("fileName", "文件名称");
            params.put("fileType", "文件类型");
            params.put("langFrom", "源语言");
            params.put("langTo", "目标语言");
            params.put("appKey", APP_KEY);
            params.put("salt", salt);
            params.put("curtime", curtime);
            params.put("sign", sign);
            params.put("docType", "json");
            params.put("signType", "v3");
            String result = requestForHttp(YOUDAO_URL_UPLOAD, params);
            /** 处理结果 */
            System.out.println(result);
        public static void query() throws IOException {
            Map<String,String> params = new HashMap<String,String>();
            String flownumber = "文件流水号";
            String salt = String.valueOf(System.currentTimeMillis());
            String curtime = String.valueOf(System.currentTimeMillis() / 1000);
            String signStr = APP_KEY + truncate(flownumber) + salt + curtime + APP_SECRET;
            String sign = getDigest(signStr);
            params.put("flownumber", flownumber);
            params.put("appKey", APP_KEY);
            params.put("salt", salt);
            params.put("curtime", curtime);
            params.put("sign", sign);
            params.put("docType", "json");
            params.put("signType", "v3");
            String result = requestForHttp(YOUDAO_URL_QUERY, params);
            /** 处理结果 */
            System.out.println(result);
        public static void download() throws IOException {
            Map<String,String> params = new HashMap<String,String>();
            String flownumber = "文件流水号";
            String salt = String.valueOf(System.currentTimeMillis());
            String curtime = String.valueOf(System.currentTimeMillis() / 1000);
            String signStr = APP_KEY + truncate(flownumber) + salt + curtime + APP_SECRET;
            String sign = getDigest(signStr);
            params.put("flownumber", flownumber);
            params.put("downloadFileType", "文件下载类型");
            params.put("appKey", APP_KEY);
            params.put("salt", salt);
            params.put("curtime", curtime);
            params.put("sign", sign);
            params.put("docType", "json");
            params.put("signType", "v3");
            String result = requestForHttp(YOUDAO_URL_DOWNLOAD, params);
            /** 处理结果 */
            System.out.println(result);
        public static String requestForHttp(String url,Map<String,String> params) throws IOException {
            String result = "";
            /** 创建HttpClient */
            CloseableHttpClient httpClient = HttpClients.createDefault();
            /** httpPost */
            HttpPost httpPost = new HttpPost(url);
            List<NameValuePair> paramsList = new ArrayList<NameValuePair>();
            Iterator<Map.Entry<String,String>> it = params.entrySet().iterator();
            while(it.hasNext()){
                Map.Entry<String,String> en = it.next();
                String key = en.getKey();
                String value = en.getValue();
                paramsList.add(new BasicNameValuePair(key,value));
            httpPost.setEntity(new UrlEncodedFormEntity(paramsList,"UTF-8"));
            CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                result = EntityUtils.toString(httpEntity,"UTF-8");
                EntityUtils.consume(httpEntity);
            }finally {
                    if(httpResponse!=null){
                        httpResponse.close();
                }catch(IOException e){
                    logger.info("## release resouce error ##" + e);
            return result;
         * 生成加密字段
        public static String getDigest(String string) {
            if (string == null) {
                return null;
            char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
            byte[] btInput = string.getBytes(StandardCharsets.UTF_8);
            try {
                MessageDigest mdInst = MessageDigest.getInstance("SHA-256");
                mdInst.update(btInput);
                byte[] md = mdInst.digest();
                int j = md.length;
                char str[] = new char[j * 2];
                int k = 0;
                for (byte byte0 : md) {
                    str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                    str[k++] = hexDigits[byte0 & 0xf];
                return new String(str);
            } catch (NoSuchAlgorithmException e) {
                return null;
        public static String loadAsBase64(String imgFile)
      {//将文件转化为字节数组字符串,并对其进行Base64编码处理
        File file = new File(imgFile);
        if(!file.exists()){
            logger.error("文件不存在");
            return null;
        InputStream in = null;
        byte[] data = null;
          //读取文件字节数组
            in = new FileInputStream(imgFile);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        catch (IOException e)
            e.printStackTrace();
          //对字节数组Base64编码
        return Base64.getEncoder().encodeToString(data);//返回Base64编码过的字节数组字符串
      public static String truncate(String q) {
            if (q == null) {
                return null;
            int len = q.length();
            String result;
            return len <= 20 ? q : (q.substring(0, 10) + len + q.substring(len - 10, len));
    

    Python 示例

    # -*- coding: utf-8 -*-
    import sys
    import uuid
    import requests
    import base64
    import hashlib
    import time
    reload(sys)
    sys.setdefaultencoding('utf-8')
    YOUDAO_URL_UPLOAD = 'https://openapi.youdao.com/file_trans/upload'
    YOUDAO_URL_QUERY = 'https://openapi.youdao.com/file_trans/query'
    YOUDAO_URL_DOWNLOAD = 'https://openapi.youdao.com/file_trans/download'
    APP_KEY = '您的应用ID'
    APP_SECRET = '您的应用密钥'
    def truncate(q):
        if q is None:
            return None
        q_utf8 = q.decode("utf-8")
        size = len(q_utf8)
        return q_utf8 if size <= 20 else q_utf8[0:10] + str(size) + q_utf8[size - 10:size]
    def encrypt(signStr):
        hash_algorithm = hashlib.sha256()
        hash_algorithm.update(signStr.encode('utf-8'))
        return hash_algorithm.hexdigest()
    def do_request(url, data):
        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        return requests.post(url, data=data, headers=headers)
    def upload():
        f = open(r'文件的路径', 'rb')  # 二进制方式打开文件
        q = base64.b64encode(f.read())  # 读取文件内容,转换为base64编码
        f.close()
        salt = str(uuid.uuid1())
        curtime = str(int(time.time()))
        signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRET
        sign = encrypt(signStr)
        data = {}
        data['q'] = q
        data['fileName'] = '文件名称'
        data['fileType'] = '文件类型'
        data['langFrom'] = '源语言'
        data['langTo'] = '目标语言'
        data['appKey'] = APP_KEY
        data['salt'] = salt
        data['curtime'] = curtime
        data['sign'] = sign
        data['docType'] = 'json'
        data['signType'] = 'v3'
        response = do_request(YOUDAO_URL_UPLOAD, data)
        print response.content
    def query():
        flownumber = '文件流水号'
        salt = str(uuid.uuid1())
        curtime = str(int(time.time()))
        signStr = APP_KEY + truncate(flownumber) + salt + curtime + APP_SECRET
        sign = encrypt(signStr)
        data = {}
        data['flownumber'] = flownumber
        data['appKey'] = APP_KEY
        data['salt'] = salt
        data['curtime'] = curtime
        data['sign'] = sign
        data['docType'] = 'json'
        data['signType'] = 'v3'
        response = do_request(YOUDAO_URL_QUERY, data)
        print response.content
    def download():
        flownumber = '文件流水号'
        salt = str(uuid.uuid1())
        curtime = str(int(time.time()))
        signStr = APP_KEY + truncate(flownumber) + salt + curtime + APP_SECRET
        sign = encrypt(signStr)
        data = {}
        data['flownumber'] = flownumber
        data['downloadFileType'] = '文件下载类型'
        data['appKey'] = APP_KEY
        data['salt'] = salt
        data['curtime'] = curtime
        data['sign'] = sign
        data['docType'] = 'json'
        data['signType'] = 'v3'
        response = do_request(YOUDAO_URL_DOWNLOAD, data)
        print response.content
    if __name__ == '__main__':
        upload()
        query()
        download()
    

    C# 示例

    using System;
    using System.IO;
    using System.Net;
    using System.Text;
    using System.Collections.Generic;
    using System.Security.Cryptography;
    namespace zhiyun_csharp_demo
        class Demo
            public static void Main()
                Upload();
                Query();
                Download();
            protected static void Upload() {
                Dictionary dic = new Dictionary();
                string appKey = "您的应用ID";
                string appSecret = "您的应用密钥";
                string url = "https://openapi.youdao.com/file_trans/upload";
                string q = LoadAsBase64("文件的路径");
                string salt = DateTime.Now.Millisecond.ToString();
                TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc));
                long millis = (long) ts.TotalMilliseconds;
                string curtime = Convert.ToString(millis / 1000);
                string signStr = appKey + Truncate(q) + salt + curtime + appSecret;;
                string sign = ComputeHash(signStr, new SHA256CryptoServiceProvider());
                dic.Add("q", System.Web.HttpUtility.UrlEncode(q));
                dic.Add("fileName", "文件名称");
                dic.Add("fileType", "文件类型");
                dic.Add("langFrom", "源语言");
                dic.Add("langTo", "目标语言");
                dic.Add("appKey", appKey);
                dic.Add("salt", salt);
                dic.Add("curtime", curtime);
                dic.Add("sign", sign);
                dic.Add("docType", "json");
                dic.Add("signType", "v3");
                string result = Post(url, dic);
                Console.WriteLine(result);
            protected static void Query() {
                Dictionary dic = new Dictionary();
                string appKey = "您的应用ID";
                string appSecret = "您的应用密钥";
                string url = "https://openapi.youdao.com/file_trans/query";
                string flownumber = "文件流水号";
                string salt = DateTime.Now.Millisecond.ToString();
                TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc));
                long millis = (long) ts.TotalMilliseconds;
                string curtime = Convert.ToString(millis / 1000);
                string signStr = appKey + Truncate(flownumber) + salt + curtime + appSecret;;
                string sign = ComputeHash(signStr, new SHA256CryptoServiceProvider());
                dic.Add("flownumber", flownumber);
                dic.Add("appKey", appKey);
                dic.Add("salt", salt);
                dic.Add("curtime", curtime);
                dic.Add("sign", sign);
                dic.Add("docType", "json");
                dic.Add("signType", "v3");
                string result = Post(url, dic);
                Console.WriteLine(result);
            protected static void Download() {
                Dictionary dic = new Dictionary();
                string appKey = "您的应用ID";
                string appSecret = "您的应用密钥";
                string url = "https://openapi.youdao.com/file_trans/download";
                string flownumber = "文件流水号";
                string salt = DateTime.Now.Millisecond.ToString();
                TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc));
                long millis = (long) ts.TotalMilliseconds;
                string curtime = Convert.ToString(millis / 1000);
                string signStr = appKey + Truncate(flownumber) + salt + curtime + appSecret;;
                string sign = ComputeHash(signStr, new SHA256CryptoServiceProvider());
                dic.Add("flownumber", flownumber);
                dic.Add("downloadFileType", "文件下载类型");
                dic.Add("appKey", appKey);
                dic.Add("salt", salt);
                dic.Add("curtime", curtime);
                dic.Add("sign", sign);
                dic.Add("docType", "json");
                dic.Add("signType", "v3");
                string result = Post(url, dic);
                Console.WriteLine(result);
            protected static string ComputeHash(string input, HashAlgorithm algorithm)
              Byte[] inputBytes = Encoding.UTF8.GetBytes(input);
              Byte[] hashedBytes = algorithm.ComputeHash(inputBytes);
              return BitConverter.ToString(hashedBytes).Replace("-", "");
            protected static string Truncate(string q)
                if (q == null)
                   return null;
                int len = q.Length;
                return len <= 20 ? q : (q.Substring(0, 10) + len + q.Substring(len - 10, 10));
            protected static string LoadAsBase64(string filename)
                    FileStream filestream = new FileStream(filename, FileMode.Open);
                    byte[] arr = new byte[filestream.Length];
                    filestream.Position = 0;
                    filestream.Read(arr, 0, (int)filestream.Length);
                    filestream.Close();
                    return Convert.ToBase64String(arr);
                catch (Exception ex)
                    return null;
            protected static string Post(string url, Dictionary dic)
                string result = "";
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
                req.Method = "POST";
                req.ContentType = "application/x-www-form-urlencoded";
                StringBuilder builder = new StringBuilder();
                int i = 0;
                foreach (var item in dic)
                    if (i > 0)
                        builder.Append("&");
                    builder.AppendFormat("{0}={1}", item.Key, item.Value);
                byte[] data = Encoding.UTF8.GetBytes(builder.ToString());
                req.ContentLength = data.Length;
                using (Stream reqStream = req.GetRequestStream())
                    reqStream.Write(data, 0, data.Length);
                    reqStream.Close();
                HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
                Stream stream = resp.GetResponseStream();
                using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                    result = reader.ReadToEnd();
                return result;
    

    PHP 示例

    define("CURL_TIMEOUT", 2000); define("URL_UPLOAD", "https://openapi.youdao.com/file_trans/upload"); define("URL_QUERY", "https://openapi.youdao.com/file_trans/query"); define("URL_DOWNLOAD", "https://openapi.youdao.com/file_trans/download"); define("APP_KEY", "您的应用ID"); // 替换为您的应用ID define("SEC_KEY", "您的应用密钥"); // 替换为您的密钥 function upload() $file = "文件的路径"; $fp = fopen($file, "r") or die("Can't open file"); // base64编码 $q = base64_encode(fread($fp, filesize($file))); fclose($fp); $salt = create_guid(); $curtime = strtotime("now"); $signStr = APP_KEY . truncate($q) . $salt . $curtime . SEC_KEY; $args = array( 'appKey' => APP_KEY, 'salt' => $salt, $args['q'] = $q; $args['fileName'] = '文件名称'; $args['fileType'] = '文件类型'; $args['langFrom'] = '源语言'; $args['langTo'] = '目标语言'; $args['curtime'] = $curtime; $args['sign'] = hash("sha256", $signStr); $args['docType'] = 'json'; $args['signType'] = 'v3'; $ret = call(URL_UPLOAD, $args); print_r($ret); $ret = json_decode($ret, true); return $ret; function query() $flownumber = "文件流水号"; $salt = create_guid(); $curtime = strtotime("now"); $signStr = APP_KEY . truncate($flownumber) . $salt . $curtime . SEC_KEY; $args = array( 'appKey' => APP_KEY, 'salt' => $salt, $args['flownumber'] = $flownumber; $args['curtime'] = $curtime; $args['sign'] = hash("sha256", $signStr); $args['docType'] = 'json'; $args['signType'] = 'v3'; $ret = call(URL_QUERY, $args); print_r($ret); $ret = json_decode($ret, true); return $ret; function download() $flownumber = "文件流水号"; $salt = create_guid(); $curtime = strtotime("now"); $signStr = APP_KEY . truncate($flownumber) . $salt . $curtime . SEC_KEY; $args = array( 'appKey' => APP_KEY, 'salt' => $salt, $args['flownumber'] = $flownumber; $args['downloadFileType'] = '文件下载类型'; $args['curtime'] = $curtime; $args['sign'] = hash("sha256", $signStr); $args['docType'] = 'json'; $args['signType'] = 'v3'; $ret = call(URL_DOWNLOAD, $args); print_r($ret); $ret = json_decode($ret, true); return $ret; // 发起网络请求 function call($url, $args=null, $method="post", $testflag = 0, $timeout = CURL_TIMEOUT, $headers=array()) $ret = false; $i = 0; while($ret === false) if($i > 1) break; if($i > 0) sleep(1); $ret = callOnce($url, $args, $method, false, $timeout, $headers); $i++; return $ret; function callOnce($url, $args=null, $method="post", $withCookie = false, $timeout = CURL_TIMEOUT, $headers=array()) $ch = curl_init(); if($method == "post") $data = convert($args); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_POST, 1); $data = convert($args); if($data) if(stripos($url, "?") > 0) $url .= "&$data"; $url .= "?$data"; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if(!empty($headers)) curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); if($withCookie) curl_setopt($ch, CURLOPT_COOKIEJAR, $_COOKIE); $r = curl_exec($ch); curl_close($ch); return $r; function convert(&$args) $data = ''; if (is_array($args)) foreach ($args as $key=>$val) if (is_array($val)) foreach ($val as $k=>$v) $data .= $key.'['.$k.']='.rawurlencode($v).'&'; $data .="$key=".rawurlencode($val)."&"; return trim($data, "&"); return $args; // uuid generator function create_guid(){ $microTime = microtime(); list($a_dec, $a_sec) = explode(" ", $microTime); $dec_hex = dechex($a_dec* 1000000); $sec_hex = dechex($a_sec); ensure_length($dec_hex, 5); ensure_length($sec_hex, 6); $guid = ""; $guid .= $dec_hex; $guid .= create_guid_section(3); $guid .= '-'; $guid .= create_guid_section(4); $guid .= '-'; $guid .= create_guid_section(4); $guid .= '-'; $guid .= create_guid_section(4); $guid .= '-'; $guid .= $sec_hex; $guid .= create_guid_section(6); return $guid; function truncate($q) { $len = abslength($q); return $len <= 20 ? $q : (mb_substr($q, 0, 10) . $len . mb_substr($q, $len - 10, $len)); function abslength($str) if(empty($str)){ return 0; if(function_exists('mb_strlen')){ return mb_strlen($str,'utf-8'); else { preg_match_all("/./u", $str, $ar); return count($ar[0]); function ensure_length(&$string, $length){ $strlen = strlen($string); if($strlen < $length) $string = str_pad($string, $length, "0"); else if($strlen > $length) $string = substr($string, 0, $length); function create_guid_section($characters){ $return = ""; for($i = 0; $i < $characters; $i++) $return .= dechex(mt_rand(0,15)); return $return; // 输入 upload(); query(); download();