博客音乐调用网易云歌曲新版
设置全民歌单,通过调用网易云 API,直接播放歌单歌曲。
编辑文件 header.php
<!--head引入js文件-->
<!--删除referer头-->
<meta name="referrer" content="no-referrer">
<!--首页23行-->
<script src="//apps.bdimg.com/libs/jquery/2.1.4/jquery.js" type="text/javascript"></script>
<script src="http://www.gongjuji.net/Content/files/jquery.md5.js" type="text/javascript"></script>
//首页85行
var musicSrc ="
<?php
function sig($id, $random, $time){
return md5('$sdk=XXX&$id='.$id.'&$random='.$random.'&$time='.$time);
}
function curl($url, $id, $method = 'playlist') {
$data['id'] = $id;
$data['method'] = $method;
$data['random'] = rand(100000,999999);
$data['time'] = time();
$data['sig'] = sig($data['id'],$data['random'],$data['time']);
$curl=curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
$data=curl_exec($curl);
curl_close($curl);
return json_decode($data);
}
function playlist($id){
$url = "https://localhost/music.php";
$data = curl($url, $id);
$lists = array();
foreach($data as $k => $v){
$lists[] = $v->id;
}
return implode(',', $lists);
}
$id = $this->options->socialmusic;
print_r(playlist($id));
?>";
var musicIco = document.getElementById("musicico");
var musicArr = musicSrc.split(",")
var musicBtn = document.getElementById("musicBtn");
//请求接口获取数据
function getMusic(id, method) {
$.ajax({
type: "POST",
url: "https://localhost/music.php",
contentType: "application/json; charset=utf-8",
data: JSON.stringify(getJsonData(id, method)),
dataType: "json",
success: function (message) {
switch (method){
case 'playlist':
musicData = message;
break;
case 'url':
musicUrlData = message;
musicObj.src = message.url;
musicObj.loop = false;
musicObj.style.display = "none";
musicObj.play();
break;
}
}
})
}
//计算签名
function getJsonData(id, method) {
var num = randomNum(10000, 99999)
var time = Math.round(new Date().getTime() / 1000)
var sigText = '$sdk=XXX&$id=' + id + '&$random=' + num + '&$time=' + time
var sig = $.md5(sigText)
var json = {
"id" : id,
"random" : num,
"time" : time,
"sig" : sig,
"method" : method
}
return json
}
//随机数字
function randomNum(lowerValue, upperValue) {
var choices = upperValue - lowerValue + 1;
var num = Math.floor(Math.random() * choices + lowerValue);
return num;
}
function IsPC() {
var userAgentInfo = navigator.userAgent;
var Agents = ["Android", "iPhone","SymbianOS", "Windows Phone","iPad", "iPod"];
var flag = true;
for (var v = 0; v < Agents.length; v++) {
if (userAgentInfo.indexOf(Agents[v]) > 0) {
flag = false;
break;
}
}
return flag;
}
var i = 0;
function playMusic(force){
// 双击切换下一首
if(i != 0){
musicInd += 1;
if(musicInd > musicArr.length - 1) {
musicInd = 0;
}
getMusic(musicArr[musicInd], 'url');
return;
}
i++;
setTimeout(function(){
i = 0
},200)
if(musicObj.paused){
musicObj.play();
}else{
musicObj.pause();
}
}
if(!window["musicObj"]){
var musicObj = document.createElement("audio");
var musicInd = Math.round(Math.random()*(musicArr.length-1));
musicObj.addEventListener('ended', function () {
musicIco.style.animation = "";
musicInd += 1;
if(musicInd > musicArr.length - 1) {
musicInd = 0;
}
getMusic(musicArr[musicInd], 'url');
}, false);
musicObj.addEventListener('play', function() {
musicIco.style.animation = "musicplay 5s linear infinite";
}, false);
musicObj.addEventListener('pause', function() {
musicIco.style.animation = "";
}, false);
musicObj.addEventListener('error', function() {
musicInd += 1;
if(musicInd > musicArr.length - 1) {
musicInd = 0;
}
getMusic(musicArr[musicInd], 'url');
}, false)
getMusic(musicArr[musicInd], 'url');
} else {
// 修正样式
if(!musicObj.paused){
musicIco.style.animation = "musicplay 5s linear infinite"
}else{
musicIco.style.animation = ""
}
}
if(IsPC()){
musicBtn.addEventListener("click",function(){
playMusic(false)
})
}else{
musicBtn.addEventListener("touchstart",function(){
playMusic(false)
})
}
Music.php
<?php
//感谢https://i-meto.com提供
class Meting
{
protected $_SITE;
protected $_TEMP;
protected $_RETRY = 3;
protected $_FORMAT = false;
public function __construct($v = 'netease')
{
$this->site($v);
}
public function site($v)
{
$suppose = array('netease', 'tencent', 'xiami', 'kugou', 'baidu');
$this->_SITE = in_array($v,$suppose) ? $v : 'netease';
return $this;
}
public function cookie($v = '')
{
if (!empty($v)) {
$this->_TEMP['cookie'] = $v;
}
return $this;
}
public function format($v = true)
{
$this->_FORMAT = $v;
return $this;
}
private function curl($API)
{
if (isset($API['encode'])) {
$API=call_user_func_array(array($this,$API['encode']), array($API));
}
$BASE = $this->curlset();
$curl = curl_init();
if ($API['method'] == 'POST') {
if (is_array($API['body'])) {
$API['body'] = http_build_query($API['body']);
}
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $API['body']);
} elseif ($API['method'] == 'GET') {
if (isset($API['body'])) {
$API['url'] = $API['url'].'?'.http_build_query($API['body']);
}
}
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_TIMEOUT, 20);
curl_setopt($curl, CURLOPT_ENCODING, 'gzip');
curl_setopt($curl, CURLOPT_IPRESOLVE, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($curl, CURLOPT_URL, $API['url']);
curl_setopt($curl, CURLOPT_COOKIE, isset($this->_TEMP['cookie'])?$this->_TEMP['cookie']:$BASE['cookie']);
curl_setopt($curl, CURLOPT_HTTPHEADER, [
'Accept: */*',
'Accept-Encoding: gzip, deflate',
'Accept-Language: zh-CN,zh;q=0.8,gl;q=0.6,zh-TW;q=0.4',
'Connection: keep-alive',
'Content-Type: application/x-www-form-urlencoded',
'Referer: ' . $BASE['referer'],
'User-Agent: ' . $BASE['useragent']
]);
for ($i=0;$i<=$this->_RETRY;$i++) {
$data = curl_exec($curl);
$info = curl_getinfo($curl);
$error = curl_errno($curl);
$status = $error ? curl_error($curl) : '';
if (!$error) {
break;
}
}
curl_close($curl);
if ($error) {
return json_encode(
array(
'error' => $error,
'info' => $info,
'status' => $status,
)
);
}
if ($this->_FORMAT && isset($API['decode'])) {
$data = call_user_func_array(array($this,$API['decode']), array($data));
}
if ($this->_FORMAT && isset($API['format'])) {
$data = json_decode($data, 1);
$data = $this->clean($data, $API['format']);
$data = json_encode($data);
}
return $data;
}
private function pickup($array, $rule)
{
$t = explode('#', $rule);
foreach ($t as $vo) {
if (!isset($array[$vo])){
return array();
}
$array = $array[$vo];
}
return $array;
}
private function clean($raw, $rule)
{
if (!empty($rule)) {
$raw = $this->pickup($raw, $rule);
}
if (!isset($raw[0]) && sizeof($raw)) {
$raw = array($raw);
}
$result = array_map(array($this,'format_'.$this->_SITE), $raw);
return $result;
}
public function search($keyword, $option = null)
{
switch ($this->_SITE) {
case 'netease':
$API = array(
'method' => 'POST',
'url' => 'http://music.163.com/api/linux/forward',
'body' => array(
'method' => 'POST',
'params' => array(
's' => $keyword,
'type' => isset($option['type']) ? $option['type'] : 1,
'limit' => isset($option['limit']) ? $option['limit'] : 30,
'total' => 'true',
'offset' => isset($option['page']) && isset($option['limit']) ? ($option['page'] - 1) * $option['limit'] : 0,
),
'url' => 'http://music.163.com/api/cloudsearch/pc',
),
'encode' => 'netease_AESECB',
'format' => 'result#songs',
);
break;
case 'tencent':
$API = array(
'method' => 'GET',
'url' => 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp',
'body' => array(
'format' => 'json',
'p' => isset($option['page']) ? $option['page'] : 1,
'n' => isset($option['limit']) ? $option['limit'] : 30,
'w' => $keyword,
'aggr' => 1,
'lossless' => 1,
'cr' => 1,
'new_json' => 1,
),
'format' => 'data#song#list',
);
break;
case 'xiami':
$API = array(
'method' => 'GET',
'url' => 'http://api.xiami.com/web',
'body' => array(
'v' => '2.0',
'app_key' => '1',
'key' => $keyword,
'page' => isset($option['page']) ? $option['page'] : 1,
'limit' => isset($option['limit']) ? $option['limit'] : 30,
'r' => 'search/songs',
),
'format' => 'data#songs',
);
break;
case 'kugou':
$API = array(
'method' => 'GET',
'url' => 'http://ioscdn.kugou.com/api/v3/search/song',
'body' => array(
'iscorrect' => 1,
'pagesize' => isset($option['limit']) ? $option['limit'] : 30,
'plat' => 2,
'tag' => 1,
'sver' => 5,
'showtype' => 10,
'page' => isset($option['page']) ? $option['page'] : 1,
'keyword' => $keyword,
'version' => 8550
),
'format' => 'data#info',
);
break;
case 'baidu':
$API = array(
'method' => 'GET',
'url' => 'https://musicapi.qianqian.com/v1/restserver/ting',
'body' => array(
'method' => 'baidu.ting.search.merge',
'isNew' => 1,
'query' => $keyword,
'page_size' => isset($option['limit']) ? $option['limit'] : 30,
'page_no' => isset($option['page']) ? $option['page'] : 1,
'type' => isset($option['type']) ? $option['type'] : 0,
'format' => 'json',
'from' => 'ios',
'channel' => '(null)',
'cuid' => 'appstore',
'from' => 'ios',
'version' => '5.9.12',
),
'format' => 'result#song_info#song_list',
);
break;
}
return $this->curl($API);
}
public function song($id)
{
switch ($this->_SITE) {
case 'netease':
$API = array(
'method' => 'POST',
'url' => 'http://music.163.com/api/linux/forward',
'body' => array(
'method' => 'POST',
'params' => array(
'c' => '[{"id":'.$id.',"v":0}]',
),
'url' => 'http://music.163.com/api/v3/song/detail/',
),
'encode' => 'netease_AESECB',
'format' => 'songs',
);
break;
case 'tencent':
$API = array(
'method' => 'GET',
'url' => 'https://c.y.qq.com/v8/fcg-bin/fcg_play_single_song.fcg',
'body' => array(
'songmid' => $id,
'platform' => 'yqq',
'format' => 'json',
),
'decode' => 'tencent_singlesong',
'format' => 'data',
);
break;
case 'xiami':
$API = array(
'method' => 'GET',
'url' => 'http://api.xiami.com/web',
'body' => array(
'v' => '2.0',
'app_key' => '1',
'id' => $id,
'r' => 'song/detail',
),
'format' => 'data#song',
);
break;
case 'kugou':
$API = array(
'method' => 'POST',
'url' => 'http://m.kugou.com/app/i/getSongInfo.php',
'body' => array(
"cmd" => "playInfo",
"hash" => $id,
"from" => "mkugou",
),
'format' => '',
);
break;
case 'baidu':
$API = array(
'method' => 'GET',
'url' => 'https://musicapi.qianqian.com/v1/restserver/ting',
'body' => array(
'method' => 'baidu.ting.song.play',
'songid' => $id,
'format' => 'json',
'from' => 'ios',
'channel' => '(null)',
'cuid' => 'appstore',
'from' => 'ios',
'version' => '5.9.12',
),
'format' => 'songinfo',
);
break;
}
return $this->curl($API);
}
public function album($id)
{
switch ($this->_SITE) {
case 'netease':
$API = array(
'method' => 'POST',
'url' => 'http://music.163.com/api/linux/forward',
'body' => array(
'method' => 'GET',
'params' => array(
"total" => "true",
"offset" => "0",
"id" => $id,
"limit" => "1000",
"ext" => "true",
"private_cloud" => "true"
),
'url' => 'http://music.163.com/api/v1/album/'.$id,
),
'encode' => 'netease_AESECB',
'format' => 'songs',
);
break;
case 'tencent':
$API = array(
'method' => 'GET',
'url' => 'https://c.y.qq.com/v8/fcg-bin/fcg_v8_album_detail_cp.fcg',
'body' => array(
'albummid' => $id,
'platform' => 'mac',
'format' => 'json',
'newsong' => 1,
),
'format' => 'data#getSongInfo',
);
break;
case 'xiami':
$API = array(
'method' => 'GET',
'url' => 'http://api.xiami.com/web',
'body' => array(
'v' => '2.0',
'app_key' => '1',
'id' => $id,
'r' => 'album/detail',
),
'format' => 'data#songs',
);
break;
case 'kugou':
$API = array(
'method' => 'GET',
'url' => 'http://mobilecdn.kugou.com/api/v3/album/song',
'body' => array(
'albumid' => $id,
'plat' => 2,
'page' => 1,
'pagesize' => -1,
'version' => 8550,
),
'format' => 'data#info',
);
break;
case 'baidu':
$API = array(
'method' => 'GET',
'url' => 'https://musicapi.qianqian.com/v1/restserver/ting',
'body' => array(
'method' => 'baidu.ting.album.getAlbumInfo',
'album_id' => $id,
'format' => 'json',
'from' => 'ios',
'channel' => '(null)',
'cuid' => 'appstore',
'from' => 'ios',
'version' => '5.9.12',
),
'format' => 'songlist',
);
break;
}
return $this->curl($API);
}
public function artist($id, $limit=50)
{
switch ($this->_SITE) {
case 'netease':
$API = array(
'method' => 'POST',
'url' => 'http://music.163.com/api/linux/forward',
'body' => array(
'method' => 'GET',
'params' => array(
"ext" => "true",
"private_cloud" => "true",
"ext" => "true",
"top" => $limit,
"id" => $id
),
'url' => 'http://music.163.com/api/v1/artist/'.$id,
),
'encode' => 'netease_AESECB',
'format' => 'hotSongs',
);
break;
case 'tencent':
$API = array(
'method' => 'GET',
'url' => 'https://c.y.qq.com/v8/fcg-bin/fcg_v8_singer_track_cp.fcg',
'body' => array(
'singermid' => $id,
'begin' => 0,
'num' => $limit,
'order' => 'listen',
'platform' => 'mac',
'newsong' => 1,
),
'format' => 'data#list',
);
break;
case 'xiami':
$API = array(
'method' => 'GET',
'url' => 'http://api.xiami.com/web',
'body' => array(
'v' => '2.0',
'app_key' => '1',
'id' => $id,
'limit' => $limit,
'page' => 1,
'r' => 'artist/hot-songs',
),
'format' => 'data',
);
break;
case 'kugou':
$API = array(
'method' => 'GET',
'url' => 'http://mobilecdn.kugou.com/api/v3/singer/song',
'body' => array(
'singerid' => $id,
'page' => 1,
'plat' => 0,
'pagesize' => $limit,
'version' => 8400,
),
'format' => 'data#info',
);
break;
case 'baidu':
$API = array(
'method' => 'GET',
'url' => 'https://musicapi.qianqian.com/v1/restserver/ting',
'body' => array(
'method' => 'baidu.ting.artist.getSongList',
'tinguid' => $id,
'limits' => $limit,
'format' => 'json',
'from' => 'ios',
'channel' => '(null)',
'cuid' => 'appstore',
'from' => 'ios',
'version' => '5.9.12',
),
'format' => 'songlist',
);
break;
}
return $this->curl($API);
}
public function playlist($id)
{
switch ($this->_SITE) {
case 'netease':
$API = array(
'method' => 'POST',
'url' => 'http://music.163.com/api/linux/forward',
'body' => array(
'method' => 'POST',
'params' => array(
"s" => "0",
"id" => $id,
"n" => "1000",
"t" => "0"
),
'url' => 'http://music.163.com/api/v3/playlist/detail',
),
'encode' => 'netease_AESECB',
'format' => 'playlist#tracks',
);
break;
case 'tencent':
$API = array(
'method' => 'GET',
'url' => 'https://c.y.qq.com/v8/fcg-bin/fcg_v8_playlist_cp.fcg',
'body' => array(
'id' => $id,
'format' => 'json',
'newsong' => 1,
'platform' => 'jqspaframe.json',
),
'format' => 'data#cdlist#0#songlist',
);
break;
case 'xiami':
$API = array(
'method' => 'GET',
'url' => 'http://api.xiami.com/web',
'body' => array(
'v' => '2.0',
'app_key' => '1',
'id' => $id,
'r' => 'collect/detail',
),
'format' => 'data#songs',
);
break;
case 'kugou':
$API = array(
'method' => 'GET',
'url' => 'http://mobilecdn.kugou.com/api/v3/special/song',
'body' => array(
'specialid' => $id,
'page' => 1,
'plat' => 2,
'pagesize' => -1,
'version' => 8400,
),
'format' => 'data#info',
);
break;
case 'baidu':
$API = array(
'method' => 'GET',
'url' => 'https://musicapi.qianqian.com/v1/restserver/ting',
'body' => array(
'method' => 'baidu.ting.diy.gedanInfo',
'listid' => $id,
'format' => 'json',
'from' => 'ios',
'channel' => '(null)',
'cuid' => 'appstore',
'from' => 'ios',
'version' => '5.9.12',
),
'format' => 'content',
);
break;
}
return $this->curl($API);
}
public function url($id, $br=320)
{
switch ($this->_SITE) {
case 'netease':
$API = array(
'method' => 'POST',
'url' => 'http://music.163.com/api/linux/forward',
'body' => array(
'method' => 'POST',
'params' => array(
'ids' => array($id),
'br' => $br*1000,
),
'url' => 'http://music.163.com/api/song/enhance/player/url',
),
'encode' => 'netease_AESECB',
'decode' => 'netease_url',
);
break;
case 'tencent':
$API = array(
'method' => 'GET',
'url' => 'https://c.y.qq.com/v8/fcg-bin/fcg_play_single_song.fcg',
'body' => array(
'songmid' => $id,
'platform' => 'yqq',
'format' => 'json',
),
'decode' => 'tencent_url',
);
break;
case 'xiami':
$API = array(
'method' => 'GET',
'url' => 'http://www.xiami.com/song/gethqsong/sid/'.$id,
'body' => array(
'v' => '2.0',
'app_key' => '1',
'id' => $id,
'r' => 'song/detail',
),
'decode' => 'xiami_url',
);
break;
case 'kugou':
$API = array(
'method' => 'POST',
'url' => 'http://media.store.kugou.com/v1/get_res_privilege',
'body' => json_encode(array(
"relate" => 1,
"userid" => 0,
"vip" => 0,
"appid" => 1005,
"token" => "",
"behavior" => "download",
"clientver" => "8493",
"resource" => array(array(
"id" => 0,
"type" => "audio",
"hash" => $id,
)))
),
'decode' => 'kugou_url',
);
break;
case 'baidu':
$API = array(
'method' => 'GET',
'url' => 'http://music.baidu.com/data/music/fmlink',
'body' => array(
'songIds' => $id,
'rate' => $br,
'type' => 'mp3',
),
'decode' => 'baidu_url',
);
break;
}
$this->_TEMP['br'] = $br;
return $this->curl($API);
}
public function lyric($id)
{
switch ($this->_SITE) {
case 'netease':
$API = array(
'method' => 'POST',
'url' => 'http://music.163.com/api/linux/forward',
'body' => array(
'method' => 'POST',
'params' => array(
'id' => $id,
'os' => 'linux',
'lv' => -1,
'kv' => -1,
'tv' => -1,
),
'url' => 'http://music.163.com/api/song/lyric',
),
'encode' => 'netease_AESECB',
'decode' => 'netease_lyric',
);
break;
case 'tencent':
$API = array(
'method' => 'GET',
'url' => 'https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_new.fcg',
'body' => array(
'songmid' => $id,
'g_tk' => '5381',
),
'decode' => 'tencent_lyric',
);
break;
case 'xiami':
$API = array(
'method' => 'GET',
'url' => 'http://api.xiami.com/web',
'body' => array(
'v' => '2.0',
'app_key' => '1',
'id' => $id,
'r' => 'song/detail',
),
'decode' => 'xiami_lyric',
);
break;
case 'kugou':
$API = array(
'method' => 'GET',
'url' => 'http://m.kugou.com/app/i/krc.php',
'body' => array(
'keyword' => '%20-%20',
'timelength' => 1000000,
'cmd' => 100,
'hash' => $id,
),
'decode' => 'kugou_lyric'
);
break;
case 'baidu':
$API = array(
'method' => 'GET',
'url' => 'https://musicapi.qianqian.com/v1/restserver/ting',
'body' => array(
'method' => 'baidu.ting.song.lry',
'songid' => $id,
'format' => 'json',
'from' => 'ios',
'channel' => '(null)',
'cuid' => 'appstore',
'from' => 'ios',
'version' => '5.9.12',
),
'decode' => 'baidu_lyric'
);
break;
}
return $this->curl($API);
}
public function pic($id, $size=300)
{
switch ($this->_SITE) {
case 'netease':
$url='https://p3.music.126.net/'.$this->netease_pickey($id).'/'.$id.'.jpg?param='.$size.'y'.$size;
break;
case 'tencent':
$url='https://y.gtimg.cn/music/photo_new/T002R'.$size.'x'.$size.'M000'.$id.'.jpg?max_age=2592000';
break;
case 'xiami':
$format=$this->_FORMAT;
$data=$this->format(false)->song($id);
$this->format($format);
$data=json_decode($data, 1);
$url=$data['data']['song']['logo'];
$url=str_replace(array('_1.','http:','img.'), array('.','https:','pic.'), $url).'@'.$size.'h_'.$size.'w_100q_1c.jpg';
break;
case 'kugou':
$format=$this->_FORMAT;
$data=$this->format(false)->song($id);
$this->format($format);
$data=json_decode($data, 1);
$url=$data['imgUrl'];
$url=str_replace('{size}', '400', $url);
break;
case 'baidu':
$format=$this->_FORMAT;
$data=$this->format(false)->song($id);
$this->format($format);
$data=json_decode($data, 1);
$url=isset($data['songinfo']['pic_big'])?$data['songinfo']['pic_big']:$data['songinfo']['pic_small'];
break;
}
return json_encode(array('url'=>$url));
}
private function curlset()
{
switch ($this->_SITE) {
case 'netease':
return array(
'referer' => 'https://music.163.com/',
'cookie' => 'os=linux; deviceId=' . $this->getRandomHex(52) . '; osver=Ubuntu%2016.04.3%20LTS; appver=1.1.0.1232; channel=netease; MUSIC_A=' . $this->getRandomHex(208) . '; __csrf=' . $this->getRandomHex(32),
'useragent' => 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
);
case 'tencent':
return array(
'referer' => 'https://y.qq.com/portal/player.html',
'cookie' => 'pgv_pvi=22038528; pgv_si=s3156287488; pgv_pvid=5535248600; yplayer_open=1; ts_last=y.qq.com/portal/player.html; ts_uid=4847550686; yq_index=0; qqmusic_fromtag=66; player_exist=1',
'useragent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36',
);
case 'xiami':
return array(
'referer' => 'http://h.xiami.com/',
'cookie' => '_xiamitoken=' . $this->getRandomHex(32) . '; _unsign_token=' . $this->getRandomHex(32),
'useragent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36',
);
case 'kugou':
return array(
'referer' => 'http://www.kugou.com/webkugouplayer/flash/webKugou.swf',
'cookie' => 'kg_mid=' . $this->getRandomHex(32),
'useragent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36',
);
case 'baidu':
return array(
'referer' => 'http://ting.baidu.com/',
'cookie' => 'BAIDUID=' . $this->getRandomHex(32),
'useragent' => 'ios_5.9.12',
);
}
}
private function getRandomHex($length)
{
if (function_exists('openssl_random_pseudo_bytes')) {
return bin2hex(openssl_random_pseudo_bytes($length));
} else {
return bin2hex(mcrypt_create_iv($length, MCRYPT_DEV_URANDOM));
}
}
/**
* 乱七八糟的函数,加密解密...
* 正在努力重构这些代码 TAT
*/
private function netease_AESECB($API)
{
$KEY='7246674226682325323F5E6544673A51';
$body=json_encode($API['body']);
if (function_exists('openssl_encrypt')) {
$body=openssl_encrypt($body, 'aes-128-ecb', pack('H*', $KEY));
} else {
$PAD=16-(strlen($body)%16);
$body=base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, hex2bin($KEY), $body.str_repeat(chr($PAD), $PAD), MCRYPT_MODE_ECB));
}
$body=strtoupper(bin2hex(base64_decode($body)));
$API['body']=array(
'eparams'=>$body,
);
return $API;
}
private function tencent_singlesong($result)
{
$result=json_decode($result, 1);
$data=$result['data'][0];
$t=array(
'songmid' => $data['mid'],
'songname' => $data['name'],
'albummid' => $data['album']['mid'],
);
foreach ($t as $key=>$vo) {
$result['data'][0][$key]=$vo;
}
return json_encode($result);
}
private function netease_pickey($id)
{
$magic=str_split('3go8&$8*3*3h0k(2)2');
$song_id=str_split($id);
for ($i=0;$i<count($song_id);$i++) {
$song_id[$i]=chr(ord($song_id[$i])^ord($magic[$i%count($magic)]));
}
$result=base64_encode(md5(implode('', $song_id), 1));
$result=str_replace(array('/','+'), array('_','-'), $result);
return $result;
}
/**
* URL - 歌曲地址转换函数
* 用于返回不高于指定 bitRate 的歌曲地址(默认规范化)
*/
private function netease_url($result)
{
$data=json_decode($result, 1);
if (isset($data['data'][0]['uf']['url'])) {
$data['data'][0]['url']=$data['data'][0]['uf']['url'];
}
if (isset($data['data'][0]['url'])) {
$url=array(
'url' => $data['data'][0]['url'],
'br' => $data['data'][0]['br']/1000,
);
} else {
$url=array(
'url' => '',
'br' => -1,
);
}
return json_encode($url);
}
private function tencent_url($result)
{
$data=json_decode($result, 1);
$GUID=mt_rand()%10000000000;
$API=array(
'method' => 'GET',
'url' => 'https://c.y.qq.com/base/fcgi-bin/fcg_musicexpress.fcg',
'body' => array(
'json' => 3,
'guid' => $GUID,
'format' => 'json',
),
);
$KEY=json_decode($this->curl($API), 1);
$KEY=$KEY['key'];
$type=array(
'size_320mp3' => array(320,'M800','mp3'),
'size_192aac' => array(192,'C600','m4a'),
'size_128mp3' => array(128,'M500','mp3'),
'size_96aac' => array(96 ,'C400','m4a'),
'size_48aac' => array(48 ,'C200','m4a'),
);
foreach ($type as $key=>$vo) {
if ($data['data'][0]['file'][$key]&&$vo[0]<=$this->_TEMP['br']) {
$url=array(
'url' => 'https://dl.stream.qqmusic.qq.com/'.$vo[1].$data['data'][0]['file']['media_mid'].'.'.$vo[2].'?vkey='.$KEY.'&guid='.$GUID.'&uid=0&fromtag=30',
'br' => $vo[0],
);
break;
}
}
if (!isset($url['url'])) {
$url=array(
'url' => '',
'br' => -1,
);
}
return json_encode($url);
}
private function xiami_url($result)
{
$data=json_decode($result, 1);
if (!empty($data['location'])) {
$location = $data['location'];
$num = (int)$location[0];
$str = substr($location, 1);
$len = floor(strlen($str)/$num);
$sub = strlen($str) % $num;
$qrc = array();
$tmp = 0;
$urlt = '';
for (;$tmp<$sub;$tmp++) {
$qrc[$tmp] = substr($str, $tmp*($len+1), $len+1);
}
for (;$tmp<$num;$tmp++) {
$qrc[$tmp] = substr($str, $len*$tmp+$sub, $len);
}
for ($tmpa=0;$tmpa<$len+1;$tmpa++) {
for ($tmpb=0;$tmpb<$num;$tmpb++) {
if (isset($qrc[$tmpb][$tmpa])) {
$urlt.=$qrc[$tmpb][$tmpa];
}
}
}
$urlt=str_replace('^', '0', urldecode($urlt));
$url=array(
'url' => str_replace('http://','https://',urldecode($urlt)),
'br' => 320,
);
} else {
$url=array(
'url' => '',
'br' => -1,
);
}
return json_encode($url);
}
private function kugou_url($result)
{
$data=json_decode($result, 1);
$max=0;
$url=array();
foreach ($data['data'][0]['relate_goods'] as $vo) {
if ($vo['info']['bitrate']<=$this->_TEMP['br']&&$vo['info']['bitrate']>$max) {
$API=array(
'method' => 'GET',
'url' => 'http://trackercdn.kugou.com/i/v2/',
'body' => array(
'hash' => $vo['hash'],
'key' => md5($vo['hash'].'kgcloudv2'),
'pid' => 1,
'behavior' => 'play',
'cmd' => '23',
'version' => 8400,
),
);
$t=json_decode($this->curl($API), 1);
if (isset($t['url'])) {
$max=$t['bitRate']/1000;
$url=array(
'url' => $t['url'],
'br' => $t['bitRate']/1000,
);
}
}
}
if (!isset($url['url'])) {
$url=array(
'url' => '',
'br' => -1,
);
}
return json_encode($url);
}
private function baidu_url($result)
{
$data=json_decode($result, 1);
if (isset($data['data']['songList'][0]['songLink'])) {
$url=array(
'url' => $data['data']['songList'][0]['songLink'],
'br' => $data['data']['songList'][0]['rate'],
);
$url['url']=str_replace('http://yinyueshiting.baidu.com', 'https://gss0.bdstatic.com/y0s1hSulBw92lNKgpU_Z2jR7b2w6buu', $url['url']);
} else {
$url=array(
'url' => '',
'br' => -1,
);
}
return json_encode($url);
}
/**
* 歌词处理模块
* 用于规范化歌词输出
*/
private function netease_lyric($result)
{
if (!$this->_FORMAT) {
return $result;
}
$result=json_decode($result, 1);
$data=array(
'lyric' => isset($result['lrc']['lyric'])?$result['lrc']['lyric']:'',
'tlyric' => isset($result['tlyric']['lyric'])?$result['tlyric']['lyric']:'',
);
return json_encode($data);
}
private function tencent_lyric($result)
{
$result=substr($result,18,-1);
if (!$this->_FORMAT) {
return $result;
}
$result=json_decode($result, 1);
$data=array(
'lyric' => isset($result['lyric'])?base64_decode($result['lyric']):'',
'tlyric' => isset($result['trans'])?base64_decode($result['trans']):'',
);
return json_encode($data);
}
private function xiami_lyric($result)
{
if (!$this->_FORMAT) {
return $result;
}
$result=json_decode($result, 1);
$data='';
if(!empty($result['data']['song']['lyric'])){
$API=array('method'=>'GET','url'=>$result['data']['song']['lyric']);
$data=$this->curl($API);
$data=preg_replace('/<[^>]+>/', '', $data);
}
preg_match_all('/\[([\d:\.]+)\](.*)\s\[x-trans\](.*)/i',$data,$match);
if(sizeof($match[0])){
for($i=0;$i<sizeof($match[0]);$i++){
$A[]='['.$match[1][$i].']'.$match[2][$i];
$B[]='['.$match[1][$i].']'.$match[3][$i];
}
$arr=array(
'lyric' => str_replace($match[0],$A,$data),
'tlyric' => str_replace($match[0],$B,$data),
);
}
else{
$arr=array(
'lyric' => $data,
'tlyric' => '',
);
}
return json_encode($arr);
}
private function kugou_lyric($result)
{
if (!$this->_FORMAT) {
return $result;
}
$arr=array(
'lyric' => $result,
'tlyric' => '',
);
return json_encode($arr);
}
private function baidu_lyric($result)
{
if (!$this->_FORMAT) {
return $result;
}
$result=json_decode($result, 1);
$data=array(
'lyric' => isset($result['lrcContent'])?$result['lrcContent']:'',
'tlyric' => '',
);
return json_encode($data);
}
/**
* Format - 规范化函数
* 用于统一返回的参数,可用 ->format() 一次性开关开启
*/
private function format_netease($data)
{
$result=array(
'id' => $data['id'],
'name' => $data['name'],
'artist' => array(),
'album' => $data['al']['name'],
'pic_id' => isset($data['al']['pic_str'])?$data['al']['pic_str']:$data['al']['pic'],
'url_id' => $data['id'],
'lyric_id' => $data['id'],
'source' => 'netease',
);
if (isset($data['al']['picUrl'])) {
preg_match('/\/(\d+)\./', $data['al']['picUrl'], $match);
$result['pic_id']=$match[1];
}
foreach ($data['ar'] as $vo) {
$result['artist'][]=$vo['name'];
}
return $result;
}
private function format_tencent($data)
{
if (isset($data['musicData'])) {
$data=$data['musicData'];
}
$result=array(
'id' => $data['mid'],
'name' => $data['name'],
'artist' => array(),
'album' => trim($data['album']['title']),
'pic_id' => $data['album']['mid'],
'url_id' => $data['mid'],
'lyric_id' => $data['mid'],
'source' => 'tencent',
);
foreach ($data['singer'] as $vo) {
$result['artist'][]=$vo['name'];
}
return $result;
}
private function format_xiami($data)
{
$result=array(
'id' => $data['song_id'],
'name' => $data['song_name'],
'artist' => explode(';', isset($data['singers'])?$data['singers']:$data['artist_name']),
'album' => $data['album_name'],
'pic_id' => $data['song_id'],
'url_id' => $data['song_id'],
'lyric_id' => $data['song_id'],
'source' => 'xiami',
);
return $result;
}
private function format_kugou($data)
{
$result=array(
'id' => $data['hash'],
'name' => isset($data['filename'])?$data['filename']:$data['fileName'],
'artist' => array(),
'album' => isset($data['album_name'])?$data['album_name']:'',
'url_id' => $data['hash'],
'pic_id' => $data['hash'],
'lyric_id' => $data['hash'],
'source' => 'kugou',
);
list($result['artist'], $result['name'])=explode(' - ', $result['name'], 2);
$result['artist']=explode('、', $result['artist']);
return $result;
}
private function format_baidu($data)
{
$result=array(
'id' => $data['song_id'],
'name' => $data['title'],
'artist' => explode(',', $data['author']),
'album' => $data['album_title'],
'pic_id' => $data['song_id'],
'url_id' => $data['song_id'],
'lyric_id' => $data['song_id'],
'source' => 'baidu',
);
return $result;
}
}
$api = new Meting('netease');
function Search($api,$id)
{
return $data = $api->format(true)->search($id);
}
function Song($api,$id){
return $data = $api->format(true)->song($id);
}
function Pic($api,$id){
return $data = $api->format(true)->pic($id);
}
function Url($api,$id){
$data = json_decode($api->format(true)->url($id));
$data->url=str_replace('://m7c.','://m7.',$data->url);
$data->url=str_replace('://m8c.','://m8.',$data->url);
$data->url=str_replace('http://m8.','https://m9.',$data->url);
$data->url=str_replace('http://m7.','https://m9.',$data->url);
$data->url=str_replace('http://m10.','https://m10.',$data->url);
return json_encode($data);
}
function Lyric($api,$id){
return $data = $api->format(true)->lyric($id);
}
function playlist($api,$id){
return $data = $api->format(true)->playlist($id);
}
function comment($api,$id){
return $data = $api->format(true)->comment($id);
}
function sign($id, $random, $sig, $time){
$sign = '$sdk=XXX&$id='.$id.'&$random='.$random.'&$time='.$time;
if(md5($sign) === $sig){
return true;
} else{
return false;
}
}
$data = json_decode(file_get_contents("php://input"));
if(sign($data->id,$data->random,$data->sig,$data->time)){
$id = $data->id;
switch ($data->method){
case 'search':
exit(Search($api,$id));
break;
case 'song':
exit(Song($api,$id));
break;
case 'pic':
exit(Pic($api,$id));
break;
case 'url':
exit(Url($api,$id));
break;
case 'lyric':
exit(Lyric($api,$id));
break;
case 'playlist':
exit(playlist($api,$id));
break;
case 'comment':
exit(comment($api,$id));
break;
default:
header("Location: http://www.masterzc.cn/");
}
} else {
print($data);
header("Location: http://www.masterzc.cn/");
}
?>
本文链接:https://www.masterzc.cn/archives/42.html
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处