没什么好说的,直接上代码。
import requests # import json import time import random import hashlib translate = input('>>>>>>>') url_1 = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule' ts = str(int(time.time()*1000)) salt = ts + str(int(random.random()*10)) print(ts,salt) md5 = hashlib.md5() md5.update(("fanyideskweb" + translate + salt + "p09@Bn{h02_BIEe]$P^nG").encode('utf8')) sign = md5.hexdigest() print(sign) data = {'i': translate, 'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb', 'ts': ts, 'salt': salt, 'sign': sign, 'bv': 'b8bcedb6e9d30eb0beaae6f2c4cb90f1', 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web', 'action': 'FY_BY_REALTIME', 'typoResult': 'false', } cookies = {'OUTFOX_SEARCH_USER_ID': ###不告诉你自己看自己的##, 'OUTFOX_SEARCH_USER_ID_NCOO': ##不告诉你自己看自己的##, 'JSESSIONID': ##不告诉你自己看自己的###, '___rl__test__cookies': str(int(ts)-7)} header = {'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'Content-Length': '252', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'DNT': '1', 'Host': 'fanyi.youdao.com', 'Origin': 'http://fanyi.youdao.com', 'Pragma': 'no-cache', 'Referer': 'http://fanyi.youdao.com/', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) ' 'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest', } res_1 = requests.post(url_1, data=data, headers=header, cookies=cookies) print(res_1.text)
稍微解释一下。
ts是根据系统时间生成的毫秒。(随便什么时间。我试过1990年都可以。)
salt是str(ts)后与1-9随机一个数字做拼接。
sign是MD5("fanyideskweb" + 待翻译内容 + salt + "p09@Bn{h02_BIEe]$P^nG")
bv是MD5(浏览器的版本信息,如5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36)所以请求头中一定要带 上User-Agent)
!cookies中的___rl__test__cookies应该是首次打开网页时的系统时间,后面每次请求都会变。总之就是记录发送翻译请求前的时间。随便拿ts减个数字就行了。(应该吧)
其他的参数。固定就行(看下自己浏览器发的数据填上去就行)。没具体测试每一个参数。懒得弄的,就把一直在变化的测试了下,其他都是复制粘贴的。
总之,有道的反爬还是很简单的。答案在js代码中都能找到。就这样吧。