有道詞典js
阿新 • • 發佈:2022-04-15
一、分析
1、開啟開發者工具,輸入dog,會非同步載入一個請求,檢視請求,post
請求且攜帶了一些引數
i: dog
from: AUTO
to: AUTO
smartresult: dict
client: fanyideskweb
salt: 16500192809287
sign: 6bbe942069c6c0c3b9210b9641ea472a
lts: 1650019280928
bv: 8c5b4ecb9f7fdfe6b2997ab984775a98
doctype: json
version: 2.1
keyfrom: fanyi.web
action: FY_BY_REALTlME
2、在輸出cat,發現只有,i、salt、sign、lts
不同
3、猜想這些是需要攜帶的主要引數,而且被加密瞭然後全域性搜尋salt
,跟進去
4、在js程式碼中找salt、sign
等引數,看到md5基本上就可以確定是加密的地方了(這個得根據經驗判斷)
5、可以看出salt: i
,i
又等於r + parseInt(10 * Math.random(), 10);
,r
又等於"" + (new Date).getTime()
6、我們需要一個個分析,在控制檯中列印(new Date).getTime(),像是時間戳(可以用其他指令碼去驗證下)
7、在控制檯中列印parseInt(10 * Math.random(), 10)
,發現是隨機數0-10(10不取)中隨機一個數
8、e
沒有發現引數直接在這後面下斷點,看看e
是什麼,發現就是我們需要翻譯的單詞
9、就此我們得到了i、r、e、
,sign就是md5加密,可以用python模擬加密
二、寫程式碼,模擬請求加密過程
import time import random import requests import hashlib headers = { "Accept": "application/json, text/javascript, */*; q=0.01", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", "Connection": "keep-alive", "Content-Length": "237", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Cookie": "_ga=GA1.2.616862958.1647594822; OUTFOX_SEARCH_USER_ID_NCOO=1147769754.1075926; [email protected]; JSESSIONID=aaazFQZe9jgXm-j3qPSay; fanyi-ad-id=305560; fanyi-ad-closed=0; ___rl__test__cookies=1650017872338", "Host": "fanyi.youdao.com", "Origin": "https://fanyi.youdao.com", "Referer": "https://fanyi.youdao.com/", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36 Edg/100.0.1185.39", "X-Requested-With": "XMLHttpRequest", } word = input("請輸入需要翻譯的單詞:") # js的時間戳只有13位,所以我們也只要13位,再轉換成字元 ts = str(int(time.time()*1000)) #salt在時間戳的後面加上一個隨機數 salt = ts + str(random.randint(0,9)) #md5加密方式照抄 str_ = "fanyideskweb" + word + salt + "Ygy_4c=r#e#4EX^NUGUc5" #python 模擬md5加密 md = hashlib.md5() md.update(str_.encode()) sign = md.hexdigest() data = { "i": word, "from": "AUTO", "to": "AUTO", "smartresult": "dict", "client": "fanyideskweb", "salt": salt, "sign": sign, "lts": ts, "bv": "8c5b4ecb9f7fdfe6b2997ab984775a98", "doctype": "json", "version": "2.1", "keyfrom": "fanyi.web", "action": "FY_BY_REALTlME", } #請求資料 url = "https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule" a = requests.post(url=url,data=data,headers=headers).json() print(a)