下面的請求中如果參數有songmid,都是得經過搜索歌曲或歌手後才能獲得songmid,然後進行請求。不能獲取到qq音樂的vip或者付費歌曲的播放地址,Api是通過fiddler4爬取網頁端qq音樂獲取的,如失效,請在評論指出
前言
最近重構了自己的安卓版的音樂播放器,主要是因爲之前使用的音樂相關Api都失效了,索性自己來找Api,於是利用fiddler4爬取網頁端qq音樂獲取到了項目所需要的Api,途中也遇到了許多坑,但是通過自己的努力解決了問題,所以在這裏分享一波!
一、 搜索
1.搜索歌手/歌曲
請求地址:https://c.y.qq.com
請求示例:https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=2&w=泡沫&format=json
說明:關鍵字爲歌手就返回該歌手的歌曲,如果爲歌曲就返回該歌曲列表
參數 | 說明 | 是否必須 | 默認值 |
---|---|---|---|
p | 分頁 | 否 | 默認爲1 |
n | 請求數量 | 否 | 默認爲10 |
w | 關鍵字 | 是 | 無 |
format | 格式化 | 否 | 如果用Retrofit的Json解析的話記得一定要format=json |
2.搜索專輯
請求地址:https://c.y.qq.com
請求示例:https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=2&w=鄧紫棋&format=json&t=8
參數 | 說明 | 是否必須 | 默認值 |
---|---|---|---|
p | 分頁 | 否 | 默認爲1 |
n | 請求數量 | 否 | 默認爲10 |
w | 關鍵字 | 是 | 無 |
format | 格式化 | 否 | 如果用Retrofit的Json解析的話記得一定要format=json |
t | 類別 | 是 | 沒有默認值,如果爲搜索專輯,則t爲8。如果是搜索mv,t=12。 |
二、 獲取圖片
1.根據歌手獲取圖片
請求地址:http://music.163.com
請求示例:http://music.163.com/api/search/get/web?s=鄧紫棋&type=100
說明:請求後將有歌手圖片的字段,請求後的picUrl和img1v1Url就是圖片地址
參數 | 說明 | 是否必須 | 默認值 |
---|---|---|---|
s | 歌手 | 是 | 無 |
type | 類別 | 是 | 無,但必須爲100 |
!!!注意:有可能在網上能夠請求到數據,但在實際代碼中請求時卻不能返回的情況(自己在開發中碰到),這時候彆着急,只需要在網絡請求時加上請求頭**“User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36”**就能解決問題!
2. 根據albumMID獲取專輯圖片
請求地址:http://y.gtimg.cn
請求示例:http://y.gtimg.cn/music/photo_new/T002R180x180M000003c616O2Zlswm.jpg
說明:請求示例其實有兩部分組成,即固定地址+albumMid。
組成 | 值 | 說明 |
---|---|---|
固定地址 | http://y.gtimg.cn/music/photo_new/T002R180x180M000 | 固定值,不需要改變 |
albumMid | 在搜索專輯後,或者搜索歌曲會有albumMid這個字段 | 需要先搜索後得到albumMid |
三、 獲取播放地址
如果用的是Retrofit請求,則需要在請求時加上
encoded = true
的參數,不然請求時會出現-500001的錯誤。代碼示例:@GET(Api.SONG_URL) Observable<SongUrl> getSongUrl(@Query(value = "data",encoded = true) >String data);
請求地址:https://u.y.qq.com
說明:這個是根據歌曲songmid來獲得音樂播放地址的,請求示例很長,在經過多次嘗試後,很遺憾的並不能縮減,要想獲取播放地址,只需要更改上面藍色字體的songmid後的001X0PDf0W4lBq即可,至於更改方法很多,比如直接用Java的字符串拼接。請求成功後請注意兩個字段purl和sip(爲數組),歌曲的播放地址就是sip數組裏的其中一個加上pur,即sip[0]+purl(vip音樂或者版權音樂的purl爲空)。
1. 請求時的參數說明
參數 | 說明 |
---|---|
songmid | 歌曲的songmid怎麼得到,必須通過上面搜索歌曲後得到,然後更改上面示例的001X0PDf0W4lBq(泡沫的songmid)即可,示例的其它地方都不能做更改,也不能刪減 |
2.請求後重要字段解釋
播放地址:sip[0]+purl
字段 | 說明 | 示例 |
---|---|---|
sip | 播放接口地址,目前來說有兩個地址,但是很有可能會改變 | “sip”: [ “http://ws.stream.qqmusic.qq.com/”, “http://isure.stream.qqmusic.qq.com/” ] |
purl | 裏面最重要的就是vkey的值,這個值每次請求都不一樣 | C400000HjG8v1DTWRO.m4a?guid=358840384& vkey=852D30CD2DEA9E0AFF9CF700977FAFB413A06486CFE8F7250 2918665277C5407D8D5AD42039F02329401300003A2853B10816B83C3145159 &uin=0&fromtag=66 |
四、 獲取歌詞
請求地址:https://c.y.qq.com
說明:如果你點擊了上面的鏈接的話,你會發現返回的是-1310的錯誤碼,這時候請彆着急,並不是這個請求Api是無效的,只是因爲這個獲取歌詞的Api有點特殊,在請求時需要在請求的header上加上Referer地址就可以了
參數 | 說明 |
---|---|
songmid | 歌曲songmid,需要在搜索歌曲後獲取 |
format | 格式,建議加上format=json |
nobase64 | 敲重點!!!,一定要等於1,默認是0,如果沒加上的話,返回的歌詞將會是亂碼,加上後就可以得到歌曲的動態歌詞,即帶有時間的歌詞 |
!!!敲重點:記得在請求頭上加上Referer:https://y.qq.com/portal/player.html,不然請求會返回-1310
加Header(安卓)
1. OkHttp
Request request = new Request.Builder()
.url(baseUrl)
.addHeader("Referer","https://y.qq.com/portal/player.html")
.build();
2. Retrofit
直接在@GET上面加上Headers註解
@Headers(Referer:https://y.qq.com/portal/player.html)
另外對音樂播放器自定義View歌詞實現有興趣的話可以看看這篇博客
Android自定義View-簡約風歌詞控件