帮助与文档 > 产品文档 > 自然语言翻译服务 > 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需要向接口发送以下字段来访问服务。

字段名 类型 含义 必填 备注
q text 要翻译的文本.可指定多个 True q=苹果&q=橘子
from text 源语言 True 语言列表 (可设置为auto)
to text 目标语言 True 语言列表
appKey text 应用标识(应用ID) True 可在 应用管理 查看
salt text 随机字符串,可使用UUID进行生产 True hfa12lak56ja9gjl
sign text 签名信息:sha256(appKey+q+salt+密钥) True xxxxx
ext text 翻译结果音频格式,支持mp3 false mp3
voice text 翻译结果发音选择,0为女声,1为男声,默认为女声 false 0
signType text 签名类型 true v3
detectLevel text 语言检测粒度描述。影响翻译时i字段的内容合并做语言检测,还是分别进行检测;取值为0或1,取值为0时合并检测,取值为1时分别检测 false 1
detectFilter text 是否进行语种检测,当判定为非必要翻译时返回原文,true:进行过滤,false:不过滤 false 默认true
verifyLang text 是否对语言方向进行二次核实。当用户不确定传入的参数是否正确时,可将该参数置为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的值有关,具体说明如下:

| 字段名 | 类型 | 含义 | 备注 | |------ |----- |----- |---- | |errorCode |text |错误返回码 |一定存在| |errorIndex |JSONArray |错误结果的序号 |结果部分出错时存在。序号与输入的i字段顺序一一对应,序号从0开始。JSONArray中元素为int类型| |translateResults |JSONArray |翻译结果 |批量请求中存在正确结果时,一定存在。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可以识别中文、英文、日文、韩文、法文、西班牙文、葡萄牙文、俄文、越南文、德文、阿拉伯文、印尼文、意大利文,其他语种无法识别,为提高准确率,请指定语种。

服务配置

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

错误代码列表

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