Sunday01's picture
up
9dce458
#from https://pypi.org/project/baidu-trans/
import hashlib
import urllib.parse
import random
import re
import aiohttp
from .common import CommonTranslator, InvalidServerResponse, MissingAPIKeyException
from .keys import BAIDU_APP_ID, BAIDU_SECRET_KEY
# base api url
BASE_URL = 'api.fanyi.baidu.com'
API_URL = '/api/trans/vip/translate'
class BaiduTranslator(CommonTranslator):
_LANGUAGE_CODE_MAP = {
'CHS': 'zh',
'CHT': 'cht',
'JPN': 'ja',
'ENG': 'en',
'KOR': 'kor',
'VIN': 'vie',
'CSY': 'cs',
'NLD': 'nl',
'FRA': 'fra',
'DEU': 'de',
'HUN': 'hu',
'ITA': 'it',
'PLK': 'pl',
'PTB': 'pt',
'ROM': 'rom',
'RUS': 'ru',
'ESP': 'spa',
'SRP': 'srp',
'HRV': 'hrv',
'THA': 'th'
}
_INVALID_REPEAT_COUNT = 1
def __init__(self) -> None:
super().__init__()
if not BAIDU_APP_ID or not BAIDU_SECRET_KEY:
raise MissingAPIKeyException('Please set the BAIDU_APP_ID and BAIDU_SECRET_KEY environment variables before using the baidu translator.')
async def _translate(self, from_lang, to_lang, queries):
# Split queries with \n up
n_queries = []
query_split_sizes = []
for query in queries:
batch = query.split('\n')
query_split_sizes.append(len(batch))
n_queries.extend(batch)
url = self.get_url(from_lang, to_lang, '\n'.join(n_queries))
async with aiohttp.ClientSession() as session:
async with session.get('https://'+BASE_URL+url) as resp:
result = await resp.json()
result_list = []
if "trans_result" not in result:
raise InvalidServerResponse(f'Baidu returned invalid response: {result}\nAre the API keys set correctly?')
for ret in result["trans_result"]:
for v in ret["dst"].split('\n'):
result_list.append(v)
# Join queries that had \n back together
translations = []
i = 0
for size in query_split_sizes:
translations.append('\n'.join(result_list[i:i+size]))
i += size
return translations
def _modify_invalid_translation_query(self, query: str, trans: str) -> str:
query = re.sub(r'(.)\1{2}', r'\g<0>\n', query)
return query
@staticmethod
def get_url(from_lang, to_lang, query_text):
# 随机数据
salt = random.randint(32768, 65536)
# MD5生成签名
sign = BAIDU_APP_ID + query_text + str(salt) + BAIDU_SECRET_KEY
m1 = hashlib.md5()
m1.update(sign.encode('utf-8'))
sign = m1.hexdigest()
# 拼接URL
url = API_URL +'?appid=' + BAIDU_APP_ID + '&q=' + urllib.parse.quote(query_text) + '&from=' + from_lang + '&to=' + to_lang + '&salt=' + str(salt) + '&sign=' + sign
return url