鄭重聲明:本項目的全部代碼和相關文章, 僅用於經驗技術交流分享,禁止將相關技術應用到不正當途徑,由於濫用技術產生的風險與本人無關。前端
這篇文章是公衆號《雲爬蟲技術研究筆記》的《2019年底逆向複習系列》的第三篇:《百度指數Data加密逆向破解》python
本次案例的代碼都已上傳到Review_Reverse上面,後面會持續更新,你們能夠Fork
一波。 git
你們若是是作行業分析或者用戶畫像的話,會常常用到XX指數
這個東西,相似於百度指數
,微信指數
,微博指數
等等,這些指數用以反映不一樣關鍵詞在過去一段時間裏的「用戶關注度」和「媒體關注度」,反饋面廣、覆蓋時間長。咱們此次分析的是百度指數
,主要是由於它返回的數據是加密的,咱們看看如何來分析得到破解以後的數據。 github
咱們首先打開百度指數的頁面,打開開發者工具->從新選擇日期,搜索->查看網絡請求。 算法
咱們能夠看到整個網絡請求的邏輯xhr順序:index->ptbk->checkapi
數據估計是從index這個api返回的,咱們跟進這個請求查看。 bash
咱們首先觀察這個請求的結果,主要有兩個地方咱們須要注意,uniqid
和
data
參數,
uniqid
咱們暫時不知道有什麼意義,
data
參數是加密的,咱們須要獲取它的解密邏輯。
已知如今這個index請求是個xhr請求,咱們就給這個請求下個xhr斷點,如圖 微信
咱們從這裏,也就是initiator跟進去(PS:initiator是說明從哪一個對象和這進程發起請求的) 在右側Xhr/fetch BP下個斷點,斷點的值就是咱們這個index請求的部分地址/api/Searchapi/index
,咱們打下斷點以後根據以前的邏輯,重選時間,再次請求
咱們能夠看到斷點打在
n.send(t.getBody())
這裏,咱們能夠看到右側有
Call stack
調用棧列表,說明在達到這個斷點以前調用了哪些函數和對象,咱們順着這個調用棧一個個往回追溯。
咱們首先看到前幾個調用棧的對象,若是作過前端開發的話,很容易理解是前框框架作的一些封裝,針對每個請求/響應進行處理,咱們接着往下看
這個調用很明顯,從這個方法的名字很容易看出,咱們接着好好看看這個方法的代碼邏輯
很好理解的代碼邏輯,咱們能夠看到
e.chartData
的結果很像咱們剛纔看到的index接口返回的數據,從代碼上看,應該是首先初始化,而後對部分的數據進行加密,加密的方法是
P.a.decrypt
,那麼咱們就對這個方法下個斷點跟進去
斷點已經下好,接着跟進去
咱們能夠看到
decrypt
,裏面的代碼沒有額外的混淆,很好理解邏輯,這個方法有兩個參數,
e
和
t
,下面咱們看看這兩個參數怎麼得到的
從decrypt的邏輯上看,這兩個參數應該是祕鑰和祕文網絡
uniqid
參數
咱們繼續尋找這個uniqid
參數,發現這個參數是咱們一開始請求的index那個接口中返回的一個字段的數據。咱們再重頭理清一下思路,根據網絡請求的順序,咱們大體能夠理出這樣一個請求的思路: 框架
到此爲止,咱們分析好了整個算法的流程,下面咱們重寫decrypt
算法。
# Js版本
decrypt: function(t, e) {
for (var n = t.split(""), i = e.split(""), a = {}, r = [], o = 0; o < n.length / 2; o++)
a[n[o]] = n[n.length / 2 + o];
for (var s = 0; s < e.length; s++)
r.push(a[i[s]]);
return r.join("")
},
複製代碼
算法比較簡單,咱們改寫成Python
版本
# python版本
def decrypt(t: str, e: str) -> str:
n, i, a, result = list(t), list(e), {}, []
ln = int(len(n)/2)
start, end = n[ln:], n[:ln]
a = dict(zip(end, start))
return ''.join([a[j] for j in e])
複製代碼
思路如上面的流程圖所示
有了上面這個分析流程,咱們就能夠開始Coding
了,如下是decrypt
解密的流程。
從這個複習的案例咱們能夠總結下思路:
network
搜搜是否是先後文中返回的多年反爬蟲破解經驗,AKA「逆向小學生」,沉迷數據分析和黑客增加不能自拔,虛名有CSDN博客專家和華爲雲享專家。
嘔心瀝血從浩瀚的資料中整理了獨家的「私藏資料」,公衆號內回覆「私藏資料」便可領取爬蟲高級逆向教學視頻以及多平臺的中文數據集