蝦米音樂網站上有很多高品質的音樂和精心組織的精選集,但普通用戶只能試聽,不能下載,下載的話需要使用“米”,這個“米”除了極少數的新手任務可以獲得之外,基本上都要靠付費來購買,很多人沒有網銀或者沒有銀行卡,支付相當不方便。對於普通用戶,既想把音樂放到手機或者mp3里欣賞,又不願反復折騰的話,如何找到下載鏈接把歌曲下載下來呢?讓我們來研究一下蝦米音樂網站的代碼邏輯。
如下圖:打開一個精選集:
我們來看一下這個網頁的源碼,找到第一首歌曲Iris and Jasper –Hans Zimmer部分的html代碼,搜索Iris andJasper即可:
懂html的可以看看,其實也不需要理解,這段代碼大體上看來點擊試聽的時候,調用了一個js函數play,參數有三個,很明顯第一個是歌曲id,后面兩個不知道是做什么用,但這沒有什么影響,我們來繼續看看play函數的代碼:
這段js代碼非常簡單,懂點程序的人都能看出來,最后的結果就是:/song/playlist/id/+第一個參數+/object_name/+第二個參數+/object_id/+第三個參數,第一個參數是百分百有的,第二個如果不存在,則為default,第三個如果不存在,則為0。因為沒有特殊字符,所以那個escape函數的作用可以忽略。然后前面再拼上蝦米的網址http://www.xiami.com就得到一個url鏈接:http://www.xiami.com/song/playlist/id/2562206/object_name/collect/object_id/11060023,這么簡單?這就是歌曲鏈接?No,顯然沒那么容易,我們把這個地址復制到瀏覽器訪問一下看看返回什么內容:
<?xml version="1.0" encoding="utf-8"?> <playlist version="1" xmlns="http://xspf.org/ns/0/"> <trackList> <track> <title><![CDATA[Iris and Jasper]]></title> <song_id>2562206</song_id> <album_id>217126</album_id> <album_name><![CDATA[The Holiday (Original Motion Picture Soundtrack)]]></album_name> <object_id>11060023</object_id> <object_name>collect</object_name> <insert_type>1</insert_type> <background>#eeeeee</background> <grade>-1</grade> <artist><![CDATA[Hans Zimmer]]></artist> <location>8h2xt622265tFi%%6%5_Et%a22%2643p2mFF252%5%Fi32F225.3f.51%%%EmA1n575552p%.e41EEE%3</location> <ms>http://f1.xiami.net</ms> <lyric>http://www.xiami.com/song/lyrictxt/id/2562206</lyric> <pic>http://img.xiami.com/images/album/img46/35546/2171261295514339_1.jpg</pic> </track> </trackList> <type>collect</type> <type_id>11060023</type_id> <clearlist></clearlist> </playlist>
是一段xml,看起來這才是歌曲的真正信息,剛才的url就是用歌曲id等來請求歌曲信息的方法,從xml里可以看到歌曲信息和播放背景歌詞地址專輯圖片等內容。那么歌曲的下載地址到底在哪里呢?xml里並沒有歌曲的url。仔細看xml,有個location看着很可疑,看起來是一段加密過的內容,怎么解密呢?這段解密代碼在js里是找不到。
但是找不到如何破解呢?不用擔心,網上已經有相應的破解方法,地址:http://www.winhex32.com/xiami/
把location里的那段加密后的字符串復制到輸入框里,輸入驗證碼,點擊嘗試解碼,ok,看到了嗎?完整的mp3下載鏈接就出來了,直接復制到瀏覽器或者迅雷里下載吧~~
上了的不算分析的分析就講完了,我們再來回顧一下該過程:
1.打開一個歌曲的頁面,查看源文件
2.ctrl+f打開搜索框,輸入“play(”,不包括引號,就可以找到每一首歌曲的play函數,記下函數的幾個參數。
3.根據上面提到的規則,http://www.xiami.com/song/playlist/id/+第一個參數+/object_name/+第二個參數+/object_id/+第三個參數,得到歌曲信息的獲取路徑,比如http://www.xiami.com/song/playlist/id/2562206/object_name/collect/object_id/11060023,用瀏覽器打開這個路徑,得到一段xml文本內容。
4.把xml里的location段里的加密內容復制,打開www.winhex32.com/xiami,粘貼進去,輸入驗證碼解密,就可以得到mp3文件的下載路徑了。
對於這個Location內部的解密算法,如果大家有興趣,以后再繼續發帖分析。
本博文僅供技術交流,請勿用於商業目的,否則后果自負。如果有興趣的話歡迎跟帖討論。