破解
- 获取url
- 发送数据的方式
- 构造数据
- 获取结果
获取url
可以通过chrome的开发者工具network查看请求发生的详细数据,获取到头部数据,以及发送的数据
发送数据方式
get和post一般二选一,通过查看数据的详细信息,得到请求为post方式
构造数据
多请求几次,弄清楚每个字段的含义,然后构造各个字段。主要是4个字段在变化.在youdao.js中可以找到各个字段的含义 salt : i = "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10)) sign: # o = n.md5("fanyideskweb" + "word" + salt + "ebSeFb%=XZ%T[KZ)c(sy!");
ts: 为完整的时间戳字符串 bv: 客户端版本的md5,不换客户端这个值不会变化
获取结果
通过python3的requests库,获得发送之后的结果,并将其输出。
后续
如果请求次数多了之后有道官方是否回封ip,如果封ip的话,需要用ip代理以及多请求头来实现一个完整的代码来实现一个工具。
# -*- coding: utf-8 -*-
import requests
import random
import time
import hashlib
word = "今天晚上下雨"
appversion = "5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36"
data = {
"i": word,
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
"client": "fanyideskweb",
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_REALTlME"
}
salt = str(int(time.time() * 1000) + random.randint(0, 9))
sign = hashlib.md5()
sign.update("".join([
"fanyideskweb", word, salt, "@6f#X3=cCuncYssPsuRUE"
]).encode("utf-8"))
sign = sign.hexdigest()
bv = hashlib.md5()
bv.update("".join([appversion]).encode("utf-8"))
bv=bv.hexdigest()
data["salt"] = salt
data["sign"] = sign
data["ts"] = str(int(time.time() * 1000))
data["bv"] = bv
headers = {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
"Connection": "keep-alive",
"Content-Length": "251",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Cookie": "OUTFOX_SEARCH_USER_ID=-399226185@10.108.160.19; JSESSIONID=aaaI_UrHnAfSw6oMdoRTw; OUTFOX_SEARCH_USER_ID_NCOO=670443238.5496794; ___rl__test__cookies=1560871983956",
"Host": "fanyi.youdao.com",
"Origin": "http://fanyi.youdao.com",
"Referer": "http://fanyi.youdao.com/",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36",
"X-Requested-With": "XMLHttpRequest"
}
url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
response = requests.post(url, data=data, headers=headers)
print(response.text)