最近有空,在好友的呼喚下,幫助他做一個爬取網易雲音樂排行榜資訊的小程式,收獲頗多.
進入網易雲官網.F12
打開後發現網易雲的API,參數被加密:
對前端不太熟,也無從下手,隻知道這個資訊很重要,多虧了 百度一下 ,找到了很多陳舊的部落格,有了些許蛛絲馬迹.
多數用python去寫,經過一些嘗試,确定了不少可用的api接口,但是資料大多數不是不完整就是不正确,特别是音樂的下載下傳連結,
那就一個網絡上都是複制一個人的東西.
後來我看見一種全新的嘗試方式,通過攔截前端調用的JS,本地調試.(我不會前端,對于我來說還是挺新奇的.)
大概方式如下:
1. 下載下傳 Fiddler.exe ( http代理)
2. 進入網易雲音樂官網 F12 - network - js ,找到core.js ,下載下傳到本地.
3.fidedle - AutoResponder - Add rule
以上三步, 即可完成使用本地JS檔案.
可是,這個檔案是進過混淆的,你讓我格式化排版 一行行看我也是可能.更何況JS不熟.
我就百度呗. 終于找到一點眉目. 一個關鍵詞- windos.asrsea
這個普遍出現在别人的論壇部落格中.我就試着搜~
結果 還真有, 然後我看了看這個d函數,哎嘿,我看不懂 什麼七七八八的東西,很繞~
繼續百度 ,知道了一些有趣的事情:
很多人分析這個函數是用來加密參數的,甚至分析出這個函數的各種語言版本.
我嘗試了下 java的 和c# 的代碼加密參數.~發現出來之後的格式樣子還是有差别的.
是以,我想 為什麼我要自己改寫,為什麼我不能直接調用? -‘js腳本 python調用’
我猜想并尋找, 真的可以 ,順便寫了幾個例子玩兒,大概會用了.
Python - execjs
用它就行.
加密是完成了. 但是 加密什麼東西呢?
我們有它的JS檔案,我試着列印LOG . 我能想到很多地方,我時不想看代碼的,人很笨也比較懶惰.
在 windos.asrsea 被調用的哪一部分, 會傳入 一段 URL的字尾 以及http請求的param.
最後,
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什麼的加密,但是還是沒這個時間.
記錄下點點滴滴,記錄下一些回憶.畢竟,程式設計= 不進則退.
做一個有夢想的年輕人.