前言
AnZhiYu主题有个音乐馆的页面,是通过调用Meting API来获取音乐消息的,但是默认的meting-api已经无法使用,需要更换CDN或自建API。不过我发现公益项目和自建API貌似都存在VIP歌曲的限制,由于部分歌曲需要VIP才能播放,导致只能获取到30s的试听,无法播放完整的歌曲。因此思考能否绕过VIP限制,获取完整的歌曲。
解决方案
本文中所有方法均需要自建API,需要完成服务器的部署和域名的解析,将_config.anzhiyu.yml
中的CDN.option.meting_api
改为自己的API地址。
1. 使用Cookie
meting-api项目提供了使用Cookie获取音乐的方法,可以直接使用,但是此方法存在Cookie过期问题,需要定时更新Cookie,十分麻烦,因此不予采用。
1 2 3 4 5
|
if ($server == 'netease') { $api->cookie('NMTID=00OtTy3WMXKPeSbp0qLuGy8FKJYOrAAAAGNCHbO_Q;'); }
|
2. 使用云盘
因为meting-api项目的作者已经不再维护,因此kuwo等音乐平台的API似乎已经失效,而QQ音乐的网盘请求存在次数限制,故本文的修改只涉及了网易云音乐。
https://music.gdstudio.xyz/提供了网易云音乐的云盘服务,使用它的API可以获取完整的歌曲。
修改Meting API项目中的/src/meting.php
文件,修改以下片段即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| public function url($id, $br = 320) { switch ($this->server) { case 'netease': $gd_api = array( 'method' => 'POST', 'url' => 'https://music-api.gdstudio.xyz/api.php', 'body' => array( 'types' => 'url', 'id' => $id, 'br' => $br, ), ); $result = $this->exec($gd_api); $result_arr = json_decode($result, true); if (!empty($result_arr) && isset($result_arr['url']) && !empty($result_arr['url'])) { $formatted_result = array( 'url' => $result_arr['url'], 'size' => isset($result_arr['size']) ? $result_arr['size'] : 0, 'br' => isset($result_arr['br']) ? $result_arr['br'] : $br, ); return json_encode($formatted_result); }
$api = array( 'method' => 'POST', 'url' => 'http://music.163.com/api/song/enhance/player/url', 'body' => array( 'ids' => array($id), 'br' => $br * 1000, ), 'encode' => 'netease_AESCBC', 'decode' => 'netease_url', ); break;
|
现在,你的音乐馆页面应该可以获取完整的歌曲了。
进阶
跨域访问可能会出现CORS问题,需要在服务器上放行相关域名,可能还需要开启反代功能。
如果你还部署了网易云解灰项目,那么你还可以添加解灰API的请求以实现获取一些无版权的歌曲(例如周杰伦)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| public function url($id, $br = 320) { switch ($this->server) { case 'netease': $gd_api = array( 'method' => 'POST', 'url' => 'https://music-api.gdstudio.xyz/api.php', 'body' => array( 'types' => 'url', 'id' => $id, 'br' => $br, ), ); $result = $this->exec($gd_api); $result_arr = json_decode($result, true); if (!empty($result_arr) && isset($result_arr['url']) && !empty($result_arr['url'])) { $formatted_result = array( 'url' => $result_arr['url'], 'size' => isset($result_arr['size']) ? $result_arr['size'] : 0, 'br' => isset($result_arr['br']) ? $result_arr['br'] : $br, ); return json_encode($formatted_result); } $unlock_api = array( 'method' => 'GET', 'url' => 'https://your-unm-server.com/match', 'body' => array( 'id' => $id, ), ); $result = $this->exec($unlock_api); $result_arr = json_decode($result, true); if (!empty($result_arr) && $result_arr['code'] == 200 && !empty($result_arr['data']['url'])) { $formatted_result = array( 'url' => $result_arr['data']['url'], 'size' => isset($result_arr['data']['size']) ? $result_arr['data']['size'] : 0, 'br' => isset($result_arr['data']['br']) ? $result_arr['data']['br'] / 1000 : $br, ); return json_encode($formatted_result); } $api = array( 'method' => 'POST', 'url' => 'http://music.163.com/api/song/enhance/player/url', 'body' => array( 'ids' => array($id), 'br' => $br * 1000, ), 'encode' => 'netease_AESCBC', 'decode' => 'netease_url', ); break;
|
这样,你的音乐馆页面就可以既没有VIP限制,又可以获取完整的歌曲,甚至可以播放无版权歌曲。