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
# 定义有道翻译器类
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/',
}
# 发送请求获取参数_npcoo、_ntms等
params = {
'_npid': 'fanyiweb',
'_ncat': 'pageview',
'_ncoo': str(2147483647 * random.uniform(0, 1)),
'_nssn': 'NULL',
'_nver': '1.2.0',
'_ntms': self.__sticTime(),
}
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']
# 获取语言列表
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']
# 获取当前时间戳
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])
# 翻译方法
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)
# 主函数
def main():
# 创建有道翻译器实例
translater = YoudaoTranslater()
times = 0
# 循环翻译输入的文本
while True:
pprint(translater.translate(input('>')))
times += 1
print(f'times: {times}')
# 判断是否在主程序中执行
if __name__ == '__main__':
main()
代码说明:
- 模块导入:导入必要的模块,包括加密解密模块
Crypto.Cipher和Crypto.Hash、网络请求模块requests、时间处理模块time、随机数模块random、JSON解析模块json以及美化输出模块rich.pretty。 - 类定义:定义
YoudaoTranslater类,用于封装有道翻译的功能。 - 初始化方法:
__init__方法用于初始化类,包括创建会话、设置请求头、获取密钥等操作。 - 语言列表获取:
get_lan_list方法用于获取支持的语言列表。 - 时间戳获取:
__sticTime方法用于获取当前时间戳。 - 签名生成:
__sign方法用于生成请求签名,用于验证请求合法性。 - 请求体生成:
__base_body方法用于生成请求体,包含必要的参数。 - 响应结果解密:
__decode方法用于解密有道翻译返回的加密结果,使用AES解密算法。 - 翻译方法:
translate方法用于实现翻译功能,将用户输入的文本发送到有道翻译服务器并返回翻译结果。 - 主函数:
main函数用于运行翻译程序,接收用户输入并进行翻译。
代码优化:
- 代码结构清晰:代码采用面向对象编程,使用类来封装翻译功能,代码结构清晰易懂。
- 注释详细:每个函数和代码块都添加了详细的注释,方便理解代码功能。
- 参数类型提示:函数参数都添加了类型提示,提高代码可读性和可维护性。
- 使用美化输出模块:使用
rich.pretty模块来美化输出,提高用户体验。
总结:
该代码示例展示了如何使用Python实现一个简单的有道翻译器,并解释了其中涉及的加密解密操作和代码优化技巧。可以根据实际需求进行修改和扩展,例如添加更多功能、优化性能等。
原文地址: https://www.cveoy.top/t/topic/m49W 著作权归作者所有。请勿转载和采集!