1. 程式人生 > 程式設計 >爬蟲:對網站加密請求的分析

爬蟲:對網站加密請求的分析

爬蟲:對網站加密請求的分析

引語:

最近因為有一些需求,需要對某些網站的資料進行抓取然後分析使用者的行為之類的.所以對遇到的一些問題進行一個記錄,第一次處理這種加密的請求,也花費了自己不少時間,做一個處理過程的記錄.給有類似需求的朋友也增加一個可參考的資料.

分析步驟:

1.首先是要看請求的url大致樣子是

這裡是一個get請求,uri的組成是:網站域名+api地址+analysis引數.
加密的部分其實就是這個analysis,這個網站有get和post的請求,但是都會在引數裡面加一個analysis引數,用來區分是 內部呼叫還是其他人的請求.所以咱們只要破解了這個引數的生成規則,就可以拿到這個網站的資料了. 2.因此我們找找看能不能從網站的js檔案或者哪裡找出這個拼接引數加密的規則,就從第一個的請求引數開始,我們處於開發者模式下,點選Network,然後選擇第一個介面,點選Initiator. 會跳轉到對應的js中.這時候發現js是壓縮的,點選chrome開發者工具自帶的格式化程式碼
格式程式碼後,我們就方便檢視加密規則是從哪裡來的了.
3.這時候我們可以在Network右邊的側邊欄加入XHR breakPoint,
將我們前面的url中的關鍵字新增進來,然後重新整理頁面,當再次請求到這個url的時候,就回進入到這個斷點中
左邊就是程式碼中各種引數的變數,值等,右邊就是呼叫棧,我們可以一步步從中去找尋引數是從哪裡加密的.
4.這個網站的js裡面的函式對於我一個後端來說講道理,有些難讀懂,我是從參考了網上一些大神的資料,然後從最初的一個呼叫棧一個個網上檢視傳遞的引數是什麼,來檢視到底是哪一步進行的加密.
這個過程很花時間,js檔案中有很多很多匿名函式,除錯的時候沒法一步步全部看完,主要是要找傳參的問題,對比發現圖中兩個呼叫棧中的引數中有一個沒有analysis引數,說明加密是在另一個呼叫棧中完成的.於是乎定位到了是在get這個呼叫中加密的,知道了在哪個檔案中加密的就好辦了.
5.我們在剛才的get呼叫這個裡面打上斷點一步步除錯看看引數值
這裡其實可讀性也挺差的,我們可以將滑鼠選中自己要檢視的引數一步步推出來大致的加密過程 這裡也是要花不少時間,推算出來

結果:

最後翻譯為java程式碼大概是這樣

private static String generatorAnalysis() {
       final String FLAG = "@#";
       // @#/rank/indexPlus/brand_id/1@#52217050198@#1
       // 時間戳的差值
       Long time = System.currentTimeMillis() - 1515125653845L;
       // 請求的api
       String baseUrl = "/rank/indexPlus/brand_id/1"
; StringBuilder builder = new StringBuilder(FLAG); // 拼接字串的規則 api + @# + 時間戳差值 + @#1 builder.append(baseUrl).append(FLAG).append(time).append(FLAG).append(1); // 自定義的加密 這裡加密函式不就給出了 可以自己根據斷點裡面的值推算出來哦 String encodeStr = diyEncode(builder.toString()); // 最後base64編碼下 return new String(Base64.getEncoder().encode(encodeStr.getBytes())); } 複製程式碼

1.先根據當前13位的時間戳和固定的一個時間戳生成一個差值
2.第二個引數是請求的api
3.再根據js中的拼接規則給拼接出來一個具體的字串 其中有一個@#是拼接的分隔符
4.在對這個字串進行加密操作
5.最後對這個字串進行base64編碼就完成了

總結:

    以後遇到遇到加密引數先不要慌,如果是網站不是app的加密引數,還是有很大的概率可以弄出來的.分析好url的結構,然後根據引用到的js檔案反推加密的過程,這個過程可能會用到fidder或者Charles這樣的工具,替換掉網站的js(用來窺探一些引數的值,文中沒有給出,打算下次再寫一篇專門介紹下).最後在將加密規則翻譯為程式碼就可以了.主要花時間的點就在於從js檔案中尋找加密的程式碼和翻譯加密程式碼的過程,要細心有可能加密的部分就是一行,但是卻是最關鍵的點. 再次做個記錄,也幫助其他朋友破解類似網站來抓取資料,但是不要用來作違反的事情.