有道翻译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 """ translator - Translation @author sikasjc(sikasjc@163.com) @date 2017.7.28 """ import sysimport jsonimport urllib.requestimport urllib.parseimport randomimport hashlibclass 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' : 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 :])