最近閒來無事,就想寫點東西,剛看到分享到微信朋友圈的音樂,就想自己也寫個試試做一個同樣的效果。我們都知道音樂平臺在點擊分享的時候,都有一個複製鏈接的按鈕,我們根據分享的鏈接,獲取歌曲信息(歌曲鏈接、封面、歌手等等),以下收費歌曲都不行哈;
注:純屬練練手,大家切勿用到商業用途。
目錄
一、網易雲音樂
先來說說網易雲,我感覺是最簡單的,都不需要爬取什麼,直接按照規律拼接。
例:
分享鏈接:分享林憶蓮的單曲《傷痕》http://music.163.com/song/5255650/?userid=1347333548 (@網易雲音樂)
很明顯,ID是5255650
那麼,這首歌的真實地址就是:
http://music.163.com/song/media/outer/url?id=5255650.mp3
這個地址不會失效的;
這就得到一個下載公式:
http://music.163.com/song/media/outer/url?id=ID數字.mp3
把上面紅色部分ID數字換成網易雲播放頁面或者分享鏈接上的id即可。
二、酷我音樂
分享鏈接:https://m.kuwo.cn/yinyue/15519229?f=ip&t=usercopy
歌曲id爲:15519229
根據酷我音樂的鏈接分析得出以下兩個請求可以獲取到我們想要的信息。
//獲取歌曲播放地址(其中{$id}爲分享的歌曲id,getMillisecond()獲取13爲時間戳)
$url = "http://www.kuwo.cn/url?format=mp3&rid={$id}&response=url&type=convert_url3&br=128kmp3&from=web&t=".getMillisecond()."&reqId=88deb4f1-0692-11ea-94a9-91c1807c7d33";
$headers[] = "Host: www.kuwo.cn";
$headers[] = "Referer: http://www.kuwo.cn";
$headers[] = "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36";
$headers[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
$headers[] = "Accept-Language: zh-CN,zh;q=0.9";
$headers[] = "Connection: keep-alive";
$songData = $this->httpGet($url,$headers);
$songData = json_decode($songData,true);
//歌曲地址
$result['song_url'] = $songData['url'];
//獲取歌曲信息
$headers[] = "csrf: HANM3CCFCN7";
$headers[] = "Cookie: Hm_lvt_cdb524f42f0ce19b169a8071123a4797=".time()."; kw_token=HANM3CCFCN7; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=".(time()+172800);
$songData = $this->httpGet("http://www.kuwo.cn/api/www/music/musicInfo?mid={$id}&reqId=19eaaa30-0693-11ea-966f-a32e1ddf0f36",$headers);
$songData = json_decode($songData,true);
//歌曲名稱
$result['song_name'] = $songData['data']['name'];
//封面圖
$result['song_cover'] = $songData['data']['pic'];
//歌手名
$result['artist_name'] = $songData['data']['artist'];
return $result;
三、咪咕音樂
分享鏈接:分享單曲 | 情深誼長http://c.migu.cn/003sST?ifrom=1d0582bb0148c334cfc5bdea0805ddd4 (@咪咕音樂)
其中有效信息id爲:003sST
咪咕分享的鏈接其實並不是真實的播放頁面鏈接,訪問的時候會跳轉。所以我們首先要拿到真實的頁面地址。然後拿到相關信息
$url = "http://c.migu.cn/".$id;
$headers[] = "Host: c.migu.cn";
$headers[] = "ua: Android_migu";
$headers[] = "subchannel: 014000D";
$headers[] = "channel: 014000D";
$headers[] = "IMEI: h5page";
$headers[] = "IMSI: h5page";
$headers[] = "ogId: h5page[ac6c]";
$headers[] = "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0";
$headers[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
$headers[] = "Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2";
$headers[] = "Connection: keep-alive";
//獲取真實地址
$realUrl = $this->getRealURL($url);
//獲取實際id
preg_match('/[^user]id=(\d+)/',$realUrl,$realIdArr);
$realId = $realIdArr[1];
$songData = $this->httpGet("https://c.musicapp.migu.cn/MIGUM2.0/v1.0/content/resourceinfo.do?resourceId={$realId}&resourceType={$resourceType}",$headers);
$songData = json_decode($songData,true);
$coverArr = array();
if (isset($songData['resource'][0]['albumImgs'])) {
$coverArr = array_column($songData['resource'][0]['albumImgs'],null,'imgSizeType');
}
//歌曲名稱
$result['song_name'] = $songData['resource'][0]['songName'];
//封面圖
$result['song_cover'] = $coverArr['02']['img'];
//歌手名
$result['artist_name'] = $songData['resource'][0]['singer'];
//歌曲地址
$result['song_url'] = str_replace("ftp://218.200.160.122:21","http://freetyst.nf.migu.cn",$songData['resource'][0]['rateFormats'][1]['url']);
return $result;
四、qq音樂
分享鏈接:劉瑞琦《房間》 https://c.y.qq.com/base/fcgi-bin/u?__=KbNdw1S @QQ音樂
根據鏈接訪問 https://c.y.qq.com/base/fcgi-bin/u?__=KbNdw1S ,並查看源代碼,我們發現很多信息其實已經存在。只要匹配出來即可。得到歌曲名稱、歌手名 、 songmid ,然後跟songmid 獲取歌曲鏈接
//url爲分享鏈接跳轉之後的url,所以需要獲取302跳轉之後的真實地址,後面會給獲取方法。
$content = @file_get_contents($url);
preg_match("/\"songmid\":\"(.*)\"/U",$content,$songMidArr);
preg_match("/\"songname\":\"(.*)\"/U",$content,$songNameArr);
preg_match("/\"singername\":\"(.*)\"/U",$content,$singerNameArr);
preg_match("/\"albummid\":\"(.*)\"/U",$content,$albumMidArr);
$songName = $songNameArr[1];
$singerName = $singerNameArr[1];
//獲取歌曲地址
$headers[] = "Host: u.y.qq.com";
$headers[] = "Origin: https://y.qq.com";
$headers[] = "accept: application/json, text/plain, */*";
$headers[] = "Accept-Language: zh-CN,zh;q=0.9";
$headers[] = "Upgrade-Insecure-Requests: 1";
$headers[] = "user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36";
$songData = $this->httpGet('https://u.y.qq.com/cgi-bin/musicu.fcg?-=getplaysongvkey26506224079476026&g_tk=275700055&loginUin=492653269&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0&data={"req":{"module":"CDN.SrfCdnDispatchServer","method":"GetCdnDispatch","param":{"guid":"111893668","calltype":0,"userip":""}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"111893668","songmid":["'.$songMidArr[1].'"],"songtype":[0],"uin":"800180106","loginflag":1,"platform":"20"}},"comm":{"uin":800180106,"format":"json","ct":24,"cv":0}}',$headers);
$songData = json_decode($songData,true);
//歌曲名稱
$result['song_name'] = $songName;
//封面圖
$result['song_cover'] = "http://y.gtimg.cn/music/photo_new/T002R300x300M000{$albumMidArr[1]}.jpg";
//歌手名
$result['artist_name'] = $singerName;
//歌曲地址
$result['song_url'] = "http://220.194.231.146/amobile.music.tc.qq.com/".$songData['req_0']['data']['midurlinfo'][0]['purl'];
return $result;
五、輔助方法
//模擬請求-get
public function httpGet($url,$headers)
{
$curl = curl_init(); // 啓動一個CURL會話
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳過證書檢查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); //從證書中檢查SSL加密算法是否存在
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$tmpInfo = curl_exec($curl);
//關閉URL請求
curl_close($curl);
return $tmpInfo;
}
//獲取重定向地址
public function getRealURL($url)
{
$header = get_headers($url,1);
if (strpos($header[0],'301') || strpos($header[0],'302')) {
if(is_array($header['Location'])) {
return $header['Location'][count($header['Location'])-1];
}else{
return $header['Location'];
}
}else {
return $url;
}
}
六、小結
其實還有蝦米音樂和酷狗等平臺
蝦米:需要登陸和輸入驗證碼才行,比較複雜,小編也沒有過度研究,本來淘寶開放平臺以前有免費蝦米api,直接sdk對接就行,但是現在關閉了。
酷狗:酷狗拿到了播放鏈接,但是我沒有寫出來,是因爲酷狗鏈接過期很快,而且酷狗會根據請求次數和ip做了防盜鏈,比較噁心,哈哈。(對了在這裏要提下qq音樂鏈接也會過期,過期時間是1天,1天之後需要重新獲取,其他平臺暫時沒發現異常)
總的來說,希望可以幫到大家。