前兩天教了大家如何在控制臺上找到真實(shí)的mp3播放地址,但是不可以下載付費(fèi)的,因?yàn)橹荒芟螺d可播放的歌曲。至于怎樣下載付費(fèi)網(wǎng)易云音樂,還是開個(gè)會員吧,要知道免費(fèi)是最貴的的這個(gè)道理。 有粉絲看了前兩天文章想用代碼來裝逼,我就為了滿足他,特意去折騰了兩天,終于寫出來了,迫不及待與大家分享一把。不得不說,這里面坑很大,遇到幾個(gè)大坑在那里折騰了幾個(gè)小時(shí),分享出來讓大家想裝逼的少踩點(diǎn)坑。廢話不多說,開始今天主題! 1.尋找目標(biāo)請求 打開網(wǎng)易云主頁 ,打開開發(fā)者工具,點(diǎn)擊搜索 是不是看到很多請求,不要慌,慢慢找。找了之后你會發(fā)現(xiàn)下面這個(gè)鏈接 這個(gè)鏈接返回的是json,里面包含的是歌曲的信息,但是沒有MP3播放鏈接,這個(gè)或許有用,因?yàn)橛懈枨膇d,先放著。 我試著點(diǎn)擊歌曲播放,又增加了幾個(gè)請求。一看,里面就有我想要的MP3鏈接。 這樣子,獲取mp3請求的鏈接出來了: https://music.163.com/weapi/song/enhance/player/url?csrf_token= 可以看到是個(gè)post請求,狀態(tài)碼為200,我們接著往下看fromdata是什么數(shù)據(jù)。 是兩個(gè)加密了的參數(shù),不過不怕,如果你看過我之前寫的利用python爬取網(wǎng)易云音樂,并把數(shù)據(jù)存入mysql你會發(fā)現(xiàn)fromdata參數(shù)是一樣的,所以破解加密參數(shù)思路是一樣的,不過這次我不用fiddler了,只用開發(fā)者工具來調(diào)試,看好了?。。∥覀兛纯催@個(gè)請求的來源是什么。 點(diǎn)進(jìn)去看看,是個(gè)混淆的js,點(diǎn)左下角可以格式化,這樣好看點(diǎn)。 進(jìn)行搜索params,你會發(fā)現(xiàn)這個(gè): 可以看到,加密的方式都沒有改變,還是和之前一樣,只是變量名字改變了。window.asrsea()有四個(gè)參數(shù),先看看后面三個(gè)參數(shù),因?yàn)槎己芟嗨?。繼續(xù)進(jìn)行搜索定位。 可以看出,返回的是一個(gè)固定的內(nèi)容,所以不用管了,等下可以進(jìn)行調(diào)試抓出來。再看看第一個(gè)參數(shù)。是一個(gè)json。我們可以進(jìn)行斷點(diǎn)調(diào)試進(jìn)行獲取。 進(jìn)行刷新,你會看到下面這些內(nèi)容。 可以看到window.asrsea()是一個(gè)d函數(shù),定位過去看看,然后又給個(gè)斷點(diǎn)。 點(diǎn)擊去往下一個(gè)斷點(diǎn),你會看到 四個(gè)參數(shù)都出來了,我直接貼出來這里吧: d:'{'ids':'[523946593]','br':128000,'csrf_token':''}' 參數(shù)都出來了,很容易就知道d參數(shù)里面的ids對應(yīng)的就是歌曲id,所以說剛才找的鏈接有用了。br是個(gè)固定值,對應(yīng)的可能是歌曲的質(zhì)量之類的,不需要管的。 下面再看看d函數(shù)是如何加密的: 里面又包含了很多 a , b ,c 的三個(gè)函數(shù),先看看 a 函數(shù) 這個(gè) a 函數(shù)是在一堆字符串中隨機(jī)找出16個(gè)字符串。ok,下一個(gè)。 b 函數(shù)采用了 aes 加密, 加密的密文是 e ,也就是參數(shù)的 a 內(nèi)容,c是密鑰,第三個(gè)參數(shù)中有偏移量 d 和加密模式 CBC 。再看看 c 函數(shù)。 c 函數(shù)是采用 rsa 加密,b 為加密指數(shù), 空字符串為解密參數(shù),c 為加密系數(shù)。 好了,三個(gè)函數(shù)分析完畢,再回頭看看 d 函數(shù)。 可以看到params參數(shù)是經(jīng)過兩次 b 函數(shù)生成的,也就是用 aes 加密兩次,encSecKey參數(shù)是通過 c 函數(shù)生成的,也就是通過 rsa 加密方式生成的。 廢話不多說,Talk is cheap, show me the code 2.代碼部分 先把隨機(jī)生成16個(gè)字符串的展示下 為了讓大家好看點(diǎn),代碼以后都用照片代替 接下來是aes加密的 這里有一個(gè)巨坑,谷歌了也沒發(fā)現(xiàn)有誰遇到過,就是用python進(jìn)行aes加密的時(shí)候,只能加密數(shù)字和字母,不能對中文進(jìn)行加密,會報(bào)錯(cuò) Input strings must be a multiple of 16 in length 解決方方法是在cbc加密的模式下,在對字符串補(bǔ)齊為長度為16的倍數(shù)時(shí),長度指標(biāo)不能用中文,要先把他轉(zhuǎn)為unicode編碼的長度才可以。比如上面的,下面的就是錯(cuò)誤示范 pad = 16 - len(text) % 16 此坑爬過去了,接著下一個(gè)rsa加密 還有需要注意一下的是,在生成隨機(jī)16個(gè)字符串的時(shí)候,需要保證params和encSecKey兩個(gè)參數(shù)是對應(yīng)的這個(gè)隨機(jī)字符串是一致的。要不然加密之后還是會出錯(cuò),獲取不了正確信息。好了,最后一個(gè)是獲取兩個(gè)加密參數(shù)。 代碼寫完了,那還等什么,運(yùn)行一下裝逼啊! {'code': -460, 'msg': 'Cheating'} 這下好了,裝逼失敗,被網(wǎng)易云認(rèn)出來我是爬蟲的,那我試試加下請求頭?結(jié)果加了還是一個(gè)樣,這個(gè)也算是個(gè)巨坑吧。解決方法還是加請求頭,只需要加兩個(gè),一個(gè)是瀏覽器識別 user-agent ,另一個(gè)是 cookie ,想不到吧?我也想不到,居然還有在cookie上面做反爬的,但是我用了 session 來保持cookie還是不行,需要自己復(fù)制瀏覽的cookie就行保存才可以。 歌曲現(xiàn)在能下載了,可我要的是任意歌曲啊。那好,我們再去看看這個(gè)請求https://music.163.com/weapi/cloudsearch/get/web?csrf_token=,因?yàn)榉祷氐氖歉枨鷌d。 3.尋找歌曲id 可以看到,參數(shù)還是和上面的那個(gè)請求的參數(shù)一樣,但是我們知道的是那個(gè) d 函數(shù),后三個(gè)參數(shù)是不變的,所以我們只需要找前面那個(gè)變化的參數(shù)就可以了,還是同樣的操作,斷點(diǎn)調(diào)試。 也是很容易就找到的,d 參數(shù)就是下面這個(gè) d = '{'hlpretag':'s-fc7\\'>','hlposttag':'','s':'可能否','type':'1','offset':'0','total':'true','limit':'30','csrf_token':''}' 這個(gè)分析就可以說完畢了。 4.搜索歌曲代碼 這個(gè)是獲取歌曲 id 的代碼,其他的沒什么問題了。 最后 我還將程序打包了,遇到了喜歡的歌曲都可以下載下來,雖然可以直接用網(wǎng)易云下載,不用那么麻煩,但是我們學(xué)編程的是要干什么的?裝逼啊,能用代碼絕不用其他的東西。 |
|