【百度翻译 API】Python 实现自动翻译
在多元化的全球化环境中,跨语言的交流变得越来越重要。对于开发者来说,有时需要处理多种语言的数据,或者需要为用户提供多语言的界面。这时候,翻译就成为了我们开发过程中的一项重要功能。在这篇博客中,我们将介绍如何在 Python 中调用百度翻译 API 和网页端接口,以实现自动翻译的功能。
调用百度翻译开放平台 API
百度翻译开放平台支持 200+ 语种、覆盖 4 万多个语言方向,实时响应海量、复杂的翻译请求,翻译质量达到世界领先水平,为各类开发者提供业界最全的翻译服务解决方案。下面我们来看一下如何在 Python 中调用相关 API。
首先,我们需要在百度翻译开放平台 API 的官方网站上创建一个账户,并获取 API Key 和 Secret Key。
然后,我们可以使用 Python 的 requests
库来发送 HTTP 请求,调用百度翻译 API 来进行英文和中文的互译。需要注意的是,这段代码中的 appid
和 secret_key
需要替换为你在百度翻译 API 中获取的真实的 appid
和 secret_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]