寫在前面
一開始現操期中課程設計想要做一個可以共享各大音樂平台的音樂播放器,而這些音樂平台都沒有提供API接口(很正常ヾ(・ε・`*) ),所以研究了一下酷狗音樂、QQ音樂、網易雲音樂的網頁版,通過網頁版來獲取數據;然而最后因為時間的關系課程設計只使用了網易雲音樂,emm。。。期中課程設計是團隊合作完成的,項目鏈接,如果之后有空的話也會寫篇博客簡要介紹一下我們的期中課程設計(~ ̄▽ ̄)~
說回正題,這篇博客首先會分享一下那時候收集到的API,這里有的是大神已經找好的,有一些是自己解析網頁版資源得到的,僅供學習研究(正經臉);然后會介紹一下是怎么解析網頁版的數據的,不過涉及到解密的部分我就不會啦,逃。。。順帶一提,這個還是挺有用的,利用這個方法制作了一個自動簽到的腳本,雖然最后只隨機分到了四個鑰匙扣(為毛分不到抱枕嘞,(ノДT))繼續逃。。。
酷狗音樂
歌曲搜索
方法一:
url:http://songsearch.kugou.com/song_search_v2
必選參數:keyword(關鍵字)
可選參數:page(第幾頁),pagesize(一頁的搜索結果數目)
eg:
http://songsearch.kugou.com/song_search_v2?keyword=%E5%86%8D%E9%A3%9E%E8%A1%8C&page=1&pagesize=30
方法二:
url: http://mobilecdn.kugou.com/api/v3/search/song
必選參數:keyword(關鍵字)
可選參數:page(第幾頁),pagesize(一頁的搜索結果數目)
eg:
http://mobilecdn.kugou.com/api/v3/search/song?keyword=%E5%86%8D%E9%A3%9E%E8%A1%8C&page=1&pagesize=10
獲取音樂下載地址
首先,我們需要上面方法二搜索結果的hash:
獲取MV總共有兩種方法
方法一:
url:http://trackercdn.kugou.com/i/v2/?cmd=25
必選參數:
hash:上面的hash全小寫
key:對上面的hash加鹽值(SALT)kgcloudv2,然后進行md5加密
behavior:download
eg:
http://trackercdn.kugou.com/i/v2/?cmd=25&key=49f701e8b36115d84c13d5d7decf2603&hash=d9887aecacd56ddc63786ea0028015b4&behavior=download
方法二:
url:http://trackercdn.kugou.com/i/v2/?cmd=26
必選參數:
mid:0(可以選其他值)
userid:0(可以選其他值)
appid:1005(必須為1005)
behavior:play
version:0
vipType:0
token:0
hash:上面的hash全小寫
key:對上面的hash加鹽值(SALT)kgcloudv2100500(kgcloudv2后面的值就是 appid+mid+userid),然后進行md5加密
eg:
http://trackercdn.kugou.com/i/v2/?cmd=26&key=6d40e212383d3c45633f8e8f1e332d76&hash=d9887aecacd56ddc63786ea0028015b4&behavior=play&mid=0&appid=1005&userid=0&version=0&vipType=0&token=0
MV搜索
url : http://mvsearch.kugou.com/mv_search
必選參數:keyword(關鍵字)
可選參數:page(第幾頁),pagesize(一頁的搜索結果數目)
eg:
http://mvsearch.kugou.com/mv_search?&keyword=%E5%86%8D%E9%A3%9E%E8%A1%8C&pagesize=30&page=1
獲取MV下載地址
首先,我們需要上面搜索MV返回結果的MvHash
如圖:
獲取MV總共有四種方法:
方法一:
url:http://trackermv.kugou.com/interface/index/cmd=4
必選參數:
hash:上面的MvHash全大寫
key:對上面的MvHash加鹽值(SALT)kgcloud,然后進行md5加密
ext:mp4
eg:
http://trackermv.kugou.com/interface/index/cmd=4&hash=4CFA5311D22BA49BAFCEA9B9E992FBF7&key=83dfaed92e992719954c37a97ccfce94&ext=mp4
方法二:
url:http://trackermv.kugou.com/interface/index/cmd=100
必選參數:
hash:上面的MvHash全大寫
key:對上面的MvHash加鹽值(SALT)kugoumvcloud,然后進行md5加密
ext:mp4
eg:
http://trackermv.kugou.com/interface/index/cmd=100&hash=4CFA5311D22BA49BAFCEA9B9E992FBF7&key=fe3dd52c9760c4d7cd25f28666556bd0&ext=mp4
這個可以返回所有的mv鏈接
方法三:
url:http://trackermv.kugou.com/interface/index/cmd=103
必選參數:
hash:上面的MvHash全大寫
key:對上面的MvHash加鹽值(SALT)kugoumvcloud,然后進行md5加密
ext:mp4
eg:
http://trackermv.kugou.com/interface/index/cmd=103&hash=4CFA5311D22BA49BAFCEA9B9E992FBF7&key=fe3dd52c9760c4d7cd25f28666556bd0&ext=mp4
方法四:
url:http://trackermv.kugou.com/interface/index/cmd=104
必選參數:
hash:上面的MvHash全大寫
ext:mp4
eg:
http://trackermv.kugou.com/interface/index/cmd=104&hash=4CFA5311D22BA49BAFCEA9B9E992FBF7&ext=mp4
QQ音樂
獲取最新音樂
url:
https://c.y.qq.com/v8/fcg-bin/fcg_v8_toplist_cp.fcg?uin=0¬ice=0&platform=h5&needNewCode=1&tpl=3&page=detail&type=top&topid=27
獲取推薦歌曲
url:
https://c.y.qq.com/v8/fcg-bin/fcg_v8_toplist_cp.fcg?notice=0&platform=h5&tpl=3&page=detail&type=top&topid=36
歌曲搜索
url:
https://c.y.qq.com/soso/fcgi-bin/client_search_cp?aggr=1&cr=1&flag_qc=0
必選參數:w(關鍵詞)
可選參數:p(相當於上面的page),(相當於上面的pagesize)
eg:
https://c.y.qq.com/soso/fcgi-bin/client_search_cp?aggr=1&cr=1&flag_qc=0&p=1&n=20&w=%E5%86%8D%E9%A3%9E%E8%A1%8C
獲取歌曲播放鏈接
首先,我們需要上面API提供的songmid
如圖:
url:http://ws.stream.qqmusic.qq.com/songmid.m4a
(這里的songmid替換為上面的songmid)
必選參數:
fromtag:0
guid:一個隨機的9位數
eg:
http://ws.stream.qqmusic.qq.com/C100000Fc2iQ4eBEei.m4a?fromtag=0&guid=126548448
獲取歌詞
獲取歌詞就比較麻煩了,emm,
首先,我們需要先獲取一個vkey:
例如:
https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?format=json205361747&platform=yqq&cid=205361747&songmid=000Fc2iQ4eBEei&filename=C400000Fc2iQ4eBEei.m4a&guid=1684916857
上面鏈接中的songmid需要替換為對應的songmid,filename需要替換為對應的C400 + songmid + .m4a
上面的鏈接會返回一個json字符串文件,其中就有我們要的vkey:
因為QQ音樂還要驗證我們的請求頭信息,所以簡單地在瀏覽器輸入一個url是不能成功的,所以,我們需要使用代碼偽裝我們的請求頭,這里使用python(py大法好)獲取歌詞信息:
def lrc_save(self, path=os.path.join(os.path.abspath('./'), 'song')):
''' 保存歌詞 '''
headers = {
"Referer": "https://y.qq.com/portal/1player.html",
"Cookie": "skey=@LVJPZmJUX;p",
}
url = 'https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_new.fcg?g_tk=753738303&songmid=' + self.song_mid;
lrc_data = requests.get(url, headers=headers)
if lrc_data.status_code != 200:
print('歌詞不存在或網絡錯誤')
return False
lrc_dict = json.loads(lrc_data.text[18:-1])
lrc_data = base64.b64decode(lrc_dict['lyric'])
with open(os.path.join(path, self.save_title + '.lrc'), 'w') as fr:
try:
fr.write(lrc_data)
except TypeError:
fr.write(bytes.decode(lrc_data))
# 若有翻譯歌詞
if lrc_dict.get('trans'):
lrc_data = base64.b64decode(lrc_dict['trans'])
with open(os.path.join(path, self.save_title + '-trans.lrc'), 'w') as fr:
try:
fr.write(lrc_data)
except TypeError:
fr.write(bytes.decode(lrc_data))
print('歌詞下載完成')
print(os.path.join(path, self.save_title + '.lrc'))
return True
網易雲音樂
網易雲音樂的API算是最全的了,感謝@Binaryify大神提供的API:NeteaseCloudMusicApi
解析網頁數據初嘗試
以酷狗音樂為例(因為酷狗音樂的搜索不涉及加密,最簡單(~ ̄▽ ̄)~ );打開瀏覽器開發者工具(DevTools),之后打開Network選項卡,在這里我們可以看到接收到的所有數據;
進行搜索,我們就可以看到Network選項卡中同步更新着接收的數據。
從接收的數據項中我們可以找到含有搜索結果的數據項,此時我們可以查看Header
這里包含了請求的信息,各參數的意思看一下就知道了,可以看到Request URL為:
http://songsearch.kugou.com/song_search_v2?callback=jQuery112409228444210604791_1532860990338&keyword=%E5%86%8D%E9%A3%9E%E8%A1%8C&page=1&pagesize=30&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0
刪除一些可選項,最后的結果就是:
http://songsearch.kugou.com/song_search_v2?keyword=%E5%86%8D%E9%A3%9E%E8%A1%8C&page=1&pagesize=30
這和我們上面酷狗音樂搜索歌曲的API一致
有一些網站還有對請求頭進行驗證,這時候就需要偽造請求頭了,如上面QQ音樂的歌詞獲取
而且大部分網站都是對請求進行加密的,這就需要查看代碼(或解密,這個真的不會)了,在Network選項卡里包含了一些代碼文件,有時候需要看代碼才能知道怎么弄了。
