1、分析url,url没有变
2、分析参数
shared.ydstatic.com/fanyi/newweb/v1.0.23/scripts/newweb/fanyi.min.js
3、分析加密算法
ts: 13位当前时间戳
salt : 时间戳后面加上100以内的随机数
sign: “fanyideskweb” + 要翻译的字符串 + 时间戳和随机数 + 一个常量,然后对整个字符串进行MD5加密
bv(t):该参数可固定不变(浏览器头进行md5加密)
4、python实现
import requests
import hashlib
import time
# 创建md5对象
def nmd5(str):
m = hashlib.md5() #创建一个md5加密算法对象
m.update(str.encode('utf-8')) #将str以utf-8编码转换成bytes格式,再存入到m变量中,因为update中只能存入bytes
str_md5 = m.hexdigest() #以16进制形式返回加密内容
return str_md5
def formdata(transtr):
# 待加密信息
headerstr = '5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
bv = nmd5(headerstr) #对浏览器头进行MD5加密
ts = str(round(time.time()*1000)) #time.time()*1000即得13位时间戳,round()函数四舍五入取整,str()将其转化为字符串
salt = ts + '90' #字符串拼接
strexample = 'fanyideskweb' + transtr + salt + 'n%A-rKaT5fb[Gy?;N5@Tj'
sign = nmd5(strexample) #对整个字符串进行MD5加密
#dict即为Form Data内容
dict = {'i': transtr, 'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict',
'client':'fanyideskweb',
'salt': salt,
'sign': sign,
'ts': ts,
'bv': bv,
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
}
return dict
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
#对应Request Headers, 没有Content-Lengt
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
'Referer':'http://fanyi.youdao.com/',
'Origin': 'http://fanyi.youdao.com',
'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With':'XMLHttpRequest',
'Accept':'application/json, text/javascript, */*; q=0.01',
'Accept-Encoding':'gzip, deflate',
'Accept-Language':'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Host': 'fanyi.youdao.com',
'cookie':'OUTFOX_SEARCH_USER_ID=1407777572@10.108.160.17; JSESSIONID=aaaeGGllLoBjPcrhv4i_w; OUTFOX_SEARCH_USER_ID_NCOO=618014238.7284911; ___rl__test__cookies=1578551580505'
}
if __name__ == '__main__':
input = input("请输入翻译内容:")
dict = formdata(input) #调用
req = requests.post(url, data=dict, headers=header)
val = req.json()
print(val['translateResult'][0][0]['tgt'])