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()

代码说明:

  1. 模块导入:导入必要的模块,包括加密解密模块Crypto.CipherCrypto.Hash、网络请求模块requests、时间处理模块time、随机数模块random、JSON解析模块json以及美化输出模块rich.pretty
  2. 类定义:定义YoudaoTranslater类,用于封装有道翻译的功能。
  3. 初始化方法__init__方法用于初始化类,包括创建会话、设置请求头、获取密钥等操作。
  4. 语言列表获取get_lan_list方法用于获取支持的语言列表。
  5. 时间戳获取__sticTime方法用于获取当前时间戳。
  6. 签名生成__sign方法用于生成请求签名,用于验证请求合法性。
  7. 请求体生成__base_body方法用于生成请求体,包含必要的参数。
  8. 响应结果解密__decode方法用于解密有道翻译返回的加密结果,使用AES解密算法。
  9. 翻译方法translate方法用于实现翻译功能,将用户输入的文本发送到有道翻译服务器并返回翻译结果。
  10. 主函数main函数用于运行翻译程序,接收用户输入并进行翻译。

代码优化:

  1. 代码结构清晰:代码采用面向对象编程,使用类来封装翻译功能,代码结构清晰易懂。
  2. 注释详细:每个函数和代码块都添加了详细的注释,方便理解代码功能。
  3. 参数类型提示:函数参数都添加了类型提示,提高代码可读性和可维护性。
  4. 使用美化输出模块:使用rich.pretty模块来美化输出,提高用户体验。

总结:

该代码示例展示了如何使用Python实现一个简单的有道翻译器,并解释了其中涉及的加密解密操作和代码优化技巧。可以根据实际需求进行修改和扩展,例如添加更多功能、优化性能等。

Python有道翻译器代码示例:解密与优化

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

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