赞
踩
最近闲来无事,就想写点东西,刚看到分享到微信朋友圈的音乐,就想自己也写个试试做一个同样的效果。我们都知道音乐平台在点击分享的时候,都有一个复制链接的按钮,我们根据分享的链接,获取歌曲信息(歌曲链接、封面、歌手等等),以下收费歌曲都不行哈;
注:纯属练练手,大家切勿用到商业用途。
目录
先来说说网易云,我感觉是最简单的,都不需要爬取什么,直接按照规律拼接。
例:
分享链接:分享林忆莲的单曲《伤痕》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;
分享链接:刘瑞琦《房间》 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天之后需要重新获取,其他平台暂时没发现异常)
总的来说,希望可以帮到大家。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。