每日分享:
做好自己
世界上沒有一份作業不辛苦,也沒有一處人事不復雜,無論你當下正在經歷什么,都要調整好心態,繼續前行,繼續努力!
總有人嫌你不夠好,也總有人覺得你哪里都好,愛你的人自然會愛你,不愛你的人做再多也是錯,
在長大、在失去、在努力、在接受、在好好生活,
不會js也可以解出來!!!
- 分析構建data資料
- 撰寫代碼
一、分析js構建data資料(主要講解)
1. 在隱身視窗或無痕模式登錄有道在線翻譯:https://fanyi.youdao.com/
2. 抓包 -> 輸入要翻譯的句子
3. 再新建一個隱身視窗執行步驟2,找到translate包,觀察兩次的Form Data有什么不同:
![]()
可以看到,表單中的 salt、sign、lts 這三個資料是變化的
4. 找到對應的js檔案:

可以看到,js檔案是同一個檔案(后面的數字代表位置是在多少行) ,隨意打開一個就行
5. 找一個Form Data中比較特殊的詞,例如:smartresult(不要找像第一個資料 i ,因為 i 很可能會在js代碼中出現很多次),之后直接在js代碼中查找(Ctrl+f),找到如下代碼:

很明顯可以看出,它就是js中構建Form Data的部分代碼,我們可以根據它來分析 salt、sign、lts 這三個資料是如何得到的
6. 觀察這三個資料,可以發現,它們都與 r 有關:

7. 之后就找 r 是什么,往上滑可以看到如下代碼:

所以,r 肯定與generateSaltSign這個函式有關
8. 通過查找(Ctrl+f)generateSaltSign這個關鍵詞,可以找到generateSaltSign函式是怎么來的(其他的地方都是呼叫這個函式):

9. 我們可以發現,這行代碼是把 r 的值給了generateSaltSign函式,那么說明,在這個大括號里(這一塊代碼)肯定有 r 的值,因此就在大括號中找 r 即可:

可以看出,劃線代碼就是 r 的定義
10. 可以在 r 的定義中找到 salt、sign、lts 這三個變化引數的來源:
lts:其實lts就是代碼中的ts:
看lts的值:1638699280543,看到這一串數字要想到“時間戳”(也就是時間)

ts的值是 r 的值,而 r = "" + (new Date).getTime(),沒學過js看不懂也沒關系,我們可以復制這個陳述句:(new Date).getTime(),在如下圖輸入js代碼:

如上就是得到的結果,可以推斷出,這行代碼的作用就是獲得時間戳;ts就是把時間戳變成了字串型別,ts與lts數字的個數也一致,可以推斷它們是一樣的,
salt:細心的小伙伴可以發現,salt比lts就多了一位數字
salt的值就是 i 而 i = r + parseInt(10 * Math.random(), 10);其中r是時間戳,后面代碼又看不懂了,繼續在Console中多次輸入parseInt(10 * Math.random(), 10):

多次輸入后你會發現,它是產生一個0-9的int型資料(沒有10),也就是說salt的值就是lts的值后面加上了一個亂數
sign:首先可以看出它是十六進制
sign = n.md5("fanyideskweb" + e + i + "Y2FYu%TNSbMCxc3t2u^XT")
先說一下該運算式中的e:

我們可以想一下,什么東西這么重要,使js代碼中特別多的引數都是e,當然就是要翻譯的詞/句子了,
決議sign就需要我們知道python了,python中的hashlib模塊中有md5方法

這兩個是最常見的方法
下面通過代碼,來了解md5:
import hashlib
# 進行hash運算的資料
data = 'python'
# 創建hash物件
md5 = hashlib.md5()
# 向hash物件中添加需要做hash運算的字串
md5.update(data.encode())
# 獲取字串的hash值(十六進制輸出)
result = md5.hexdigest()
print(result)
結果:

在資料不是特別特別特別......大的時候,一個data對應一個md5后的值,一般不會出現重復
到此為止,Form Data 里面的值就都解決了,接下來寫代碼即可
二、原始碼
import requests
import hashlib
import time
import random
import json
from jsonpath import jsonpath
# 撰寫代碼步驟:
# url
# headers
# form_data
# 發送請求,獲取回應
# 決議資料(Response為json資料)
class You_dao(object):
def __init__(self, word):
self.url = 'https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
self.headers = {
'User-Agent': '改為你的U-A',
'Referer': '改為你的Referer',
'Cookie': '改為你的Cookie'
}
self.form_data = None
self.word = word
# 獲取資料
def generate_form_data(self):
"""
ts: "" + (new Date).getTime()
salt: ts + parseInt(10 * Math.random(), 10);
sign: n.md5("fanyideskweb" + word + salt + "Y2FYu%TNSbMCxc3t2u^XT")
"""
lts = str(int(time.time()*1000))
salt = lts + str(random.randint(0, 9))
data = "fanyideskweb" + self.word + salt + "Y2FYu%TNSbMCxc3t2u^XT"
md5 = hashlib.md5()
md5.update(data.encode())
sign = md5.hexdigest()
# 構建表單資料
self.form_data = {
'i': self.word,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': sign,
'lts': lts,
'bv': '318dde5ec635786619012045ee59bf8a',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
}
def get_data(self):
response = requests.post(url=self.url, headers=self.headers, data=self.form_data)
return response.content
def run(self):
self.generate_form_data()
# 得到的資料為json型別
data = self.get_data()
# 將json轉化為字典
data = json.loads(data)
data = jsonpath(data, '$..tgt')[0]
print(data)
if __name__ == '__main__':
Word = input('輸入要翻譯的單詞或句子:')
you_dao = You_dao(Word)
you_dao.run()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/374792.html
標籤:其他
下一篇:Vue 組件之非單檔案組件
