Home >  > Python调用有道翻译API

Python调用有道翻译API

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

暧昧帖

本文暂无标签