首先先通过POST请求向翻译网页发送请求,获取到返回的json数据
import requests
url = "https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 "
"Safari/537.36",
"Cookie": "[email protected]; OUTFOX_SEARCH_USER_ID_NCOO=1997833077.2695937; "
"___rl__test__cookies=1661932062388",
"Accept-Language": "zh-CN,zh;q=0.9",
"Referer": "https://fanyi.youdao.com/"
}
data = {
'i': '激情',
'from': 'zh-CHS',
'to': 'en',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '16619320623954',
'sign': 'e0c54e9d51998ff92b84acd4b98421ae',
'lts': '1661932062395',
'bv': '50b61ff102560ebc7bb0148b22d7715c',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
}
response = requests.post(url, headers=header, data=data).json()
print(response)
translate = response['translateResult'][0][0]
# print(translate)
print(f'单词%s的意思是%s' % (translate['tgt'], translate['src']))
当我门修改要翻译的单词时,就会报错
这是因为每次POST请求,所携带的data参数不同。重新进行抓包对比两次翻译中data参数的变化。
发现出现变化的有四处,这些值是通过js代码实现的,我们可以通过寻找这些值的生成法则来动态生成这四个值,来实现“翻译软件”
观察js调用栈,进入到js代码中。通过文档搜索的方式找到生成sign这四个键值对值的代码。并且打断点调试。
再次输入翻译发现卡到断点如下图的位置
可以估计,这里就是生成这四个键值对的值的代码
分析这段代码,根据调试信息可知
"5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"
)这样根据上述分析写出动态生成这四个键值对的代码即可。
import requests
import time
import hashlib
import random
url = "https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 "
"Safari/537.36",
"Cookie": "[email protected]; OUTFOX_SEARCH_USER_ID_NCOO=1997833077.2695937; "
"___rl__test__cookies=1661932062388",
"Accept-Language": "zh-CN,zh;q=0.9",
"Referer": "https://fanyi.youdao.com/"
}
while True:
word = input("请输入要翻译的词汇:\n")
trans = hashlib.md5()
ts = str(int(time.time() * 1000))
salt = ts + str(random.randint(0, 10))
trans.update(
'5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36'.encode(
'utf-8'))
bv = trans.hexdigest()
trans = hashlib.md5() # 清空trans
trans.update(("fanyideskweb" + word + salt + "Ygy_4c=r#e#4EX^NUGUc5").encode('utf-8'))
sign = trans.hexdigest()
data = {
'i': word,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': sign,
'lts': ts,
'bv': bv,
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
}
response = requests.post(url, headers=header, data=data).json()
print(response)
translate = response['translateResult'][0][0]
# print(translate)
print(f'%s的意思是%s' % (translate['tgt'], translate['src']))