主页
avatar

Kared

【百度翻译 API】Python 实现自动翻译

在多元化的全球化环境中,跨语言的交流变得越来越重要。对于开发者来说,有时需要处理多种语言的数据,或者需要为用户提供多语言的界面。这时候,翻译就成为了我们开发过程中的一项重要功能。在这篇博客中,我们将介绍如何在 Python 中调用百度翻译 API 和网页端接口,以实现自动翻译的功能。

调用百度翻译开放平台 API

百度翻译开放平台支持 200+ 语种、覆盖 4 万多个语言方向,实时响应海量、复杂的翻译请求,翻译质量达到世界领先水平,为各类开发者提供业界最全的翻译服务解决方案。下面我们来看一下如何在 Python 中调用相关 API。

首先,我们需要在百度翻译开放平台 API 的官方网站上创建一个账户,并获取 API Key 和 Secret Key。

然后,我们可以使用 Python 的 requests 库来发送 HTTP 请求,调用百度翻译 API 来进行英文和中文的互译。需要注意的是,这段代码中的 appidsecret_key 需要替换为你在百度翻译 API 中获取的真实的 appidsecret_key

import requests
import hashlib
import json
import time


def getMD5(content):
    md5 = hashlib.md5()
    md5.update(content.encode('utf-8'))
    return md5.hexdigest()


def request_translation(url, params, max_retries=5):
    retries = 0
    while retries <= max_retries:
        response = requests.get(url=url, params=params)
        target = json.loads(response.text.encode('utf-8'))
        if target.get('error_code', -1) == -1:
            return target['trans_result'][0]['dst']
        else:
            print('本次请求失败,原因为:', target['error_msg'])
            time.sleep(1)
            retries += 1
    raise Exception('Translation request failed after maximum retries.')


def translate(content, appid, secret_key, _from='en', _to='zh'):
    url = 'http://api.fanyi.baidu.com/api/trans/vip/translate'
    params = {'appid': appid, 'salt': '1314', 'from': _from, 'to': _to, 'q': content,
              'sign': getMD5(appid + content + '1314' + secret_key)}
    return request_translation(url, params)


if __name__ == '__main__':
    appid = 'appid'
    secret_key = 'secret_key'
    text = input("请输入英文:")
    print(translate(text, appid, secret_key, _from='en', _to='zh'))
    text = input("请输入中文:")
    print(translate(text, appid, secret_key, _from='zh', _to='en'))

调用百度翻译网页端接口

除了百度翻译开放平台 API,我们还可以直接调用百度翻译的网页端接口来进行翻译。这种方法的优点是不需要注册账户和获取密钥,但是可能存在一些限制,例如频率限制和翻译文本的长度限制。

[hide]

import requests
import json
import re

class Translate:
    def __init__(self, query):
        self.query = query
        self.session = requests.session()
        self.home_url = 'https://www.baidu.com'
        self.root_url = "https://fanyi.baidu.com/"
        self.type_url = "https://fanyi.baidu.com/langdetect"
        self.trans_url = "https://fanyi.baidu.com/v2transapi"

    def get_type(self):
        """ 获取语言转换类型 """
        resp = self.session.post(self.type_url, data={"query": self.query})
        json_str = resp.content.decode()
        lan = json.loads(json_str)['lan']
        to = "en" if lan == "zh" else "zh"
        return lan, to

    def get_token_gtk(self):
        """ 获取 token 和 gtk (用于合成 Sign ) """
        self.session.get(self.root_url)
        resp = self.session.get(self.root_url)
        html_str = resp.content.decode()
        token = re.findall(r"token: '(.*?)'", html_str)[0]
        gtk = re.findall(r'window.gtk = "(.*?)"', html_str)[0]
        return token, gtk

    def transform_number(self, number, operations):
        result = number
        for i in range(0, len(operations) - 2, 3):
            operation = operations[i]
            operand = operations[i + 1]
            value = operations[i + 2]
            value = ord(value) - 87 if value >= 'a' else int(value)
            value = result >> value if operand == '+' else result << value
            result = (result + value) & 4294967295 if operation == '+' else result ^ value
        return result

    def get_sign(self, gtk):
        """ 生成 Sign """
        sum_value, shift_value, encoded_values = 0, 0, []
        input_text = self.query
        for char in input_text:
            unicode_val = ord(char)
            if unicode_val < 128:
                encoded_values.append(unicode_val)
            elif unicode_val < 2048:
                encoded_values.append(unicode_val >> 6 | 192)
                encoded_values.append(63 & unicode_val | 128)
            else:
                if (55296 == (64512 & unicode_val) and char + 1 < len(input_text) and 56320 == (
                        64512 & ord(input_text[char + 1]))):
                    unicode_val = 65536 + ((1023 & unicode_val) << 10) + (1023 & ord(input_text[char + 1]))
                    encoded_values.append(unicode_val >> 18 | 240)
                    encoded_values.append(unicode_val >> 12 & 63 | 128)
                else:
                    encoded_values.append(unicode_val >> 12 | 224)
                encoded_values.append(unicode_val >> 6 & 63 | 128)
                encoded_values.append(63 & unicode_val | 128)
        total = int(gtk.split('.')[0]) or 0
        for value in encoded_values:
            total += value
            total = self.transform_number(total, "+-a^+6")
        total = self.transform_number(total, "+-3^+b+-f")
        total ^= int(gtk.split('.')[1]) or 0
        total = (total & 2147483647) + 2147483648 if total < 0 else total
        total %= 1000000
        return str(total) + '.' + str(total ^ int(gtk.split('.')[0]))

    def translate(self):
        """ 通过爬虫进行接口调用 """
        token, gtk = self.get_token_gtk()
        sign = self.get_sign(gtk)
        lan, to = self.get_type()
        data = {
            "query": self.query,
            "simple_means_flag": 3,
            "sign": sign,
            "token": token,
            "from": lan,
            "to": to,
        }
        self.session.get(self.home_url)
        """ 对获取的数据进行解析 """
        trans_resp = self.session.post(self.trans_url, data=data)
        trans_str = trans_resp.content.decode()
        trans_json = json.loads(trans_str)
        print(trans_json)
        return trans_json["trans_result"]["data"][0]["dst"]


if __name__ == '__main__':
    query = input("请输入翻译内容:")
    Trans = Translate(str(query))
    print(f'翻译的结果为:{Trans.translate()}')

[/hide]

Python 百度 自动翻译 Requests API