1. 程式人生 > >一個線上音樂軟體的故事(三、音樂從哪裡來?)

一個線上音樂軟體的故事(三、音樂從哪裡來?)

音樂從哪裡來?

現在網際網路提供開放音樂API介面的平臺還是比較多的,比如:百度音樂API介面、騰訊音樂API介面、蝦米音樂API介面甚至中國移動都曾經有過音樂API介面,有興趣可以度娘一下,還有很多知名不知名的網際網路平臺都提供音樂API的介面。

經過音樂數量、音樂品質、使用者數量、開發複雜度等方面的比較,最終選擇了騰訊QQ音樂作為音樂源。但是騰訊的API是在移動裝置上對QQ音樂軟體的呼叫,對於我等開發桌面應用來說,依然沒有什麼用處,無奈之下只能直接分析QQ線上音樂的有關介面。

經過天(分)人(析)交(請)戰(求),得出以下幾個基本介面及其使用方法:

一、音樂資訊搜尋

主要是獲取音樂的基本資訊,如:歌曲名稱、media_mid

媒體ID(後面需要用到)、歌手資訊、專輯資訊、封面資訊、歌詞資訊等等,具體方法與過程如下:

音樂資訊的搜尋地址:

https://c.y.qq.com/soso/fcgi-bin/client_search_cp?t=0&aggr=1&cr=1&lossless=0&flag_qc=0&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0&p={0}&n={1}&w={2}

上面的請求地址中有三個引數:

{0}表示頁碼。

{1}表示每頁顯示的記錄數量。

{2}表示要搜尋的關鍵字,多個關鍵字可以用空格分開。

這個請求發出之後,伺服器會響應一個包含搜尋結果的JSON字串,在這個字串中包含了音樂的所有資訊,格式和資訊的含義這裡暫不逐一說明,只說我們需要用到的部分,基本資訊如下:

Albumid:專輯ID編號。

Albummid:專輯MID編號,在獲取專輯封面圖片等資訊時,都需要用這個引數。

Albumname:專輯名稱。

Songid:音樂ID編號。

Songmid:音樂MID編號,在獲取播放KEY和音樂資料時,需要用到這個引數。

Songname:音樂名稱。

Interval:音樂時間長度,單位是秒。

Pubtime:音樂釋出時間。

Songurl:音樂介紹頁面的地址,指向音樂資訊的Web頁面。

Nt:不是非常清楚這個引數的含義和作用,我是用來作為獲取音樂資訊的GUID

Singer:歌手或表演者資訊,是個陣列,包含了歌手的姓名、MID等資訊。

二、獲取音樂播放KEY資訊

從騰訊搜尋到的所有音樂資訊中並沒有包含音樂的直接播放地址,真正的音樂地址需要通過獲取播放KEY之後才能組織出來,繼續分析獲取播放KEY的請求:

https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&cid=205361747&callback=MusicJsonCallback&uin=0&songmid={0}&filename=C400{0}.{1}&guid={2}

上面這個請求地址有四個引數,其中兩個引數相同,具體含義是:

{0}上一步獲得的音樂MID

{1}音樂的副檔名,預設是m4a

{2}GUID,一個隨機數,但是要保留,在下一步中還要使用,這個軟體中是使用上一步獲取的Nt引數作為GUID

這個請求也是返回一個JSON字串。但這個字串會包含MusicJsonCallback()函式的回撥,解析之前要先刪除這部分回撥文字。

這個JSON物件的主要引數說明如下:

Code:響應碼,成功響應0,其他為錯誤,同時會包含錯誤資訊

Filename:檔名

Songmid:音樂MID,和上面請求引數中的MID相同

Vkey:播放碼,這是這次請求獲得的最重要的引數,它用於組織音樂源地址

三、組織音樂源地址

有了上面取得的FilenameVKEY資訊之後,再結合上一步的GUID,就能組織出一個音樂源的請求地址,基本格式如下:

http://dl.stream.qqmusic.qq.com/{0}?vkey={1}&guid={2}&fromtag=66

音樂地址是固定的,裡面有三個引數,具體含義是:

{0}檔名,在上一步請求中獲得

{1}VKEY,播放KEY資訊,在上一步請求中獲得

{2}GUID,必須與上一步傳送給伺服器的請求GUID相同

該請求直接返回可以播放的音訊資料,可以在支援HTML5的瀏覽器中直接播放。此地址也作為音樂下載地址使用。

四、獲取專輯封面圖片

有了音樂源之後,音樂是可以播放了,但還要顯示專輯封面圖片,才能與主流播放器一樣,組織出完整的播放介面。騰訊音樂有專門的專輯封面圖片伺服器,可以通過下面的請求獲得封面圖片資料:

https://y.gtimg.cn/music/photo_new/T002R{0}x{0}M000{1}.jpg?max_age=2592000

這個請求包含兩個引數:

{0}圖片的尺寸,騰訊提供的專輯封面圖片都是正方形,而且尺寸固定為三種:90x90180x180300x300

{1}專輯MID,在第一步中已經獲得該資訊

這個請求直接返回圖片資料,可以直接在瀏覽器中顯示。