很多人都遇到過這樣的情況:
網易雲音樂會檢查你的IP位址,如果在國外,有很多歌曲(顯示為灰色)是不能播放的。這讓我們不太高興。
既然是IP的問題,那麼最簡單的方法就是找個國內的VPN。如果你覺得這樣並不方便(可能同時需要上國外網站),或者不想買個穩定的VPN,問題就變得很麻煩。
我們可以試用少數免費的VPN,或者國內的HTTP代理,但是它們不穩定、有時間限制,最要命的是速度不夠。假設我們希望在線聽320kbps的MP3音樂,那麼至少要有40KB/s的速度,這樣良心的免費VPN/代理不多見。
因此,有了這篇文章。
首先,來研究一下這個禁止播放是如何實現的。用Fiddler觀察網易雲音樂Windows客戶端的流量,可以看出以下的過程:
第一條對應打開播放列表,返回JSON格式的內容。因為此時軟體裡歌名已經變灰,說明是JSON的播放列表當中有相應標記。馬上從國內的IP再試一次,對比兩邊的JSON,發現區別只有三項:
國外IP:st=-100, pl=0, dl=0
國內IP:st=0, pl=320000, dl=320000
顯然是狀態碼以及播放和下載MP3的最高比特率。好消息在於其他內容全都在,這給了我們很大的希望。
第二條是選中一首歌之後,請求播放地址。這是一個HTTP POST請求,Request body和Response body都是固定大小的二進位數據,盯著看了一會兒沒什麼思路。播放器可能是用C++寫的,想通過反編譯看懂恐怕也困難。
第三條就是一個音樂文件的本體了。直接在瀏覽器裡輸入這個地址,無論哪裡的IP都可以無壓力下載。
針對第一條,我想可以寫一個很小的HTTP代理伺服器,如果看到了相應的響應數據,就把其中那三個數值改成正常的內容。果然,此時任意打開一個播放列表,所有曲名已經變黑,不再提示所在地區無法播放。
講道理,大概為了能正常顯示這些被禁的歌曲,伺服器返回的列表當中肯定要包含大部分重要的歌曲信息。如果網易雲音樂上當了,它就會跳轉到第三條那樣的下載地址。下載地址不過濾IP,代理伺服器直接放過這些流量。事實上以前網上流傳的方法也是這個原理。
但是我們大部分人用網易雲音樂是聽歌的,光看個播放列表好像不太過癮。現在問題來了。隨便點一首歌,客戶端發出第二條請求,收到一個看不懂的響應--然後提示「播放失敗」。
這種情況之下突然變得無計可施。即使這條信息通過明文傳輸,合理的猜想也是對於國外IP,伺服器不會返回任何下載地址(和播放列表的情況不同),而對IP的驗證並不在本地……
回憶一下我們開始遇到了什麼問題?目前可用的VPN/代理不夠快,所以不能用它們聽歌。
如果我們確實不用它們聽歌,只是讓它們幫播放器找一下下載地址呢?
結合前面的分析,可以想像出這樣的一個代理程序:
為了讓用戶更開心,還應該能夠自動挑選一個合適的HTTP代理,因為它們經常會無緣無故地消失。所以我先從一個著名的網站下載最新的代理列表,然後對它們驗證、測速(這種情況下只需要關心延遲),並且允許用戶在某個代理出錯時選擇其他選項。
我寫了這樣一個程序,它可以在Win8或Win10運行,在這裡下載:https://github.com/tiancaihb/NeteaseReverseLadder/raw/master/windows-latest.zip
運行壓縮包裡的EXE文件,十幾秒後顯示這樣的信息:
這時打開網易雲音樂,
【這個步驟只需要做一次】點右上角的設置(小齒輪),如圖填寫:
按照提示重新啟動客戶端,
接下來就可以聽你喜歡的音樂了!
--
如果提示播放失敗,或者還提示海外不給聽?
在那個黑框框裡按一下回車鍵,會顯示切換到下一個代理伺服器,回去再試一下。這是因為有時一些國內的IP也會被當作國外的。
肚子君(微信號:stomakun)
真羨慕你們那些會排版的人
本文版權沒有,說是你自己寫的也可以
關注肚子君,萬一哪天又有好玩的東西了呢?