1. 程式人生 > 其它 >有道詞典js

有道詞典js

一、分析

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)