。
步骤1:创建后端API调用封装文件
步骤2:创建前端展示页面
教程将分为三个主要部分:
- 部署后端API:在服务器上安装并运行
NeteaseCloudMusicApi(Node.js版)。 - 准备前端环境:创建网站并配置SSL。
- 编写PHP代码:实现调用API、解析数据并展示。
第一部分:在Ubuntu+宝塔面板部署 NeteaseCloudMusicApi
这部分我们将使用宝塔面板的PM2管理器,方便地部署Node.js项目。
步骤1:准备工作
- 一台已经安装了宝塔面板的Ubuntu服务器。
- 确保服务器上的Node.js版本在12或以上。你可以在宝塔面板的【软件商店】中搜索并安装【PM2管理器】,安装后可以在其设置中切换Node.js版本。
步骤2:获取项目代码
- 登录宝塔面板,进入【文件】菜单。
- 在
/www/wwwroot/目录下,新建一个文件夹用于存放项目,例如命名为NeteaseCloudMusicApi。 - 进入该文件夹,点击【远程下载】。
- 在弹出的对话框中,输入
NeteaseCloudMusicApi的GitHub仓库地址:https://github.com/Binaryify/NeteaseCloudMusicApi/archive/refs/heads/main.zip,然后点击【确定】等待下载完成。 - 下载完成后,解压该压缩包。为了后续配置方便,建议将解压后文件夹内的所有文件(如
app.js,package.json等)移动(剪切)到/www/wwwroot/NeteaseCloudMusicApi/根目录下。
步骤3:安装项目依赖
- 宝塔面板左上角点击【终端】,登录你的服务器。
在终端中,使用
cd命令进入项目目录:cd /www/wwwroot/NeteaseCloudMusicApi执行
npm命令安装依赖(这个过程可能需要几分钟):npm install
步骤4:使用PM2管理器运行项目
- 回到宝塔面板首页,打开【软件商店】,找到并点击【PM2管理器】的【设置】。
- 在PM2管理器中,点击【添加项目】。
在弹出的表单中,按照如下方式填写:
- 项目名称:自定义,如
NeteaseCloudMusicApi。 - 启动文件:点击选择,找到并选中你项目目录下的
/www/wwwroot/NeteaseCloudMusicApi/app.js文件。 - 运行目录:选择项目根目录,即
/www/wwwroot/NeteaseCloudMusicApi。 - 其他选项保持默认即可。
- 项目名称:自定义,如
- 点击【提交】。如果一切顺利,你将在项目列表中看到它,并且状态为“在线”。
步骤5:设置防火墙和安全组
- 在宝塔面板的【安全】菜单中,找到【防火墙】,在【放行端口】中输入
3000(这是该API项目的默认端口),点击【放行】。 - 重要:如果你的服务器是阿里云、腾讯云等云服务商提供的,还需要登录到它们的云控制台,找到你的实例的安全组配置,手动添加一条入方向规则,放行
3000端口。
步骤6:测试API是否成功部署
- 在浏览器中访问
http://你的服务器IP:3000。如果看到欢迎页面,说明API基础服务运行正常。 - 进一步测试接口,例如访问
http://你的服务器IP:3000/banner,如果能看到返回的JSON数据(包含轮播图信息),说明API已可以正常工作。
第二部分:在宝塔面板创建PHP网站
步骤1:创建网站
- 在宝塔面板的【网站】菜单中,点击【添加站点】。
- 域名:填写你用来访问这个音乐展示页面的域名,如果没有域名,可以暂时使用服务器的IP地址(但后续可能会遇到路径问题,建议最好使用一个域名或二级域名)。
- 根目录:可以默认或自定义,例如
/www/wwwroot/musicdemo.com。 - PHP版本:选择 PHP 7.0 及以上的版本。
- 点击【提交】创建站点。
步骤2:配置SSL(可选但推荐)
如果你想通过HTTPS访问你的网站,可以在站点设置中申请并开启Let‘s Encrypt SSL证书。
第三部分:编写PHP前端代码实现调用和展示
这部分我们将在你刚创建的网站根目录下,编写PHP代码来调用我们已经部署好的API,并展示专辑信息。
我们将通过两个核心文件来实现:一个后端API调用封装,和一个前端展示页面。
步骤1:创建后端API调用封装文件 NeteaseAPI.php
在网站根目录(例如 /www/wwwroot/musicdemo.com)下,新建一个文件,命名为 NeteaseAPI.php。这个类将负责所有与后端Node.js API的通信。
<?php
class NeteaseAPI {
private $api_base_url;
/**
* 构造函数
* @param string $base_url 你的NeteaseCloudMusicApi服务的地址
*/
public function __construct($base_url) {
// 确保base_url没有尾随斜杠
$this->api_base_url = rtrim($base_url, '/');
}
/**
* 发送HTTP GET请求的核心方法
* @param string $endpoint API端点 (例如 '/album', '/search')
* @param array $params 查询参数 (例如 ['id' => 123])
* @return array|false 解析后的JSON数据数组,失败返回false
*/
private function get($endpoint, $params = []) {
$url = $this->api_base_url . $endpoint;
if (!empty($params)) {
$url .= '?' . http_build_query($params);
}
// 初始化cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 设置10秒超时
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// 设置User-Agent,模拟浏览器请求,避免被部分服务器拒绝
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36');
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);
if ($error) {
error_log("NeteaseAPI cURL Error: " . $error);
return false;
}
if ($http_code !== 200) {
error_log("NeteaseAPI HTTP Error: " . $http_code . " for URL: " . $url);
return false;
}
$data = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
error_log("NeteaseAPI JSON Parse Error: " . json_last_error_msg());
return false;
}
return $data;
}
/**
* 根据专辑ID获取专辑信息 (包括歌曲列表)
* API端点: /album
* @param int|string $album_id 专辑ID
* @return array|false 专辑数据,失败返回false
*/
public function getAlbum($album_id) {
// 官方API文档: /album?id={id}
$result = $this->get('/album', ['id' => $album_id]);
// 检查API返回的code是否为200 (成功)
if ($result && isset($result['code']) && $result['code'] === 200) {
return $result;
}
return false;
}
/**
* 根据关键词搜索专辑 (备用功能)
* API端点: /search
* @param string $keywords 搜索关键词
* @return array|false 搜索结果,失败返回false
*/
public function searchAlbum($keywords) {
// 官方API文档: /search?keywords={keywords}&type=10 (type=10 表示专辑)
$result = $this->get('/search', ['keywords' => $keywords, 'type' => 10]);
if ($result && isset($result['code']) && $result['code'] === 200) {
return $result;
}
return false;
}
}
?>步骤2:创建前端展示页面 album.php
在网站根目录下,新建一个文件,命名为 album.php。这个页面将调用我们上面定义的类,并展示一个示例专辑(以周杰伦的经典专辑《叶惠美》为例)。
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>网易云音乐 - 专辑展示</title>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; background: #f5f5f5; }
.album-card { background: white; border-radius: 12px; box-shadow: 0 8px 20px rgba(0,0,0,0.1); padding: 24px; margin-bottom: 30px; display: flex; gap: 30px; flex-wrap: wrap; }
.album-cover { width: 200px; height: 200px; border-radius: 8px; box-shadow: 0 4px 12px rgba(0,0,0,0.15); object-fit: cover; }
.album-info { flex: 1; }
.album-info h2 { margin-top: 0; color: #333; }
.album-info p { margin: 8px 0; color: #666; }
.song-list { background: white; border-radius: 12px; box-shadow: 0 8px 20px rgba(0,0,0,0.1); padding: 24px; }
.song-list h3 { margin-top: 0; color: #333; border-bottom: 2px solid #eee; padding-bottom: 10px; }
.song-item { display: flex; align-items: center; padding: 10px 0; border-bottom: 1px solid #f0f0f0; }
.song-index { width: 40px; color: #999; font-weight: 500; }
.song-name { flex: 1; color: #333; }
.song-artists { width: 200px; color: #666; font-size: 0.9em; }
.error-message { background: #ffebee; color: #c62828; padding: 20px; border-radius: 8px; text-align: center; }
.loading { text-align: center; color: #999; padding: 40px; }
</style>
</head>
<body>
<h1>🎵 网易云音乐专辑信息</h1>
<?php
// 引入我们刚写的API类
require_once 'NeteaseAPI.php';
// 【重要配置】请将下面的URL替换为你自己部署的API服务地址!
$API_BASE_URL = 'http://你的服务器IP:3000'; // 例如 http://123.123.123.123:3000
// 初始化API客户端
$neteaseAPI = new NeteaseAPI($API_BASE_URL);
// 定义要查询的专辑ID (示例: 周杰伦《叶惠美》专辑ID)
$album_id = 2201;
// 从API获取专辑数据
$album_data = $neteaseAPI->getAlbum($album_id);
if ($album_data === false) {
echo '<div class="error-message">';
echo '<h2>❌ 获取专辑信息失败</h2>';
echo '<p>请检查:</p>';
echo '<ol style="text-align: left;">';
echo '<li>你的API服务地址 <strong>' . htmlspecialchars($API_BASE_URL) . '</strong> 是否能正常访问?</li>';
echo '<li>服务器的3000端口是否已在宝塔面板和云安全组中放行?</li>';
echo '<li>PM2管理器中的项目是否处于"在线"状态?</li>';
echo '</ol>';
echo '</div>';
} else {
// 成功获取数据,开始解析和展示
$album = $album_data['album']; // 专辑详细信息
$songs = $album_data['songs']; // 歌曲列表
// 获取高清封面图片URL (尝试获取大图)
$pic_url = $album['picUrl'] ?? '';
// 可以通过修改URL参数获取更大尺寸的图片,例如添加 ?param=500x500
$pic_url_large = $pic_url . '?param=500y500';
?>
<div class="album-card">
<!-- 专辑封面 -->
<img src="<?php echo htmlspecialchars($pic_url_large); ?>" alt="<?php echo htmlspecialchars($album['name']); ?> 封面" class="album-cover">
<!-- 专辑信息 -->
<div class="album-info">
<h2><?php echo htmlspecialchars($album['name']); ?></h2>
<p>👤 歌手:<?php echo htmlspecialchars($album['artist']['name'] ?? '未知'); ?></p>
<p>📅 发行时间:<?php echo htmlspecialchars($album['publishTime'] ? date('Y-m-d', $album['publishTime'] / 1000) : '未知'); ?></p>
<p>📀 唱片公司:<?php echo htmlspecialchars($album['company'] ?? '未知'); ?></p>
<p>🔢 歌曲数量:<?php echo count($songs); ?> 首</p>
<p>📝 简介:<?php echo nl2br(htmlspecialchars($album['description'] ?? '暂无简介')); ?></p>
</div>
</div>
<div class="song-list">
<h3>📜 包含歌曲</h3>
<?php if (empty($songs)): ?>
<p>暂无歌曲信息</p>
<?php else: ?>
<?php foreach ($songs as $index => $song): ?>
<div class="song-item">
<span class="song-index"><?php echo str_pad($index + 1, 2, '0', STR_PAD_LEFT); ?></span>
<span class="song-name"><?php echo htmlspecialchars($song['name']); ?></span>
<span class="song-artists">
<?php
$artists = array_map(function($ar) { return $ar['name']; }, $song['ar'] ?? []);
echo htmlspecialchars(implode(' / ', $artists));
?>
</span>
</div>
<?php endforeach; ?>
<?php endif; ?>
</div>
<?php
} // 结束 else
?>
</body>
</html>步骤3:配置和测试
- 修改配置:打开
album.php,找到$API_BASE_URL = 'http://你的服务器IP:3000';这一行,将其中的你的服务器IP替换为你服务器的真实公网IP地址。务必保留:3000端口号。 - 上传文件:将
NeteaseAPI.php和album.php两个文件上传到你网站的根目录(例如/www/wwwroot/musicdemo.com/)。 - 访问测试:在浏览器中访问
http://你的域名或IP/album.php。如果一切顺利,你将看到周杰伦《叶惠美》专辑的封面、详细信息以及完整的歌曲列表。
常见问题排查
API无法访问:
- 在浏览器直接访问
http://你的IP:3000,确认是否能打开API欢迎页。如果不能,检查PM2管理器项目状态和端口放行。 - 如果API页能打开,但
album.php报错,检查PHP代码中$API_BASE_URL的地址是否正确。
- 在浏览器直接访问
获取数据失败:
- 在服务器终端使用
curl http://你的IP:3000/album?id=2201命令测试,看是否能返回JSON数据。这可以判断是API问题还是PHP代码问题。
- 在服务器终端使用
封面图片不显示:
- 检查图片URL是否被正确输出。有时防盗链机制可能导致图片无法显示,这是正常现象,不影响功能。
通过以上步骤,你就成功地部署了自己的网易云音乐API,并创建了一个简单的PHP应用来调用它,实现了专辑封面、标题和歌曲列表的展示。
暂无评论