该代码实现了有道翻译的功能。具体实现如下:

  1. 导入需要的模块
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
  1. 定义有道翻译器类 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 是有道翻译器的密钥。

  1. 定义获取语言列表的方法 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 请求,获取支持的语言列表。

  1. 定义一些私有方法
	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])

这些私有方法用于生成签名、构造请求体、解码返回结果等。

  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 请求,将待翻译的文本和其他参数打包在请求体中。其中,fromLantoLan 分别表示源语言和目标语言,默认为自动检测语言。

  1. main() 函数
def main():
	translater = YoudaoTranslater()
	times = 0
	while True:
		pprint(translater.translate(input(">")))
		times += 1
		print(f"times: {times}")

该函数用于测试翻译器的功能。每次从命令行读入一个文本,调用 translate() 方法翻译它,并输出翻译结果。times 记录翻译次数。

  1. 执行程序
if __name__ == "__main__":
	main()

该代码段用于执行程序。

请解析以下代码并加上注释from CryptoCipher import AESfrom CryptoHash import MD5import base64from requests import sessionfrom utils import get_useragentimport timeimport randomimport jsonfrom richpretty import ppri

原文地址: https://www.cveoy.top/t/topic/bAWv 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录