批量翻譯 API 簡介
批量翻譯:支持一次傳入多個(gè)文本進(jìn)行批量翻譯,大幅減少http網(wǎng)絡(luò)應(yīng)答。適合多段文本批量翻譯的場景。
說明
Hi,您好,歡迎使用有道智云批量翻譯API接口服務(wù)。如果您想快速體驗(yàn)服務(wù),建議您前往翻譯體驗(yàn)中心 或者在體驗(yàn)中心右下側(cè)找到小程序二維碼,掃描進(jìn)行體驗(yàn)。
本文檔主要針對需要集成HTTP API的技術(shù)開發(fā)工程師,詳細(xì)描述批量翻譯能力相關(guān)的技術(shù)內(nèi)容。
如果您有與我們商務(wù)合作的需求,可以通過以下方式聯(lián)系我們:
商務(wù)郵箱: AIcloud_Business@corp.youdao.com
如果您對文檔內(nèi)容有任何疑問,可以通過以下幾種方式聯(lián)系我們:
客服QQ:1906538062
智云翻譯技術(shù)交流QQ 1群: 652880659
智云翻譯技術(shù)交流QQ 2群: 669384425
智云翻譯技術(shù)交流QQ 3群: 807539209
智云翻譯技術(shù)交流QQ 4群: 936752411
聯(lián)系郵箱: zhiyun@corp.youdao.com
溫馨提示:
- 本文檔主要針對開發(fā)人員,接入測試前需要獲取
應(yīng)用ID
和 應(yīng)用密鑰
;如果您還沒有,請按照新手指南 獲取。
- 平臺向每個(gè)賬戶贈送50元的體驗(yàn)金,供用戶集成前測試所用,具體資費(fèi)規(guī)則詳見 批量翻譯服務(wù)報(bào)價(jià) 。
接口說明
批量翻譯API接口提供有道的翻譯服務(wù),包含了中英翻譯和小語種翻譯功能。您只需要通過調(diào)用批量翻譯API,傳入待翻譯的內(nèi)容,并指定要翻譯的源語言(支持源語言語種自動檢測)和目標(biāo)語言種類,就可以得到相應(yīng)的翻譯結(jié)果。
批量翻譯API HTTPS地址:
https://openapi.youdao.com/v2/api
協(xié)議須知
調(diào)用方在集成批量翻譯API時(shí),請遵循以下規(guī)則。
規(guī)則 |
描述 |
傳輸方式 |
HTTPS |
請求方式 |
GET/POST |
字符編碼 |
統(tǒng)一使用UTF-8 編碼 |
請求格式 |
表單 |
響應(yīng)格式 |
JSON |
接口調(diào)用參數(shù)
調(diào)用API需要向接口發(fā)送以下字段來訪問服務(wù)。
字段名 |
類型 |
含義 |
必填 |
備注 |
q |
text |
要翻譯的文本.可指定多個(gè) |
True |
q=蘋果&q=橘子 |
from |
text |
源語言 |
True |
語言列表 (可設(shè)置為auto) |
to |
text |
目標(biāo)語言 |
True |
語言列表 |
appKey |
text |
應(yīng)用標(biāo)識(應(yīng)用ID) |
True |
可在 應(yīng)用管理 查看 |
salt |
text |
隨機(jī)字符串,可使用UUID進(jìn)行生產(chǎn) |
True |
hfa12lak56ja9gjl |
sign |
text |
簽名信息:sha256(appKey+q+salt+密鑰) |
True |
xxxxx |
ext |
text |
翻譯結(jié)果音頻格式,支持mp3 |
false |
mp3 |
voice |
text |
翻譯結(jié)果發(fā)音選擇,0為女聲,1為男聲,默認(rèn)為女聲 |
false |
0 |
signType |
text |
簽名類型 |
true |
v3 |
detectLevel |
text |
語言檢測粒度描述。影響翻譯時(shí)i字段的內(nèi)容合并做語言檢測,還是分別進(jìn)行檢測;取值為0或1,取值為0時(shí)合并檢測,取值為1時(shí)分別檢測 |
false |
1 |
detectFilter |
text |
是否進(jìn)行語種檢測,當(dāng)判定為非必要翻譯時(shí)返回原文,true:進(jìn)行過濾,false:不過濾 |
false |
默認(rèn)true |
verifyLang |
text |
是否對語言方向進(jìn)行二次核實(shí)。當(dāng)用戶不確定傳入的參數(shù)是否正確時(shí),可將該參數(shù)置為true,表示需要進(jìn)行二次核實(shí),系統(tǒng)將額外返回一個(gè)檢測到的核實(shí)結(jié)果.默認(rèn)為false |
|
|
簽名生成方法如下:
signType=v3;
sign=sha256(應(yīng)用ID
+input
+salt
+curtime
+應(yīng)用密鑰
);
其中,input的計(jì)算方式為:input
=q前10個(gè)字符
+ q長度
+ q后10個(gè)字符
(當(dāng)q長度大于20)或 input
=q字符串
(當(dāng)q長度小于等于20);
注意:
- voice 沒有男聲的,會輸出女聲。
- 發(fā)音需要在控制臺創(chuàng)建tts應(yīng)用才能使用,否則點(diǎn)擊發(fā)音會報(bào)110錯(cuò)誤。
- 接口salt+curtime來防重放(即一個(gè)請求不可以被請求2次),所以salt最好為UUID。
不同語言獲取時(shí)間戳,請參看此鏈接
如果對簽名有疑問,可以參看各語言demo。
輸出結(jié)果
返回的結(jié)果是json格式,包含字段與FROM和TO的值有關(guān),具體說明如下:
| 字段名 | 類型 | 含義 | 備注 |
|------ |----- |----- |---- |
|errorCode |text |錯(cuò)誤返回碼 |一定存在|
|errorIndex |JSONArray |錯(cuò)誤結(jié)果的序號 |結(jié)果部分出錯(cuò)時(shí)存在。序號與輸入的i字段順序一一對應(yīng),序號從0開始。JSONArray中元素為int類型|
|translateResults |JSONArray |翻譯結(jié)果 |批量請求中存在正確結(jié)果時(shí),一定存在。JSONArray中元素為JSONObject類型,JSONObject中一定包含query、translation和type字段(均為String類型),分別表示翻譯原句、翻譯結(jié)果和翻譯所用的語言方向。|
示例
{
"errorCode": 返回結(jié)果代碼,
"errorIndex": [
1 //序號從0開始
],
"translateResults": [
{
"query": 第一個(gè)q字段中的原文句子,
"translation": 第一個(gè)i字段對應(yīng)的譯文句子,
"type": 第一個(gè)q字段實(shí)際翻譯語言方向,
"verifyResult": 第一個(gè)q字段語言方向核實(shí)結(jié)果
},
{
"query": 第二個(gè)q字段中的原文句子,
"translation": 第二個(gè)q字段對應(yīng)的譯文句子,
"type": 第二個(gè)q字段實(shí)際翻譯語言方向,
"verifyResult": 第一個(gè)q字段語言方向核實(shí)結(jié)果
}
...
]
}
支持語言
下表為各語言對應(yīng)代碼:
語言 |
代碼 |
中文 |
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 |
斐濟(jì)語 |
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 |
宿務(wù)語 |
ceb |
科西嘉語 |
co |
世界語 |
eo |
菲律賓語 |
tl |
弗里西語 |
fy |
加利西亞語 |
gl |
格魯吉亞語 |
ka |
古吉拉特語 |
gu |
豪薩語 |
ha |
夏威夷語 |
haw |
冰島語 |
is |
伊博語 |
ig |
愛爾蘭語 |
ga |
爪哇語 |
jw |
卡納達(dá)語 |
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可以識別中文、英文、日文、韓文、法文、西班牙文、葡萄牙文、俄文、越南文、德文、阿拉伯文、印尼文、意大利文,其他語種無法識別,為提高準(zhǔn)確率,請指定語種。
服務(wù)配置
單次查詢最大字符數(shù) |
每小時(shí)最大查詢次數(shù) |
每小時(shí)最大查詢字符數(shù) |
支持語言 |
5000 |
100萬 |
120萬 |
詳見語種表 |
錯(cuò)誤代碼列表
錯(cuò)誤碼 |
含義 |
101 |
缺少必填的參數(shù),首先確保必填參數(shù)齊全,然后確認(rèn)參數(shù)書寫是否正確。 |
102 |
不支持的語言類型 |
103 |
翻譯文本過長 |
104 |
不支持的API類型 |
105 |
不支持的簽名類型 |
106 |
不支持的響應(yīng)類型 |
107 |
不支持的傳輸加密類型 |
108 |
應(yīng)用ID無效,注冊賬號,登錄后臺創(chuàng)建應(yīng)用和實(shí)例并完成綁定,可獲得應(yīng)用ID和應(yīng)用密鑰等信息 |
109 |
batchLog格式不正確 |
110 |
無相關(guān)服務(wù)的有效實(shí)例,應(yīng)用沒有綁定服務(wù),可以新建服務(wù),綁定服務(wù)。注:某些服務(wù)的翻譯結(jié)果發(fā)音需要tts服務(wù),需要在控制臺創(chuàng)建語音合成實(shí)例綁定應(yīng)用后方能使用。 |
111 |
開發(fā)者賬號無效 |
112 |
請求服務(wù)無效 |
113 |
q不能為空 |
118 |
detectLevel取值錯(cuò)誤 |
201 |
解密失敗,可能為DES,BASE64,URLDecode的錯(cuò)誤 |
202 |
簽名檢驗(yàn)失敗,如果確認(rèn)應(yīng)用ID和應(yīng)用密鑰的正確性,仍返回202,一般是編碼問題。請確保翻譯文本 q 為UTF-8編碼. |
203 |
訪問IP地址不在可訪問IP列表 |
205 |
請求的接口與應(yīng)用的平臺類型不一致,確保接入方式(Android SDK、IOS SDK、API)與創(chuàng)建的應(yīng)用平臺類型一致。如有疑問請參考入門指南 |
206 |
因?yàn)闀r(shí)間戳無效導(dǎo)致簽名校驗(yàn)失敗 |
207 |
重放請求(接口salt+curtime來防重放(即一個(gè)請求不可以被請求2次),所以salt最好為UUID。) |
301 |
辭典查詢失敗 |
302 |
翻譯查詢失敗 |
303 |
服務(wù)端的其它異常 |
304 |
翻譯失敗,請聯(lián)系技術(shù)同學(xué) |
401 |
賬戶已經(jīng)欠費(fèi),請進(jìn)行賬戶充值 |
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 = "您的應(yīng)用ID";
private static final String APP_SECRET = "您的應(yīng)用密鑰";
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", "目標(biāo)語言");
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");
/** 處理結(jié)果 */
requestForHttp(YOUDAO_URL, params, qArray);
}
public static void requestForHttp(String url, Map<String, String> params, String[] qArray) throws IOException {
/** 創(chuàng)建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());
/** 響應(yīng)不是音頻流,直接顯示結(jié)果 */
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 = '您的應(yīng)用ID'
APP_SECRET = '您的應(yīng)用密鑰'
def connect():
qArray = ["待輸入的文字1", "待輸入的文字2", "待輸入的文字3"]
data = {}
data['from'] = '源語言'
data['to'] = '目標(biāo)語言'
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 = '您的應(yīng)用ID'
APP_SECRET = '您的應(yīng)用密鑰'
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 = "您的應(yīng)用ID";
string appSecret = "您的應(yīng)用密鑰";
string salt = DateTime.Now.Millisecond.ToString();
dic.Add("from", "源語言");
dic.Add("to", "目標(biāo)語言");
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", "您的應(yīng)用ID"); // 替換為您的應(yīng)用ID
define("SEC_KEY", "您的應(yīng)用密鑰"); // 替換為您的密鑰
function do_request($q)
{
$salt = create_guid();
$args = array(
'q' => $q,
'appKey' => APP_KEY,
'salt' => $salt,
);
$args['from'] = '源語言';
$args['to'] = '目標(biāo)語言';
$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;
}
// 發(fā)起網(wǎng)絡(luò)請求
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>可打開瀏覽器控制臺查看結(jié)果</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 = '您的應(yīng)用ID';
var key = '您的應(yīng)用密鑰';//注意:暴露appSecret,有被盜用造成損失的風(fēng)險(xiǎn)
var salt = (new Date).getTime();
var curtime = Math.round(new Date().getTime() / 1000);
var query = ['待輸入的文字1', '待輸入的文字2', '待輸入的文字3'];
var from = '源語言';
var to = '目標(biāo)語言';
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>