用Python代碼來下載任意指定網易雲歌曲(超詳細版)

僅用於技術交流,不做任何商業用途python

前兩天教了你們如何在控制檯上找到真實的mp3播放地址,可是不能夠下載付費的,由於只能下載可播放的歌曲。至於怎樣下載付費網易雲音樂,仍是開個會員吧,要知道免費是最貴的的這個道理。mysql

有粉絲看了前兩天文章想用代碼來裝逼,我就爲了知足他,特地去折騰了兩天,終於寫出來了,火燒眉毛與你們分享一把。不得不說,這裏面坑很大,遇到幾個大坑在那裏折騰了幾個小時,分享出來讓你們想裝逼的少踩點坑。廢話很少說,開始今天主題!web

1.尋找目標請求sql

打開網易雲主頁 ,打開開發者工具,點擊搜索編程

是否是看到不少請求,不要慌,慢慢找。找了以後你會發現下面這個連接json

這個連接返回的是json,裏面包含的是歌曲的信息,可是沒有MP3播放連接,這個或許有用,由於有歌曲的id,先放着。api

我試着點擊歌曲播放,又增長了幾個請求。一看,裏面就有我想要的MP3連接。瀏覽器

這樣子,獲取mp3請求的連接出來了,music.163.com/weapi/song/…cookie

能夠看到是個post請求,狀態碼爲200,咱們接着往下看fromdata是什麼數據。session

是兩個加密了的參數,不過不怕,若是你看過我以前寫的利用python爬取網易雲音樂,並把數據存入mysql你會發現fromdata參數是同樣的,因此破解加密參數思路是同樣的,不過此次我不用fiddler了,只用開發者工具來調試,看好了!!!咱們看看這個請求的來源是什麼。

點進去看看,是個混淆的js,點左下角能夠格式化,這樣好看點。

進行搜索params,你會發現這個:

能夠看到,加密的方式都沒有改變,仍是和以前同樣,只是變量名字改變了。**window.asrsea()**有四個參數,先看看後面三個參數,由於都很類似。繼續進行搜索定位。

能夠看出,返回的是一個固定的內容,因此不用管了,等下能夠進行調試抓出來。再看看第一個參數。是一個json。咱們能夠進行斷點調試進行獲取。

進行刷新,你會看到下面這些內容。

能夠看到**window.asrsea()**是一個d函數,定位過去看看,而後又給個斷點。

點擊去往下一個斷點,你會看到

四個參數都出來了,我直接貼出來這裏吧:

d:"{"ids":"[523946593]","br":128000,"csrf_token":""}"e:"010001"f:"00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"g:"0CoJUm6Qyw8W8jud"
複製代碼

參數都出來了,很容易就知道d參數裏面的ids對應的就是歌曲id,因此說剛纔找的連接有用了。br是個固定值,對應的多是歌曲的質量之類的,不須要管的。

下面再看看d函數是如何加密的:

裏面又包含了不少 **a , b ,c **的三個函數,先看看 a 函數

這個 a 函數是在一堆字符串中隨機找出16個字符串。ok,下一個。

b 函數採用了 aes 加密, 加密的密文是 e ,也就是參數的 a 內容,c是密鑰,第三個參數中有偏移量 d 和加密模式 **CBC **。再看看 c 函數。

c 函數是採用 rsa 加密,b 爲加密指數, 空字符串爲解密參數,c 爲加密係數。

好了,三個函數分析完畢,再回頭看看 d 函數。

能夠看到params參數是通過兩次 b 函數生成的,也就是用 aes 加密兩次,encSecKey參數是經過 c 函數生成的,也就是經過 rsa 加密方式生成的。

廢話很少說,Talk is cheap, show me the code

2.代碼部分

先把隨機生成16個字符串的展現下

爲了讓你們好看點,代碼之後都用照片代替

接下來是aes加密的

這裏有一個巨坑,谷歌了也沒發現有誰遇到過,就是用python進行aes加密的時候,只能加密數字和字母,不能對中文進行加密,會報錯

Input strings must be a multiple of 16 in length

解決方方法是在cbc加密的模式下,在對字符串補齊爲長度爲16的倍數時,長度指標不能用中文,要先把他轉爲unicode編碼的長度才能夠。好比上面的,下面的就是錯誤示範

pad = 16 - len(text) % 16

此坑爬過去了,接着下一個rsa加密

還有須要注意一下的是,在生成隨機16個字符串的時候,須要保證params和encSecKey兩個參數是對應的這個隨機字符串是一致的。要否則加密以後仍是會出錯,獲取不了正確信息。好了,最後一個是獲取兩個加密參數。

代碼寫完了,那還等什麼,運行一下裝逼啊!

{'code': -460, 'msg': 'Cheating'}

這下好了,裝逼失敗,被網易雲認出來我是爬蟲的,那我試試加下請求頭?結果加了仍是一個樣,這個也算是個巨坑吧。解決方法仍是加請求頭,只須要加兩個,一個是瀏覽器識別 **user-agent **,另外一個是 cookie ,想不到吧?我也想不到,竟然還有在cookie上面作反爬的,可是我用了 **session **來保持cookie仍是不行,須要本身複製瀏覽的cookie就行保存才能夠。

歌曲如今能下載了,可我要的是任意歌曲啊。那好,咱們再去看看這個請求https://music.163.com/weapi/cloudsearch/get/web?csrf_token=,由於返回的是歌曲id。

3.尋找歌曲id

能夠看到,參數仍是和上面的那個請求的參數同樣,可是咱們知道的是那個 d 函數,後三個參數是不變的,因此咱們只須要找前面那個變化的參數就能夠了,仍是一樣的操做,斷點調試

也是很容易就找到的,d 參數就是下面這個

d = '{"hlpretag":"<span class=\"s-fc7\">","hlposttag":"","s":"可可否","type":"1","offset":"0","total":"true","limit":"30","csrf_token":""}'

這個分析就能夠說完畢了。

4.搜索歌曲代碼

這個是獲取歌曲 id 的代碼,其餘的沒什麼問題了。

最後

我還將程序打包了,遇到了喜歡的歌曲均可如下載下來,雖然能夠直接用網易雲下載,不用那麼麻煩,可是咱們學編程的是要幹什麼的?裝逼啊,能用代碼毫不用其餘的東西。

效果圖如上,下載槓桿的,須要完整代碼的能夠後臺回覆音樂便可送給你。

ps:原創不易,寫了這篇文章可謂花費了我1024根頭髮,據說轉發是生髮的最有效之道,因此你懂得!

掃面二維碼關注獲取更多有趣的python文章
相關文章
相關標籤/搜索