http://fanyi.youdao.com/
用的是谷歌浏览器,打开链接之后,F12,打开控制台,在有道待翻译区输入任意英文,例如“love”
然后在控制台查看,发现有ajax请求
查看该请求
查看Headers,发现是post请求
观察参数,红框为动态加密参数
观察到sign签名关键字,全局搜索该参数
点击查找到的js
下断点进行观察分析
代码里面有注释:
// 这个是js文件
var r = function (e) {
var md5 = require('md5-node');
// navigator.appVersion这个参数就是UA
var t = md5("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36")
, r = "" + (new Date).getTime()
, i = r + parseInt(10 * Math.random(), 10);
var data = {
ts: r,
bv: t,
salt: i,
sign: md5("fanyideskweb" + e + i + "Tbh5E8=q6U3EXe+&L[4c@")
}
return data
};
// console.log(r("love"))
// {
// ts: '1614230672499',
// bv: 'c13aa665496786142fe81f1333cd4bec',
// salt: '16142306724998',
// sign: 'f82a7908e644a0d4d2bbbf234ac2baa1'
// }
# 这个是.py文件
import requests
import execjs
import time
import hashlib
index_url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36",
"Cookie": "OUTFOX_SEARCH_USER_ID=1468790101@10.169.0.83; JSESSIONID=aaa9hikkeF-93eRTdqxFx; OUTFOX_SEARCH_USER_ID_NCOO=2112488829.4193861; ___rl__test__cookies=1614229541217",
"Referer": "http://fanyi.youdao.com/",
}
# translate = "love"
translate = input("请输入要翻译的内容:")
node = execjs.get()
file = "youdao.js"
ctx = node.compile(open(file=file).read())
data = ctx.call("r", translate) # call后面是调用js函数 eval后面调用js变量
# print(data)
# {'ts': '1614231730580', 'bv': 'c13aa665496786142fe81f1333cd4bec', 'salt': '16142317305806', 'sign': '24a7728581cd4840239abeb34f69b09d'}
# 源匹配为 (.*):(.*)$
# 替换匹配为 "$1": "$2",
params_data = {
"i": translate,
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
"client": "fanyideskweb",
"salt": data["salt"], # 13位的时间戳+一位0-9的数,成14位str(int(time.time()*1000)) + str(random.randint(0, 9))
"sign": data["sign"],
# sign = hashlib.md5(("fanyideskweb" + translate + data["salt"] + "Tbh5E8=q6U3EXe+&L[4c@").encode('utf-8')).hexdigest()
"lts": data["ts"], # 13位的时间戳 str(int(time.time()*1000))
"bv": data["bv"], # hashlib.md5("UA")
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_REALTlME"
}
response = requests.post(url=index_url, headers=headers, data=params_data)
print(response.json())