天天看點

爬蟲和網易雲音樂API的一次嘗試

最近有空,在好友的呼喚下,幫助他做一個爬取網易雲音樂排行榜資訊的小程式,收獲頗多.

       進入網易雲官網.F12 

打開後發現網易雲的API,參數被加密:

爬蟲和網易雲音樂API的一次嘗試

對前端不太熟,也無從下手,隻知道這個資訊很重要,多虧了 百度一下 ,找到了很多陳舊的部落格,有了些許蛛絲馬迹.

多數用python去寫,經過一些嘗試,确定了不少可用的api接口,但是資料大多數不是不完整就是不正确,特别是音樂的下載下傳連結,

那就一個網絡上都是複制一個人的東西.

後來我看見一種全新的嘗試方式,通過攔截前端調用的JS,本地調試.(我不會前端,對于我來說還是挺新奇的.)

大概方式如下:

1. 下載下傳 Fiddler.exe ( http代理)

2. 進入網易雲音樂官網 F12 - network - js ,找到core.js ,下載下傳到本地.

爬蟲和網易雲音樂API的一次嘗試

3.fidedle - AutoResponder - Add rule

爬蟲和網易雲音樂API的一次嘗試

以上三步, 即可完成使用本地JS檔案.

可是,這個檔案是進過混淆的,你讓我格式化排版 一行行看我也是可能.更何況JS不熟.

我就百度呗. 終于找到一點眉目.  一個關鍵詞- windos.asrsea

這個普遍出現在别人的論壇部落格中.我就試着搜~

爬蟲和網易雲音樂API的一次嘗試

結果 還真有, 然後我看了看這個d函數,哎嘿,我看不懂 什麼七七八八的東西,很繞~

  繼續百度 ,知道了一些有趣的事情:

很多人分析這個函數是用來加密參數的,甚至分析出這個函數的各種語言版本.

我嘗試了下 java的 和c# 的代碼加密參數.~發現出來之後的格式樣子還是有差别的.

是以,我想 為什麼我要自己改寫,為什麼我不能直接調用? -‘js腳本 python調用’

我猜想并尋找, 真的可以 ,順便寫了幾個例子玩兒,大概會用了.

Python  - execjs 

用它就行.

加密是完成了. 但是 加密什麼東西呢? 

我們有它的JS檔案,我試着列印LOG . 我能想到很多地方,我時不想看代碼的,人很笨也比較懶惰.

在 windos.asrsea 被調用的哪一部分, 會傳入 一段 URL的字尾 以及http請求的param.

爬蟲和網易雲音樂API的一次嘗試

最後,

params = encText

encSecKey = encSecKey .

http請求頭 必須帶上兩個資訊:

Host:

music.163.com

Referer:

http://music.163.com/

還有一些其他有趣的東西,比如 廣告植入 支付加密等 ,比較繞 不是太清楚,而且 大概上午 和 下午的JS混淆的不同,但是總的來說就2-3個core.JS檔案

隻是 混淆的單詞不同,内容邏輯是一樣的. 為什麼上午的JS 到了下午不能用,我猜測 和 另外一個ga.js push.js 有關.不過無關緊要.

下面是 我找到的一些接口和參數列印的日志:

擷取歌曲資訊

{csrf_token: "fd1acbd02cc87df18472e5ecf775d12b"}

http://music.163.com/api/v3/song/detail?id=418603077&c=[{"id":"418603077"}]

Post請求

特别說明下:  

Csrf_token 這個值,似乎是從 js架構NEJ ,讀取的一個固定值,但是有時候 同一台機器的這串值不同.  我在試驗中發現,這個竟然可以為空.

使用者登陸:

http://music.163.com/weapi/login

{username:"[email protected]",password:"85ba959c3bd635ee3e36eb627396a901",rememberLogin:"true",clientToken:"1_p6TngU67yeLbMmO6twZD0LG15hjOyDWo_iRZrSsAyAHKR+yLFk+BCgIXY3mEjgrYw",csrf_token:"9b213a0d047c0bf18b3e345fd8ce42cb"}

密碼是 被MD5加密了.

擷取評論

http://music.163.com/weapi/v1/resource/comments/R_AL_3_18903

{rid: "R_AL_3_18903", offset: "0", total: "true", limit: "20", csrf_token: "fd1acbd02cc87df18472e5ecf775d12b"}

模糊查詢

http://music.163.com/weapi/search/suggest/multimatch

{s: "短發", csrf_token: "932a0858c7ea7678bbccb97b0d75f4fe"

...

還有更多 我不想一一成列了,我寫了兩個demo ,可直接運作,

1 直接抓取排行榜 熱門歌曲的資訊并下載下傳歌曲 歌詞等.

GITHUB : https://github.com/15608447849/music_pick

2 可查詢下載下傳歌曲, MV 無損音樂.

GITHUB:https://github.com/15608447849/music_download

百度雲盤: https://pan.baidu.com/s/1o8KawuI

這次嘗試,對于’爬蟲’這個詞有了新的認識,也發現的前端JS的不安全性.

對于python ,越來越覺得 友善簡單快捷.

其實 很多時間,都是在嘗試列印JS中的對象和資料.

最開始我隻是想通過分析 HTML節點拿到資料,之前做過 資料爬蟲 抓取

銀行資料, 擷取是 銀行開發不能聯網,并且很多不能用開源架構,很多做法都是比較簡單,頁面資料靜态化,沒有ajax等.及時有,也能分析出接口 ,拿出資料(不包括重要的資訊,多數沒有加密).

這次嘗試中, 我也一度想研究下AES什麼的加密,但是還是沒這個時間.

記錄下點點滴滴,記錄下一些回憶.畢竟,程式設計= 不進則退.

做一個有夢想的年輕人.