Python 有道翻译器代码解析及注释
该代码使用 Python 实现了一个有道翻译器,并附带详细注释,帮助理解代码逻辑和工作原理。
- 导入需要的模块
from Crypto.Cipher import AES
from Crypto.Hash import MD5
import base64
from requests import session
from utils import get_useragent
import time
import random
import json
from rich.pretty import pprint
- 定义有道翻译器类
YoudaoTranslater,并初始化
class YoudaoTranslater:
def __init__(self) -> None:
self.sess = session()
self.sess.headers = {
'User-Agent': get_useragent(),
'origin': 'https://fanyi.youdao.com',
'referer': 'https://fanyi.youdao.com/',
}
params = {
'_npid': 'fanyiweb',
'_ncat': 'pageview',
'_ncoo': str(2147483647 * random.uniform(0, 1)),
'_nssn': 'NULL',
'_nver': '1.2.0',
'_ntms': self.__sticTime(),
}
# 发送 GET 请求,以获取有道翻译器需要的参数
self.sess.get('https://rlogs.youdao.com/rlog.php', params=params)
params = {
'keyid': 'webfanyi-key-getter',
} | self.__base_body('asdjnjfenknafdfsdfsd')
res = self.sess.get('https://dict.youdao.com/webtranslate/key', params=params)
t = res.json()
self.key = t['data']['secretKey']
其中,sess 是一个 session 对象,用于维持用户和服务器之间的会话。params 是一个字典,包含了有道翻译器需要的一些参数。self.sess.get() 方法发送 GET 请求,获取这些参数。self.key 是有道翻译器的密钥。
- 定义获取语言列表的方法
get_lan_list()
def get_lan_list(self) -> dict:
res = self.sess.get(
'https://api-overmind.youdao.com/openapi/get/luna/dict/luna-front/prod/langType'
)
return res.json()['data']['value']['textTranslate']
该方法发送 GET 请求,获取支持的语言列表。
- 定义一些私有方法
def __sticTime(self) -> str:
return str(int(time.time() * 1000))
def __sign(self, t: str, key: str) -> str:
return (
MD5.new(
f'client=fanyideskweb&mysticTime={t}&product=webfanyi&key={key}'.encode()
)
.digest()
.hex()
)
def __base_body(self, key: str) -> dict:
t = self.__sticTime()
return {
'sign': self.__sign(t, key),
'client': 'fanyideskweb',
'product': 'webfanyi',
'appVersion': '1.0.0',
'vendor': 'web',
'pointParam': 'client,mysticTime,product',
'mysticTime': t,
'keyfrom': 'fanyi.web',
}
def __decode(self, src: str) -> dict:
key = b'ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl'
iv = b'ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4'
cryptor = AES.new(
MD5.new(key).digest()[:16], AES.MODE_CBC, MD5.new(iv).digest()[:16]
)
res = cryptor.decrypt(base64.urlsafe_b64decode(src))
txt = res.decode('utf-8')
return json.loads(txt[: txt.rindex('}') + 1])
这些私有方法用于生成签名、构造请求体、解码返回结果等。
- 定义翻译方法
translate()
def translate(self, src: str, fromLan: str = 'auto', toLan: str = 'auto'):
data = {
'i': src,
'from': fromLan,
'to': toLan,
'dictResult': True,
'keyid': 'webfanyi',
} | self.__base_body(self.key)
res = self.sess.post('https://dict.youdao.com/webtranslate', data=data)
return self.__decode(res.text)
该方法发送 POST 请求,将待翻译的文本和其他参数打包在请求体中。其中,fromLan 和 toLan 分别表示源语言和目标语言,默认为自动检测语言。
main()函数
def main():
translater = YoudaoTranslater()
times = 0
while True:
pprint(translater.translate(input('>')))
times += 1
print(f'times: {times}')
该函数用于测试翻译器的功能。每次从命令行读入一个文本,调用 translate() 方法翻译它,并输出翻译结果。times 记录翻译次数。
- 执行程序
if __name__ == '__main__':
main()
该代码段用于执行程序。
原文地址: https://www.cveoy.top/t/topic/m49a 著作权归作者所有。请勿转载和采集!