鄭重聲明:本項目的全部代碼和相關文章, 僅用於經驗技術交流分享,禁止將相關技術應用到不正當途徑,由於濫用技術產生的風險與本人無關。前端
這篇文章是公衆號《雲爬蟲技術研究筆記》的《2019年底逆向複習系列》的第三篇:《百度指數Data加密逆向破解》python
本次案例的代碼都已上傳到Review_Reverse上面,後面會持續更新,你們能夠Fork
一波。 git
你們若是是作行業分析或者用戶畫像的話,會常常用到XX指數
這個東西,相似於百度指數
,微信指數
,微博指數
等等,這些指數用以反映不一樣關鍵詞在過去一段時間裏的「用戶關注度」和「媒體關注度」,反饋面廣、覆蓋時間長。咱們此次分析的是百度指數
,主要是由於它返回的數據是加密的,咱們看看如何來分析得到破解以後的數據。 github
咱們首先打開百度指數的頁面,打開開發者工具->從新選擇日期,搜索->查看網絡請求。 算法
xhr順序:index->ptbk->checkapi
數據估計是從index這個api返回的,咱們跟進這個請求查看。 bash
uniqid
和
data
參數,
uniqid
咱們暫時不知道有什麼意義,
data
參數是加密的,咱們須要獲取它的解密邏輯。
已知如今這個index請求是個xhr請求,咱們就給這個請求下個xhr斷點,如圖 微信
/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博客專家和華爲雲享專家。
嘔心瀝血從浩瀚的資料中整理了獨家的「私藏資料」,公衆號內回覆「私藏資料」便可領取爬蟲高級逆向教學視頻以及多平臺的中文數據集