1. 获取有道翻译发送请求的 url
url=http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule,请求方式是 post 请求。
2. 分析请求的参数
我们通过两次输入需要翻译的内容来比较参数的变化;第一次输入“China”,第二次输入“Wuhan”。
3. 解析加密规则
获取传递加密信息的JSON文件:
url=http://shared.ydstatic.com/fanyi/newweb/v1.0.24/scripts/newweb/fanyi.min.js
打开fanyi.min.js文件,找到加密信息:
解析加密参数 salt,sign,ts:
(1)salt=i;i=r + parseInt(10 * Math.random(), 10);r="" + (new Date).getTime();
解:r 是一个字符串,将“13位int型”的时间戳转换为字符串型;i 是一个字符串,是将“r”与“一个0到9以内的数”拼接。
(2)sign=n.md5("fanyideskweb" + e + i + "Nw(nmmbP%A-r6U3EUn]Aj");e 是输入的参数(翻译的内容);
解:sign 是组合的字符串由 md5 方式加密。
(3)ts=r。
4. 导包
import requests
import hashlib
import time,random
5. 定制请求头
需要加入cookies信息!
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36",
"Referer": "http://fanyi.youdao.com/",
"Cookie": "OUTFOX_SEARCH_USER_ID=1081060511@10.108.160.17; OUTFOX_SEARCH_USER_ID_NCOO=1068440291.006373; JSESSIONID=aaasTicdPWYGUedFIEWbx; ___rl__test__cookies=1582466646528"
}
6. 定义参数
e = input("请输入要翻译的内容:")
ts = "" + str(int(time.time()*1000))
salt = ts + str(random.randint(0,9))
key = "fanyideskweb" + e + str(salt) + "Nw(nmmbP%A-r6U3EUn]Aj"
md = hashlib.md5()
md.update(key.encode("utf-8"))
sign = md.hexdigest()
keywords = {
"i":e,
"from":"AUTO",
"to":"AUTO",
"smartresult":"dict",
"client":"fanyideskweb",
"salt":salt,
"sign":sign,
"ts":ts,
"bv":"5158ae48583349ec7168cd8d4689c03e",
"doctype":"json",
"version":"2.1",
"keyfrom":"fanyi.web",
"action":"FY_BY_REALTlME"
}
7. 发起请求并返回翻译结果
response = requests.post(url=url,data=form,headers=headers)
res = response.json()
print(res['translateResult'][0][0]['tgt'])
8. 附完整代码
import requests
import hashlib
import time,random,json
# print("输入“q”会退出!")
url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
"Referer": "http://fanyi.youdao.com/",
"Cookie": "P_INFO=maergaiyun@163.com|1582607187|0|other|00&99|xij&1582607146&other#xij&650100#10#0#0|&0|urs&mail163|maergaiyun@163.com; OUTFOX_SEARCH_USER_ID=993199314@10.108.160.19; JSESSIONID=aaarZ13-IPaJE6wkb96bx; OUTFOX_SEARCH_USER_ID_NCOO=678232608.6743829; ___rl__test__cookies=1582622185412"
}
e = input("请输入要翻译的内容:")
ts = "" + str(int(time.time()*1000))
salt = ts + str(random.randint(0,9))
key = "fanyideskweb" + e + str(salt) + "Nw(nmmbP%A-r6U3EUn]Aj"
md = hashlib.md5()
md.update(key.encode("utf-8"))
sign = md.hexdigest()
keywords = {
"i":e,
"from":"AUTO",
"to":"AUTO",
"smartresult":"dict",
"client":"fanyideskweb",
"salt":salt,
"sign":sign,
"ts":ts,
"bv":"5158ae48583349ec7168cd8d4689c03e",
"doctype":"json",
"version":"2.1",
"keyfrom":"fanyi.web",
"action":"FY_BY_REALTlME"
}
response = requests.post(url=url, data=keywords, headers=headers)
res = response.json()
print("翻译结果:" + res['translateResult'][0][0]['tgt'])