有道翻译api

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

有道翻译API HTTP地址: http://openapi.youdao.com/api
有道翻译API HTTPS地址: https://openapi.youdao.com/api

思路

使用:github

本身是一个比较容易的小程序,主要利用python的urllib、json、hashlib等模块。

首先,根据有道翻译api的接口参数生成HTTP请求,利用urllib模块发送并接收返回的json格式结果。

示例

使用good单词查询,生成的HTTP请求

https://openapi.youdao.com/api?q=good&from=auto&to=auto&appKey=0b8802eb86c06476&salt=4&sign=c917e71231ba8cb8b4db3bb33097be31

注意有道翻译api接口参数中签名的生成

签名生成方法如下:

1、将请求参数中的 appKey,翻译文本query(q, 注意为UTF-8编码),随机数(salt)和密钥 (可在应用管理查看), 按照
appKey+q+salt+密钥 的顺序拼接得到字符串str。

2、对字符串str做md5,得到32位小写的sign(参考Java生成MD5示例)

注意:

1、请先将需要翻译的文本转换为UTF-8编码

2、在发送HTTP请求之前需要对各字段做URL encode。

3、在生成签名拼接 appKey+q+salt 字符串时,q不需要做URL
encode,在生成签名之后,发送HTTP请求之前才需要对要发送的待翻译文本字段q做URL encode。

接下来,得到返回结果,即为翻译内容。

结果格式

{"web":[{"value":["好","善","商品"],"key":"Good"},{"value":["公共物品","公益事业","公共财"],"key":"public good"},{"value":["干的出色","干得好","好工作"],"key":"Good Job"}],"query":"good","translation":["好"],"errorCode":"0","basic":{"us-phonetic":"ɡʊd","phonetic":"gʊd","uk-phonetic":"gʊd","explains":["n. 好处;善行;慷慨的行为","adj. 好的;优良的;愉快的;虔诚的","adv. 好","n. (Good)人名;(英)古德;(瑞典)戈德"]},"l":"EN2zh-CHS"}

代码

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#! /usr/bin/env python
# -*- coding:utf-8 -*-
"""
translator - Translation
@author sikasjc(sikasjc@163.com)
@date 2017.7.28
"""

import sys
import json
import urllib.request
import urllib.parse
import random
import hashlib

class Translator:
appKey = ''
api = 'https://openapi.youdao.com/api'
translatorfrom = 'auto'
translatorto = 'auto'
key = ''
content = None

def __init__(self, argv):
q = ''
if len(argv) > 0:
q = ' '.join(argv)
salt = str(random.randint(0, 9))
sign = self.appKey + q + salt + self.key
sign = self.keytomd5(sign)
q = urllib.parse.quote(q.encode('utf-8'))
self.api = self.api + '?'+ 'q=' + q + '&from=' + self.translatorfrom + \
'&to=' + self.translatorto + '&appKey=' + self.appKey + \
'&salt=' + salt + '&sign=' + sign
self.translate()
else:
print('Please enter the word or sentence.')

def keytomd5(self, str):
m = hashlib.md5()
m.update(str.encode('utf-8'))
psw = m.hexdigest()
return psw

def translate(self):
try:
content = urllib.request.urlopen(self.api).read()
self.content = json.loads(content.decode('utf-8'))
self.parse()
except Exception as e:
print(e)

def parse(self):
errorcode = self.content['errorCode']
if errorcode == '0': #translate successfully
query = self.content['query']
translations = self.content['translation']

try:
us = self.content['basic']['us-phonetic']
uk = self.content['basic']['uk-phonetic']
except KeyError:
uk = None
us = None

try:
phonetic = self.content['basic']['phonetic']
except KeyError:
phonetic = None


try:
explains = self.content['basic']['explains']
except KeyError:
explains = None

try:
webexp = self.content['web']
except KeyError:
webexp = None

print('----------translation----------\n')
l = ''
for translation in translations:
l = l + translation
print('{0}: {1}'.format(query, translation))

print('\n----------basic explain----------\n')
if us or uk:
print('us: [{0}] uk: [{1}]'.format(us, uk))
elif phonetic:
print('phonetic: [{0}]'.format(phonetic))

if explains:
for explain in explains:
print('{0}'.format(explain))

print('\n----------web explain----------\n')

if webexp:
for web in webexp:
print('{0}: {1}'.format(web['key'], ','.join(web['value'])))
print('---------------------------------')
else:
print('errorcode: %s' % errorcode)
print("""----------错误码----------------\n
101 缺少必填的参数,出现这个情况还可能是et的值和实际加密方式不对应
102 不支持的语言类型
103 翻译文本过长
104 不支持的API类型
105 不支持的签名类型
106 不支持的响应类型
107 不支持的传输加密类型
108 appKey无效
109 batchLog格式不正确
110 无相关服务的有效实例
111 开发者账号无效,可能是账号为欠费状态
201 解密失败,可能为DES,BASE64,URLDecode的错误
202 签名检验失败
203 访问IP地址不在可访问IP列表
301 辞典查询失败
302 翻译查询失败
303 服务端的其它异常
401 账户已经欠费停""")

if __name__ == '__main__':
Translator(sys.argv[1:])