文章目录
前言
有道翻译地址:http://fanyi.youdao.com/
一、页面分析
1.按F12,进入调试输入爬虫两个字
2.参数解析
- salt:13位时间戳+一个随机数
- sign:加密参数
- lts:13位时间戳
- bv:浏览器版本的加密参数
二、参数破解
1.参数加密位置查找
1.1 老规矩直接搜索sign,出来一个直接点进去
1.2 点进去后再搜寻sign,找到加密的位置
1.3 下断点调试,即可获取加密方式
- salt:13位时间戳+一个随机数
- sign:MD5(‘fanyideskweb’+翻译参数+salt+’]BjuETDhU)zqSxf-=B#7m’)
- lts:13位时间戳
- bv:MD5(浏览器版本)
2.参数破解测试
2.1 可以看出是成功的~
三、代码
import requests
import execjs
cookies = {
'OUTFOX_SEARCH_USER_ID': '[email protected]', # 这个必须要加,随便构造一个就行 格式:[email protected]
}
headers = {
'Connection': 'keep-alive',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Origin': 'http://fanyi.youdao.com',
'Referer': 'http://fanyi.youdao.com/',
'Accept-Language': 'zh-CN,zh;q=0.9',
}
with open('code.js', encoding='utf8') as f:
js = f.read()
js_func = execjs.compile(js) # JS读取编译
translation_key = '爬虫'
encode_params = js_func.call('get_params',translation_key) # 获取加密参数
print(encode_params,'\n')
data = {
'i': translation_key,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': encode_params['salt'],
'sign': encode_params['sign'],
'lts': encode_params['ts'],
'bv': encode_params['bv'],
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
}
response = requests.post('http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule', headers=headers,cookies=cookies, data=data, verify=False)
print(response.text)
var CryptoJS = require('crypto-js'); //这里用的是nodeJS的加密包
function get_params(data) {
var useragent = "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36";
var bv = CryptoJS.MD5(useragent).toString()
, ts = "" + (new Date).getTime()
, salt = ts + parseInt(10 * Math.random(), 10);
var sign = CryptoJS.MD5('fanyideskweb'+data+salt+']BjuETDhU)zqSxf-=B#7m').toString();
return {
bv: bv, ts: ts, salt: salt, sign: sign}
}
console.log(get_params('爬虫'));