在Ubuntu+宝塔面板部署 NeteaseCloudMusicApi

教程将分为三个主要部分:

  1. 部署后端API:在服务器上安装并运行 NeteaseCloudMusicApi (Node.js版)。
  2. 准备前端环境:创建网站并配置SSL。
  3. 编写PHP代码:实现调用API、解析数据并展示。

第一部分:在Ubuntu+宝塔面板部署 NeteaseCloudMusicApi

这部分我们将使用宝塔面板的PM2管理器,方便地部署Node.js项目。

步骤1:准备工作

  • 一台已经安装了宝塔面板的Ubuntu服务器。
  • 确保服务器上的Node.js版本在12或以上。你可以在宝塔面板的【软件商店】中搜索并安装【PM2管理器】,安装后可以在其设置中切换Node.js版本。

步骤2:获取项目代码

  1. 登录宝塔面板,进入【文件】菜单。
  2. /www/wwwroot/ 目录下,新建一个文件夹用于存放项目,例如命名为 NeteaseCloudMusicApi
  3. 进入该文件夹,点击【远程下载】。
  4. 在弹出的对话框中,输入 NeteaseCloudMusicApi 的GitHub仓库地址:https://github.com/Binaryify/NeteaseCloudMusicApi/archive/refs/heads/main.zip,然后点击【确定】等待下载完成。
  5. 下载完成后,解压该压缩包。为了后续配置方便,建议将解压后文件夹内的所有文件(如 app.js, package.json 等)移动(剪切)到 /www/wwwroot/NeteaseCloudMusicApi/ 根目录下。

步骤3:安装项目依赖

  1. 宝塔面板左上角点击【终端】,登录你的服务器。
  2. 在终端中,使用 cd 命令进入项目目录:

    cd /www/wwwroot/NeteaseCloudMusicApi
  3. 执行 npm 命令安装依赖(这个过程可能需要几分钟):

    npm install

步骤4:使用PM2管理器运行项目

  1. 回到宝塔面板首页,打开【软件商店】,找到并点击【PM2管理器】的【设置】。
  2. 在PM2管理器中,点击【添加项目】。
  3. 在弹出的表单中,按照如下方式填写:

    • 项目名称:自定义,如 NeteaseCloudMusicApi
    • 启动文件:点击选择,找到并选中你项目目录下的 /www/wwwroot/NeteaseCloudMusicApi/app.js 文件。
    • 运行目录:选择项目根目录,即 /www/wwwroot/NeteaseCloudMusicApi
    • 其他选项保持默认即可。
  4. 点击【提交】。如果一切顺利,你将在项目列表中看到它,并且状态为“在线”。

步骤5:设置防火墙和安全组

  1. 在宝塔面板的【安全】菜单中,找到【防火墙】,在【放行端口】中输入 3000(这是该API项目的默认端口),点击【放行】。
  2. 重要:如果你的服务器是阿里云、腾讯云等云服务商提供的,还需要登录到它们的云控制台,找到你的实例的安全组配置,手动添加一条入方向规则,放行 3000 端口。

步骤6:测试API是否成功部署

  1. 在浏览器中访问 http://你的服务器IP:3000。如果看到欢迎页面,说明API基础服务运行正常。
  2. 进一步测试接口,例如访问 http://你的服务器IP:3000/banner,如果能看到返回的JSON数据(包含轮播图信息),说明API已可以正常工作。

第二部分:在宝塔面板创建PHP网站

步骤1:创建网站

  1. 在宝塔面板的【网站】菜单中,点击【添加站点】。
  2. 域名:填写你用来访问这个音乐展示页面的域名,如果没有域名,可以暂时使用服务器的IP地址(但后续可能会遇到路径问题,建议最好使用一个域名或二级域名)。
  3. 根目录:可以默认或自定义,例如 /www/wwwroot/musicdemo.com
  4. PHP版本:选择 PHP 7.0 及以上的版本。
  5. 点击【提交】创建站点。

步骤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:配置和测试

  1. 修改配置:打开 album.php,找到 $API_BASE_URL = 'http://你的服务器IP:3000'; 这一行,将其中的 你的服务器IP 替换为你服务器的真实公网IP地址。务必保留 :3000 端口号
  2. 上传文件:将 NeteaseAPI.phpalbum.php 两个文件上传到你网站的根目录(例如 /www/wwwroot/musicdemo.com/)。
  3. 访问测试:在浏览器中访问 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应用来调用它,实现了专辑封面、标题和歌曲列表的展示。

暂无评论