一、缘起
一直在用的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字一篇。