请解析以下代码并加上注释from CryptoCipher import AESfrom CryptoHash import MD5import base64from requests import sessionfrom utils import get_useragentimport timeimport randomimport jsonfrom richpretty import ppri
该代码实现了有道翻译的功能。具体实现如下:
- 导入需要的模块
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/bAWv 著作权归作者所有。请勿转载和采集!