有道翻译正式对外免费开放翻译API
455
2022-09-06
有道翻译API使用起来非常简单。给定参数,发送请求,即可拿到结果。
# -*- coding: utf-8 -*-# author: huihui# date: 2020/2/21 5:19 下午 import requests url = "http://fanyi.youdao.com/translate"def get_trans(line): data = { 'doctype': 'json', 'type': 'AUTO', 'i': line } r = requests.get(url, params=data) result = r.json() print(result) line = '安徽省亳州市漆园街道花园村,排列有序的光伏成为乡村一道靓丽的风景。近年来,安徽省亳州市蒙城县漆园街道通过与光伏发电企业及农业企业合作,建成运行40MW光伏发电项目,并建设290栋农业设施大棚,将太阳能发电与设施农业有机结合,实现棚顶光伏发电、棚内设施种植蔬菜、中药材等,最大限度发挥光伏电站的效益,不仅为当地农民增加收入,壮大村级集体经济,助力乡村振兴。'get_trans(line)
返回结果:
{'type': 'ZH_CN2EN', 'errorCode': 0, 'elapsedTime': 116, 'translateResult': [ [ {'src': '安徽省亳州市漆园街道花园村,排列有序的光伏成为乡村一道靓丽的风景。', 'tgt': 'Anhui province bozhou city paint garden street garden village, an orderly photovoltaic become village a beautiful beautiful scenery.' }, {'src': '近年来,安徽省亳州市蒙城县漆园街道通过与光伏发电企业及农业企业合作,建成运行40MW光伏发电项目,并建设290栋农业设施大棚,将太阳能发电与设施农业有机结合,实现棚顶光伏发电、棚内设施种植蔬菜、中药材等,最大限度发挥光伏电站的效益,不仅为当地农民增加收入,壮大村级集体经济,助力乡村振兴。', 'tgt': 'In recent years, the anhui province bozhou city mengcheng paint garden street through cooperation with photovoltaic power generation enterprises and agricultural enterprises, the running 40 mw photovoltaic power generation project, and to build 290 greenhouses of agricultural facilities, the organic combination of solar and facility agriculture, the roof photovoltaic, relative facility cultivation of vegetables, medicinal herbs, etc., the maximum play to the benefit of the photovoltaic power station, not only for the local farmers to increase income, strengthen the village-level collective economy, boost rural revitalization.' } ] ] }
可以看到,API内部会进行分句。所以,如果是多个句子的话,需要重新join一下结果中的tgt。
有道翻译 API
最近有些任务需要将中文翻译成英文,由于个人英文水平问题,每次都要打开好几个在线翻译网页,一句一句的丢进去,取最佳者为所用,甚是麻烦。
任务完成之后,就稍微研究了一下各个翻译接口(Github地址,求star),下面以 “有道翻译 API” 为例。
有道翻译官网提供了 API 接口,需要注册并付费才能使用,按照格式进行请求(JAVA DEMO),其中有一些参数:
注意 slat 和 sign 参数。从 JAVA DEMO 中可知,slat 随机数是通过获取系统时间得到的,而 sign 签名则是通过某个字符串的 md5 算法得到的,官网提供的 md5 算法代码如下:
/**
* 生成32位MD5摘要
* @param string
* @return
*/
public static String md5(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();
try{
/** 获得MD5摘要算法的 MessageDigest 对象 */
MessageDigest mdInst = MessageDigest.getInstance("MD5");
/** 使用指定的字节更新摘要 */
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;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
本来按照上述操作就可以很顺利的利用 API 进行开发,关键是要收费啊,还是按字符数收费。接下来就开始了破解之路,实现 无需注册就可以使用 有道翻译 接口……
有道翻译 破解
用Chrome打开有道翻译首页,按F12键,在翻译框内输入一句话,点击翻译。
可以看到有道翻译的 Request URL 和 Request Method,在往下看:
从 From Data 中可以查看到许多参数。经过多次实验,发现发生改变的只有 i,salt 和 sign 三个参数值。其中 i 是要翻译的内容,salt 和 sign 的来历和作用前面已经介绍了。但在 API 中 sign 参数是带了 appKey(注册,后台生成) 的,我们没有这个。那么就需要研究一下如何生成 sign 的了。
在众多请求中,发现一段 js 代码,如下:
将这段代码格式化一下,搜索关键词 sign,如下:
通过上述的 js 代码可知,salt 参数是通过系统时间,加上一个 [1, 10] 的随机数得到的, sign = md5(固定字符串 + 待翻译内容 + salt + 固定字符串) 得到的。这样我们就可以通过代码进行请求了,代码如下:
public class YouDao {
public static void main(String[] args) throws Exception {
String from = "en";
String to = "zh-CHS";
String q = "Who am I? Where am I?";
String url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule";
String u = "fanyideskweb";
String d = q;
long ctime = System.currentTimeMillis();
String f = String.valueOf(ctime + (long)(Math.random() * 10 + 1));
String c = "ebSeFb%=XZ%T[KZ)c(sy!";
String sign = util.md5(u + d + f + c);
Map<String, String> params = new HashMap<String, String>();
params.put("i", q);
params.put("from", from);
params.put("to", to);
params.put("smartresult", "dict");
params.put("client", "fanyideskweb");
params.put("salt", f);
params.put("sign", sign);
params.put("doctype", "json");
params.put("version", "2.1");
params.put("keyfrom", "fanyi.web");
params.put("action", "FY_BY_CLICKBUTTION");
params.put("typoResult", "false");
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost request = new HttpPost(util.getUrlWithQueryString(url, params));
// request.setHeader("Accept","application/json, text/javascript, */*; q=0.01");
// request.setHeader("Accept-Encoding","gzip, deflate");
// request.setHeader("Accept-Language","zh-CN,zh;q=0.9");
// request.setHeader("Connection","keep-alive");
// request.setHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
request.setHeader("Cookie","OUTFOX_SEARCH_USER_ID_NCOO=1537643834.9570553; OUTFOX_SEARCH_USER_ID=1799185238@10.169.0.83; fanyi-ad-id=43155; fanyi-ad-closed=1; JSESSIONID=aaaBwRanNsqoobhgvaHmw; _ntes_nnid=07e771bc10603d984c2dc8045a293d30,1525267244050; ___rl__test__cookies=" + String.valueOf(ctime));
// request.setHeader("Host","fanyi.youdao.com");
// request.setHeader("Origin","http://fanyi.youdao.com");
request.setHeader("Referer","http://fanyi.youdao.com/");
request.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36");
// request.setHeader("X-Requested-With","XMLHttpRequest");
CloseableHttpResponse httpResponse = httpClient.execute(request);
HttpEntity httpEntity = httpResponse.getEntity();
String result = EntityUtils.toString(httpEntity, "UTF-8");
EntityUtils.consume(httpEntity); // 关闭
httpResponse.close();
String res[] = result.split("\"");
StringBuilder resd = new StringBuilder();
for (int i = 0; i < res.length; i++) {
if (res[i].equals("tgt")) {
resd.append(res[i + 2]);
}
}
System.out.println(resd.toString());
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
其中,md5() 和 getUrlWithQueryString() 可以利用 JAVA DEMO 提供的方法。
注意:对”http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule“发起请求时,需要设置cookie,否则会出现errorCode。在不设置 cookie 时,只能请求 “http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule“。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~