一、缘起
一直在用的google翻译在中国下线了,没办法,只好用其他的翻译api,刚好之前给有道API充过值,里面还有差不多80元,所以就打算用起来。
它的价格:48元/百万字符。
二、代码
import requests import time import hashlib import uuid def get_chinese(translate_text): youdao_url = 'https://openapi.youdao.com/api' # 有道api地址 # 翻译文本生成sign前进行的处理 input_text = "" # 当文本长度小于等于20时,取文本 if(len(translate_text) <= 20): input_text = translate_text # 当文本长度大于20时,进行特殊处理 elif(len(translate_text) > 20): input_text = translate_text[:10] + str(len(translate_text)) + translate_text[-10:] time_curtime = int(time.time()) # 秒级时间戳获取 app_id = "..." # 应用id uu_id = uuid.uuid4() # 随机生成的uuid数,为了每次都生成一个不重复的数。 app_key = "..." # 应用密钥 sign = hashlib.sha256((app_id + input_text + str(uu_id) + str(time_curtime) + app_key).encode('utf-8')).hexdigest() # sign生成 data = { 'q':translate_text, # 翻译文本 'from':"en", # 源语言 'to':"zh-CHS", # 翻译语言 'appKey':app_id, # 应用id 'salt':uu_id, # 随机生产的uuid码 'sign':sign, # 签名 'signType':"v3", # 签名类型,固定值 'curtime':time_curtime, # 秒级时间戳 } r = requests.get(youdao_url, params = data).json() # 获取返回的json()内容 if r["errorCode"] == "0": print("翻译后的结果:" + r["translation"][0]) return r["translation"][0] else: print("翻译出错了") print(r) return 0
三、常见错误
(一){'requestId': '01cae673-70a3-47f0-8926-f661ba27031f', 'errorCode': '206', 'l': 'en2zh-CHS'}
脚本在本地电脑运行正常,可是上传到服务器上,却无法翻译,报错代码:206。
看这里的错误代码:https://ai.youdao.com/DOCSIRMA/html/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E7%BF%BB%E8%AF%91/API%E6%96%87%E6%A1%A3/%E6%96%87%E6%9C%AC%E7%BF%BB%E8%AF%91%E6%9C%8D%E5%8A%A1/%E6%96%87%E6%9C%AC%E7%BF%BB%E8%AF%91%E6%9C%8D%E5%8A%A1-API%E6%96%87%E6%A1%A3.html
206的代码是因为时间戳无效导致签名校验失败。
试了一下,不是代码的原因。后来将程序文件上传到阿里云服务器上,发现可以正常运行。
然后查看了服务器的时间,发现时间不对。
安装ntp后,使用下面的命令解决:
ntpdate -u cn.pool.ntp.org
参考:http://t.zoukankan.com/shizhijie-p-9890581.html
四、结论
有道翻译还是不能满足我的要求,因为我要翻译的内容是带一些代码的,而有道翻译的结果惨不忍睹。
五、网页翻译
(一)代码
经测试,网页翻译可以满足我的要求。
价格稍贵,50元/百万字符。
最终代码:
# -*- coding: utf-8 -*- import sys import uuid import requests import hashlib import time from imp import reload import time reload(sys) YOUDAO_URL = 'https://openapi.youdao.com/translate_html' APP_KEY = 'xxx' APP_SECRET = 'xxx' class Translate(): def __init__(self, q): self.q = q def encrypt(self,signStr): hash_algorithm = hashlib.sha256() hash_algorithm.update(signStr.encode('utf-8')) return hash_algorithm.hexdigest() def truncate(self,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(self,data): headers = {'Content-Type': 'application/x-www-form-urlencoded'} return requests.post(YOUDAO_URL, data=data, headers=headers) def get_chinese_conetent(self): # self.q = input_content data = {} data['from'] = 'en' data['to'] = 'zh-CHS' data['signType'] = 'v3' curtime = str(int(time.time())) data['curtime'] = curtime salt = str(uuid.uuid1()) signStr = APP_KEY + self.truncate(self.q) + salt + curtime + APP_SECRET sign = self.encrypt(signStr) data['appKey'] = APP_KEY data['q'] = self.q data['salt'] = salt data['sign'] = sign response = self.do_request(data) contentType = response.headers['Content-Type'] if contentType == "audio/mp3": millis = int(round(time.time() * 1000)) filePath = "合成的音频存储路径" + str(millis) + ".mp3" fo = open(filePath, 'wb') fo.write(response.content) fo.close() else: result = response.content.decode("utf-8") result = eval(result) return result["data"]["translation"] # print(result["data"]["translation"]) # if __name__ == '__main__': # a = Translate("i love you") # b = a.get_chinese_conetent() # print(b)
网址:
https://ai.youdao.com/rich-translate.s#/
https://ai.youdao.com/DOCSIRMA/html/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E7%BF%BB%E8%AF%91/API%E6%96%87%E6%A1%A3/%E7%BD%91%E9%A1%B5%E7%BF%BB%E8%AF%91%E6%9C%8D%E5%8A%A1/%E7%BD%91%E9%A1%B5%E7%BF%BB%E8%AF%91%E6%9C%8D%E5%8A%A1-API%E6%96%87%E6%A1%A3.html
(二)价格
可是试用了一下,价格还是太贵了。我一个晚上,发布了100篇文章,用了74.12-63.67=10.45元。
那么一篇文章差不多有:20万字/100=2000字一篇。
可是我的文章绝大多数没有2000字一篇。