帮助与文档 > 产品文档 > 自然语言翻译服务 > API文档 > 批量文本翻译
批量文本翻译

批量翻译 API 简介

批量翻译:支持一次传入多个文本进行批量翻译,大幅减少http网络应答。适合多段文本批量翻译的场景。

说明

Hi,您好,欢迎使用有道智云批量翻译API接口服务。如果您想快速体验服务,建议您前往翻译体验中心 或者在体验中心右下侧找到小程序二维码,扫描进行体验。

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

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

商务邮箱: AIcloud_Business@corp.youdao.com

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

客服QQ:1906538062

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

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

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

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

联系邮箱: zhiyun@corp.youdao.com

温馨提示:

  • 本文档主要针对开发人员,接入测试前需要获取 应用ID应用密钥 ;如果您还没有,请按照新手指南 获取。
  • 平台向每个账户赠送50元的体验金,供用户集成前测试所用,具体资费规则详见 批量翻译服务报价

接口说明

批量翻译API接口提供有道的翻译服务,包含了中英翻译和小语种翻译功能。您只需要通过调用批量翻译API,传入待翻译的内容,并指定要翻译的源语言(支持源语言语种自动检测)和目标语言种类,就可以得到相应的翻译结果。

批量翻译API HTTPS地址:

https://openapi.youdao.com/v2/api

协议须知

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

规则描述
传输方式HTTPS
请求方式GET/POST
字符编码统一使用UTF-8 编码
请求格式表单
响应格式JSON

接口调用参数

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

字段名类型含义必填备注
qtext要翻译的文本.可指定多个Trueq=苹果&q=橘子
fromtext源语言True语言列表 (可设置为auto)
totext目标语言True语言列表
appKeytext应用标识(应用ID)True可在 应用管理 查看
salttext随机字符串,可使用UUID进行生产Truehfa12lak56ja9gjl
signtext签名信息:sha256(appKey+q+salt+密钥)Truexxxxx
exttext翻译结果音频格式,支持mp3falsemp3
voicetext翻译结果发音选择,0为女声,1为男声,默认为女声false0
signTypetext签名类型truev3
detectLeveltext语言检测粒度描述。影响翻译时i字段的内容合并做语言检测,还是分别进行检测;取值为0或1,取值为0时合并检测,取值为1时分别检测false1
detectFiltertext是否进行语种检测,当判定为非必要翻译时返回原文,true:进行过滤,false:不过滤false默认true
verifyLangtext是否对语言方向进行二次核实。当用户不确定传入的参数是否正确时,可将该参数置为true,表示需要进行二次核实,系统将额外返回一个检测到的核实结果.默认为false

签名生成方法如下:
signType=v3;
sign=sha256(应用ID+input+salt+curtime+应用密钥);
其中,input的计算方式为:input=q前10个字符 + q长度 + q后10个字符(当q长度大于20)或 input=q字符串(当q长度小于等于20);

注意:

  1. voice 没有男声的,会输出女声。
  2. 发音需要在控制台创建tts应用才能使用,否则点击发音会报110错误。
  3. 接口salt+curtime来防重放(即一个请求不可以被请求2次),所以salt最好为UUID。

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

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

输出结果

返回的结果是json格式,包含字段与FROM和TO的值有关,具体说明如下:

字段名类型含义备注
errorCodetext错误返回码一定存在
errorIndexJSONArray错误结果的序号结果部分出错时存在。序号与输入的i字段顺序一一对应,序号从0开始。JSONArray中元素为int类型
translateResultsJSONArray翻译结果批量请求中存在正确结果时,一定存在。JSONArray中元素为JSONObject类型,JSONObject中一定包含query、translation和type字段(均为String类型),分别表示翻译原句、翻译结果和翻译所用的语言方向。

示例

{
    "errorCode": 返回结果代码,
    "errorIndex": [
        1 //序号从0开始
    ],
    "translateResults": [
        {
            "query": 第一个q字段中的原文句子,
            "translation": 第一个i字段对应的译文句子,
            "type": 第一个q字段实际翻译语言方向,
            "verifyResult": 第一个q字段语言方向核实结果
            
        }, 
        {
            "query": 第二个q字段中的原文句子,
            "translation": 第二个q字段对应的译文句子,
            "type": 第二个q字段实际翻译语言方向,
            "verifyResult": 第一个q字段语言方向核实结果
        }
    ...
    ]
}

支持语言

下表为各语言对应代码:

语言代码
中文zh-CHS
中文繁体zh-CHT
英文en
日文ja
韩文ko
法文fr
西班牙文es
葡萄牙文pt
意大利文it
俄文ru
越南文vi
德文de
阿拉伯文ar
印尼文id
南非荷兰语af
波斯尼亚语bs
保加利亚语bg
粤语yue
加泰隆语ca
克罗地亚语hr
捷克语cs
丹麦语da
荷兰语nl
爱沙尼亚语et
斐济语fj
芬兰语fi
希腊语el
海地克里奥尔语ht
希伯来语he
印地语hi
白苗语mww
匈牙利语hu
斯瓦希里语sw
克林贡语tlh
拉脱维亚语lv
立陶宛语lt
马来语ms
马耳他语mt
挪威语no
波斯语fa
波兰语pl
克雷塔罗奥托米语otq
罗马尼亚语ro
塞尔维亚语(西里尔文)sr-Cyrl
塞尔维亚语(拉丁文)sr-Latn
斯洛伐克语sk
斯洛文尼亚语sl
瑞典语sv
塔希提语ty
泰语th
汤加语to
土耳其语tr
乌克兰语uk
乌尔都语ur
威尔士语cy
尤卡坦玛雅语yua
阿尔巴尼亚语sq
阿姆哈拉语am
亚美尼亚语hy
阿塞拜疆语az
孟加拉语bn
巴斯克语eu
白俄罗斯语be
宿务语ceb
科西嘉语co
世界语eo
菲律宾语tl
弗里西语fy
加利西亚语gl
格鲁吉亚语ka
古吉拉特语gu
豪萨语ha
夏威夷语haw
冰岛语is
伊博语ig
爱尔兰语ga
爪哇语jw
卡纳达语kn
哈萨克语kk
高棉语km
库尔德语ku
柯尔克孜语ky
老挝语lo
拉丁语la
卢森堡语lb
马其顿语mk
马尔加什语mg
马拉雅拉姆语ml
毛利语mi
马拉地语mr
蒙古语mn
缅甸语my
尼泊尔语ne
齐切瓦语ny
普什图语ps
旁遮普语pa
萨摩亚语sm
苏格兰盖尔语gd
塞索托语st
修纳语sn
信德语sd
僧伽罗语si
索马里语so
巽他语su
塔吉克语tg
泰米尔语ta
泰卢固语te
乌兹别克语uz
南非科萨语xh
意第绪语yi
约鲁巴语yo
南非祖鲁语zu
自动识别auto

其中auto可以识别中文、英文、日文、韩文、法文、西班牙文、葡萄牙文、俄文、越南文、德文、阿拉伯文、印尼文、意大利文,其他语种无法识别,为提高准确率,请指定语种。

服务配置

单次查询最大字符数每小时最大查询次数每小时最大查询字符数支持语言
5000100万120万详见语种表

错误代码列表

错误码含义
101缺少必填的参数,首先确保必填参数齐全,然后确认参数书写是否正确。
102不支持的语言类型
103翻译文本过长
104不支持的API类型
105不支持的签名类型
106不支持的响应类型
107不支持的传输加密类型
108应用ID无效,注册账号,登录后台创建应用和实例并完成绑定,可获得应用ID和应用密钥等信息
109batchLog格式不正确
110无相关服务的有效实例,应用没有绑定服务,可以新建服务,绑定服务。注:某些服务的翻译结果发音需要tts服务,需要在控制台创建语音合成实例绑定应用后方能使用。
111开发者账号无效
112请求服务无效
113q不能为空
118detectLevel取值错误
201解密失败,可能为DES,BASE64,URLDecode的错误
202签名检验失败,如果确认应用ID和应用密钥的正确性,仍返回202,一般是编码问题。请确保翻译文本 q 为UTF-8编码.
203访问IP地址不在可访问IP列表
205请求的接口与应用的平台类型不一致,确保接入方式(Android SDK、IOS SDK、API)与创建的应用平台类型一致。如有疑问请参考入门指南
206因为时间戳无效导致签名校验失败
207重放请求
301辞典查询失败
302翻译查询失败
303服务端的其它异常
304翻译失败,请联系技术同学
401账户已经欠费,请进行账户充值
402offlinesdk不可用
411访问频率受限,请稍后访问
412长请求过于频繁,请稍后访问

常用语言 Demo

java 示例

package com.youdao.ai;
 
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.IOException;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
 
public class BatchV3Demo {
 
    private static Logger logger = LoggerFactory.getLogger(BatchV3Demo.class);
 
    private static final String YOUDAO_URL = "https://openapi.youdao.com/v2/api";
 
    private static final String APP_KEY = "您的应用ID";
 
    private static final String APP_SECRET = "您的应用密钥";
 
    public static void main(String[] args) throws IOException {
        Map<String, String> params = new HashMap<String, String>();
        String[] qArray = {"待输入的文字1", "待输入的文字2", "待输入的文字3"};
        String salt = String.valueOf(System.currentTimeMillis());
        params.put("from", "源语言");
        params.put("to", "目标语言");
        params.put("signType", "v3");
        String curtime = String.valueOf(System.currentTimeMillis() / 1000);
        params.put("curtime", curtime);
        String signStr = APP_KEY + truncate(qArray) + salt + curtime + APP_SECRET;
        String sign = getDigest(signStr);
        params.put("appKey", APP_KEY);
        params.put("salt", salt);
        params.put("sign", sign);
        params.put("vocabId", "您的用户词表ID");
        /** 处理结果 */
        requestForHttp(YOUDAO_URL, params, qArray);
    }
 
    public static void requestForHttp(String url, Map<String, String> params, String[] qArray) throws IOException {
 
        /** 创建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));
        }
        for (int i = 0; i < qArray.length; i++) {
            paramsList.add(new BasicNameValuePair("q", qArray[i]));
        }
        httpPost.setEntity(new UrlEncodedFormEntity(paramsList, "UTF-8"));
        CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
        try {
            Header[] contentType = httpResponse.getHeaders("Content-Type");
            System.out.println("Content-Type:" + contentType[0].getValue());
            /** 响应不是音频流,直接显示结果 */
            HttpEntity httpEntity = httpResponse.getEntity();
            String json = EntityUtils.toString(httpEntity, "UTF-8");
            EntityUtils.consume(httpEntity);
            logger.info(json);
            System.out.println(json);
        } finally {
            try {
                if (httpResponse != null) {
                    httpResponse.close();
                }
            } catch (IOException e) {
                logger.info("## release resouce error ##" + e);
            }
        }
    }
 
    /**
     * 生成加密字段
     */
    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 truncate(String[] qArray) {
        if (qArray == null) {
            return null;
        }
        String batchQStr = String.join("", qArray);
        int len = batchQStr.length();
        return len <= 20 ? batchQStr : (batchQStr.substring(0, 10) + len + batchQStr.substring(len - 10, len));
    }
}

python2 示例

# -*- coding: utf-8 -*-
import sys
import uuid
import requests
import hashlib
import time
 
reload(sys)
sys.setdefaultencoding('utf-8')
 
YOUDAO_URL = 'https://openapi.youdao.com/v2/api'
APP_KEY = '您的应用ID'
APP_SECRET = '您的应用密钥'
 
def connect():
    qArray = ["待输入的文字1", "待输入的文字2", "待输入的文字3"]
 
    data = {}
    data['from'] = '源语言'
    data['to'] = '目标语言'
    data['signType'] = 'v3'
    curtime = str(int(time.time()))
    data['curtime'] = curtime
    salt = str(uuid.uuid1())
    signStr = APP_KEY + truncate(''.join(qArray)) + salt + curtime + APP_SECRET
    sign = encrypt(signStr)
    data['appKey'] = APP_KEY
    data['salt'] = salt
    data['q'] = qArray
    data['sign'] = sign
    data['vocabId'] = "您的用户词表ID"
 
    response = do_request(data, qArray)
    contentType = response.headers['Content-Type']
    print contentType
    print response.content
 
 
def encrypt(signStr):
    hash_algorithm = hashlib.sha256()
    hash_algorithm.update(signStr.encode('utf-8'))
    return hash_algorithm.hexdigest()
 
 
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 do_request(data, qArray):
    headers = {'Content-Type': 'application/x-www-form-urlencoded'}
    return requests.post(YOUDAO_URL, data  = data, headers = headers)
 
if __name__ == '__main__':
    connect()

python3 示例

# -*- coding: utf-8 -*-
import sys
import uuid
import requests
import hashlib
import time
from importlib import reload
 
reload(sys)
 
YOUDAO_URL = 'https://openapi.youdao.com/v2/api'
APP_KEY = '您的应用ID'
APP_SECRET = '您的应用密钥'
 
 
def connect():
    qArray = ["待输入的文字1", "待输入的文字2", "待输入的文字3"]
 
    data = {}
    data['from'] = 'zh-CHS'
    data['to'] = 'en'
    data['signType'] = 'v3'
    curtime = str(int(time.time()))
    data['curtime'] = curtime
    salt = str(uuid.uuid1())
    signStr = APP_KEY + truncate(''.join(qArray)) + salt + curtime + APP_SECRET
    sign = encrypt(signStr)
    data['appKey'] = APP_KEY
    data['q'] = qArray
    data['salt'] = salt
    data['sign'] = sign
    data['vocabId'] = "您的用户词表ID"
    response = do_request(data)
    contentType = response.headers['Content-Type']
    print(contentType)
    print(response.content)
 
 
def encrypt(signStr):
    hash_algorithm = hashlib.sha256()
    hash_algorithm.update(signStr.encode('utf-8'))
    return hash_algorithm.hexdigest()
 
 
def truncate(q):
    if q is None:
        return None
    size = len(q)
    return q if size <= 20 else q[0:10] + str(size) + q[size - 10:size]
 
 
def do_request(data):
    headers = {'Content-Type': 'application/x-www-form-urlencoded'}
    return requests.post(YOUDAO_URL, data = data, headers = headers)
 
 
if __name__ == '__main__':
    connect()

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 BatchV3DemoInternalTest
    {
        public static void Main()
        {
            Dictionary<String, String> dic = new Dictionary<String, String>();
            string url = "https://openapi.youdao.com/v2/api";
            string[] qArray = {"待输入的文字1", "待输入的文字2", "待输入的文字3"};
            string appKey = "您的应用ID";
            string appSecret = "您的应用密钥";
            string salt = DateTime.Now.Millisecond.ToString();
            dic.Add("from", "源语言");
            dic.Add("to", "目标语言");
            dic.Add("signType", "v3");
            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);
            dic.Add("curtime", curtime);
            string signStr = appKey + Truncate(string.Join("", qArray)) + salt + curtime + appSecret;;
            string sign = ComputeHash(signStr, new SHA256CryptoServiceProvider());
            dic.Add("appKey", appKey);
            dic.Add("salt", salt);
            dic.Add("sign", sign);
            dic.Add("vocabId", "您的用户词表ID");
            Post(url, dic, qArray);
        }
 
        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 void Post(string url, Dictionary<String, String> dic, string[] qArray)
        {
            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);
                i++;
            }
            foreach (var item in qArray)
            {
                builder.Append("&");
                builder.AppendFormat("q={0}", System.Web.HttpUtility.UrlEncode(item));
            }
            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();
                            }
                            Console.WriteLine(result);
        }
 
        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));
        }
    }
}

php示例

<?php
define("CURL_TIMEOUT",   2000);
define("URL",            "https://openapi.youdao.com/v2/api");
define("APP_KEY",        "您的应用ID"); // 替换为您的应用ID
define("SEC_KEY",        "您的应用密钥"); // 替换为您的密钥
 
function do_request($q)
{
    $salt = create_guid();
    $args = array(
        'q' => $q,
        'appKey' => APP_KEY,
        'salt' => $salt,
    );
    $args['from'] = '源语言';
    $args['to'] = '目标语言';
    $args['signType'] = 'v3';
    $curtime = strtotime("now");
    $args['curtime'] = $curtime;
    $signStr = APP_KEY . truncate(implode("", $q)) . $salt . $curtime . SEC_KEY;
    $args['sign'] = hash("sha256", $signStr);
    $args['vocabId'] = '您的用户词表ID';
    $ret = call(URL, $args);
    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);
    }
    else
    {
        $data = convert($args);
        if($data)
        {
            if(stripos($url, "?") > 0)
            {
                $url .= "&$data";
            }
            else
            {
                $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 .= 'q='.rawurlencode($v).'&';
                }
            }
            else
            {
                $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 create_guid_section($characters){
    $return = "";
    for($i = 0; $i < $characters; $i++)
    {
        $return .= dechex(mt_rand(0,15));
    }
    return $return;
}
 
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);
    }
}
 
// 输入
$qArray = array("待输入的文字1", "待输入的文字2", "待输入的文字3");
 
$ret = do_request($qArray);
print_r($ret);
$ret = json_decode($ret, true);
?>

js示例

<!doctype html>
<head>
    <meta charset="utf-8"/>
</head>
<body>
<div>可打开浏览器控制台查看结果</div>
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/crypto-js.js"></script>
<script type="text/javascript">
    var appKey = '您的应用ID';
    var key = '您的应用密钥';//注意:暴露appSecret,有被盗用造成损失的风险
    var salt = (new Date).getTime();
    var curtime = Math.round(new Date().getTime() / 1000);
    var query = ['待输入的文字1', '待输入的文字2', '待输入的文字3'];
    var from = '源语言';
    var to = '目标语言';
    var str1 = appKey + truncate(query.join("")) + salt + curtime + key;
    var vocabId = '您的用户词表ID';
 
    var sign = CryptoJS.SHA256(str1).toString(CryptoJS.enc.Hex);
    $.ajax({
        url: 'https://openapi.youdao.com/v2/api',
        type: 'post',
        dataType: 'jsonp',
        traditional: true,
        data: {
            q: query,
            appKey: appKey,
            salt: salt,
            from: from,
            to: to,
            sign: sign,
            signType: "v3",
            curtime: curtime,
            vocabId: vocabId,
        },
        success: function (data) {
            console.log(data);
        }
    });
 
    function truncate(q) {
        var len = q.length;
        if (len <= 20) return q;
        return q.substring(0, 10) + len + q.substring(len - 10, len);
    }
</script>
</body>