音乐馆解除VIP限制

前言

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
// index.php
// 设置cookie
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 Studio API
$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);

// 检查 GD Studio API 返回结果是否有效
if (!empty($result_arr) && isset($result_arr['url']) && !empty($result_arr['url'])) {
// 转换为与原始 API 相同的格式
$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);
}

// 如果 GD Studio API 失败,使用原始网易云 API
$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 Studio API
$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);

// 检查 GD Studio API 返回结果是否有效
if (!empty($result_arr) && isset($result_arr['url']) && !empty($result_arr['url'])) {
// 转换为与原始 API 相同的格式
$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);
}

// 如果 GD Studio API 失败,尝试 解灰 API
$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);

// 检查 解灰 API 返回结果是否有效
if (!empty($result_arr) && $result_arr['code'] == 200 && !empty($result_arr['data']['url'])) {
// 转换为与原始 API 相同的格式
$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 都失败,使用原始网易云 API
$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限制,又可以获取完整的歌曲,甚至可以播放无版权歌曲。