1. import requests, time, random, hashlib, json
    2. class Youdao(object):
    3. def __init__(self, word):
    4. self.url = 'https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
    5. self.headers = {
    6. # 注意:这个网站除了UA还需要添加Cookie和Referer,否则会被识别反爬
    7. 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36',
    8. 'Cookie': 'DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|; OUTFOX_SEARCH_USER_ID=1018463512@10.110.96.154; JSESSIONID=abchA3lzbYjjyfdg7p68x; OUTFOX_SEARCH_USER_ID_NCOO=2110599486.4131353; _ntes_nnid=36fe24d8afdd8243cd3050bdf3dff458,1645949786934; ___rl__test__cookies=1645949820590',
    9. 'Referer': 'https://fanyi.youdao.com/?keyfrom=dict2.top'
    10. }
    11. self.word = word
    12. self.formdata = None
    13. def generate_formdata(self):
    14. # 生成formdata
    15. """
    16. var r = function(e) {
    17. var t = n.md5(navigator.appVersion),
    18. r = "" + (new Date).getTime(), ## (new Date).getTime()是13位时间戳
    19. i = r + parseInt(10 * Math.random(), 10); ## parseInt(10 * Math.random(), 10)是0-9之间的随机数
    20. return {
    21. ts: r,
    22. bv: t,
    23. salt: i,
    24. sign: n.md5("fanyideskweb" + e + i + "Ygy_4c=r#e#4EX^NUGUc5") ## md5加密
    25. }
    26. };
    27. """
    28. # 模拟13位的时间戳并转为字符串类型
    29. ts = str(int(time.time() * 1000))
    30. # 模拟随机0-9的数字
    31. salt = ts + str(random.randint(0, 9))
    32. # 组件需要hash的字符串
    33. tempstr = "fanyideskweb" + self.word + salt + "Ygy_4c=r#e#4EX^NUGUc5"
    34. # 创建hash对象
    35. md5 = hashlib.md5()
    36. # hash使用必须是
    37. md5.update(tempstr.encode())
    38. # 按照js要求加密成十六进制
    39. sign = md5.hexdigest()
    40. # 创建formdata
    41. self.formdata = {
    42. 'i': self.word,
    43. 'from': 'AUTO',
    44. 'to': 'AUTO',
    45. 'smartresult': 'dict',
    46. 'client': 'fanyideskweb',
    47. 'salt': salt,
    48. 'sign': sign,
    49. 'lts': ts,
    50. 'bv': '5e789d5c7fff980bf5f779d3f297e31b',
    51. 'doctype': 'json',
    52. 'version': '2.1',
    53. 'keyfrom': 'fanyi.web',
    54. 'action': 'FY_BY_REALTlME'
    55. }
    56. # print(self.formdata)
    57. def get_data(self):
    58. # 发起请求获取响应
    59. response = requests.post(url=self.url, headers=self.headers, data=self.formdata)
    60. return response.content
    61. def parse_data(self,data):
    62. # 解析响应数据
    63. json_data = json.loads(data)['translateResult'][0][0]['tgt']
    64. print(json_data)
    65. def run(self):
    66. # url
    67. # headers
    68. # formdata
    69. self.generate_formdata()
    70. # 发送请求获取响应
    71. data = self.get_data()
    72. # print(data)
    73. # 解析数据
    74. # json_data = json.loads(data)['translateResult'][0][0]['tgt']
    75. # print(json_data)
    76. self.parse_data(data)
    77. if __name__ == '__main__':
    78. words = input('请输入您想要翻译的句子或单词:')
    79. youdao = Youdao(words)
    80. # youdao = Youdao('人生苦短,及时行乐')
    81. youdao.run()