基于MKOnlinePlayer开源项目搭建个人音乐网站及qq音乐歌单信息爬取

发布于 22 天前  1713 次阅读


介绍

MKOnlinePlayer是由孟坤博主(https://mkblog.cn)开发的一款基于网易云音乐api的在线音乐播放器。具有音乐搜索、播放、下载、歌词同步显示、个人音乐播放列表同步等功能。

在github下载该项目并部署在网站上

github下载网址:

https://github.com/mengkunsoft/MKOnlineMusicPlayer

下载好之后,把整个解压文件放在网站运行目录下,并开启php 版本建议 5.5以上

更新Meting.php

由于本项目作者在2.4版本已经不再维护,因此无法使用歌曲搜索功能,我们需要将子文件夹plugns下的Meting.php更替。Meting.php下载地址如下:

https://github.com/metowolf/Meting/blob/master/src/Meting.php

此时网站的所有功能就都可以正常使用啦。

更改musicList.js

点击播放列表,可以看到我们自己设置了几个播放列表。而播放列表的设置就在子文件夹js的musicList.js中。

网易云歌单的添加

对于网易云歌单,添加方式非常简单,只需给出歌单id即可

var musicList = [
    // 以下三个系统预留列表请勿更改,否则可能导致程序无法正常运行!
    // 预留列表:搜索结果
    {
        name: "搜索结果",   // 播放列表名字
        cover: "",          // 播放列表封面
        creatorName: "",        // 列表创建者名字
        creatorAvatar: "",      // 列表创建者头像
        item: []
    },
    // 预留列表:正在播放
    {
        name: "正在播放",   // 播放列表名字
        cover: "",          // 播放列表封面
        creatorName: "",        // 列表创建者名字
        creatorAvatar: "",      // 列表创建者头像
        item: []
    },
    // 预留列表:播放历史
    {
        name: "播放历史",   // 播放列表名字
        cover: "images/history.png",          // 播放列表封面
        creatorName: "",        // 列表创建者名字
        creatorAvatar: "",      // 列表创建者头像
        item: []
    },  
    // 以上三个系统预留列表请勿更改,否则可能导致程序无法正常运行!
    //*********************************************
    // 自定义列表开始,您可以自由添加您的自定义列表
    {
        id: 4906984848// 网易云歌单ID
    }
];

QQ音乐歌单的添加

对于qq音乐的歌单,我们需要使用musicList.js中自定义歌单的那一部分,qq音乐歌曲js格式如下所示:

 {
        name: "自定义列表",   // 播放列表名字
        cover: "https://p3.music.126.net/34YW1QtKxJ_3YnX9ZzKhzw==/2946691234868155.jpg", // 播放列表封面图像
        creatorName: "",        // 列表创建者名字(暂时没用到,可空)
        creatorAvatar: "",      // 列表创建者头像(暂时没用到,可空)
        item: [                 // 这里面放歌曲
            {
                id: "436514312",  // 音乐ID
                name: "成都",  // 音乐名字
                artist: "赵雷", // 艺术家名字
                album: "成都",    // 专辑名字
                source: "netease",     // 音乐来源
                url_id: "436514312",  // 链接ID
                pic_id: "2946691234868155",  // 封面ID
                lyric_id: "436514312",  // 歌词ID
                pic: "https://p3.music.126.net/34YW1QtKxJ_3YnX9ZzKhzw==/2946691234868155.jpg",    // 专辑图片
                url: ""   // mp3链接(此项建议不填,除非你有该歌曲的比较稳定的外链)
            },
           {
                id: "001JD1SR29d1hS",
                name: "特别的爱给特别的你",
                artist: "伍思凯",
                album: "特别的爱给特别的你",
                source: "tencent",      // 腾讯
                url_id: "001JD1SR29d1hS",
                pic_id: "004DYsvN2QCYcj",
                lyric_id: "001JD1SR29d1hS",
                pic: "https://y.gtimg.cn/music/photo_new/T002R300x300M000004DYsvN2QCYcj.jpg?max_age=2592000",
                url: ""     // 腾讯的外链有效期较短,插入时 url [必须]设置空值,播放时再临时抓取
            }
};

因此,我们需要获取歌单中所有歌曲的信息,然后写入js中,可以使用python爬虫的方式进行获取并更新musicList.js:

import re
import requests
import json

#歌单id
ID = '8178501887'
headers = {"referer": "https://y.qq.com/",
          "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36 Edg/91.0.864.37"}

# json数据
url = f"https://c.y.qq.com/qzone/fcg-bin/fcg_ucc_getcdinfo_byids_cp.fcg?type=1&json=1&utf8=1&onlysong=0&new_format=1&disstid={ID}&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0"
res = requests.get(url, headers=headers).text
res = json.loads(res)

#歌曲信息均在此保存
data = res['cdlist'][0]['songlist']

with open('musicList.js','w',encoding='utf-8') as f:
    f.write('''// 建议修改前先备份一下
// 获取 歌曲的网易云音乐ID 或 网易云歌单ID 的方法:
// 先在 js/player.js 中开启调试模式,然后按 F12 打开浏览器的控制台。播放歌曲或点开歌单即可看到相应信息

var musicList = [
    // 以下三个系统预留列表请勿更改,否则可能导致程序无法正常运行!
    // 预留列表:搜索结果
    {
        name: "搜索结果",   // 播放列表名字
        cover: "",          // 播放列表封面
        creatorName: "",        // 列表创建者名字
        creatorAvatar: "",      // 列表创建者头像
        item: []
    },
    // 预留列表:正在播放
    {
        name: "正在播放",   // 播放列表名字
        cover: "",          // 播放列表封面
        creatorName: "",        // 列表创建者名字
        creatorAvatar: "",      // 列表创建者头像
        item: []
    },
    // 预留列表:播放历史
    {
        name: "播放历史",   // 播放列表名字
        cover: "images/history.png",          // 播放列表封面
        creatorName: "",        // 列表创建者名字
        creatorAvatar: "",      // 列表创建者头像
        item: []
    },  
    // 以上三个系统预留列表请勿更改,否则可能导致程序无法正常运行!
    //*********************************************
    // 自定义列表开始,您可以自由添加您的自定义列表
    // 方式一:手动创建列表并添加歌曲信息
    // 温馨提示:各大音乐平台获取到的外链有效期均较短,因此 url 值应该设置为空,以让程序临时抓取
    {
        name: "巴涅波赫夫的QQ音乐列表",   // 播放列表名字
        cover: "http://halashuo.cn/static/images/943b491dac39419fb3994fe90bdeb864.gif", // 播放列表封面图像
        creatorName: "",        // 列表创建者名字(暂时没用到,可空)
        creatorAvatar: "",      // 列表创建者头像(暂时没用到,可空)
        item: [                 // 这里面放歌曲
''')
    for i in range(len(data)-1):
        f.writelines("        {\n")
        f.writelines(f"            id:\"{data[i]['mid']}\",\n")# 歌曲id
        f.writelines(f"            name:\"{data[i]['name']}\",\n")# 歌名
        f.writelines(f"            artist:\"{data[i]['singer'][0]['name']}\",\n")# 歌手
        f.writelines(f"            album:\"{data[i]['album']['name']}\",\n")# 专辑名
        f.writelines(f"            source: \"tencent\",\n")
        f.writelines(f"            url_id:\"{data[i]['mid']}\",\n")
        f.writelines(f"            pic_id:\"{data[i]['album']['mid']}\",\n")
        f.writelines(f"            lyric_id:\"{data[i]['mid']}\",\n")
        f.writelines(f"            pic:\"https://y.gtimg.cn/music/photo_new/T002R300x300M000{data[i]['album']['mid']}.jpg?max_age=2592000\",\n")
        f.writelines(f"            url: \"\"\n")
        f.writelines("        },\n")
    else:
        i += 1
        f.writelines("        {\n")
        f.writelines(f"            id:\"{data[i]['mid']}\",\n")# 歌曲id
        f.writelines(f"            name:\"{data[i]['name']}\",\n")# 歌名
        f.writelines(f"            artist:\"{data[i]['singer'][0]['name']}\",\n")# 歌手
        f.writelines(f"            album:\"{data[i]['album']['name']}\",\n")# 专辑名
        f.writelines(f"            source: \"tencent\",\n")
        f.writelines(f"            url_id:\"{data[i]['mid']}\",\n")
        f.writelines(f"            pic_id:\"{data[i]['album']['mid']}\",\n")
        f.writelines(f"            lyric_id:\"{data[i]['mid']}\",\n")
        f.writelines(f"            pic:\"https://y.gtimg.cn/music/photo_new/T002R300x300M000{data[i]['album']['mid']}.jpg?max_age=2592000\",\n")
        f.writelines(f"            url: \"\"\n")
        f.writelines("        }// 列表中最后一首歌大括号后面不要加逗号\n")
    f.write('''        ]
    },
    // 方式二:直接提供网易云歌单ID
    {
        id: 2474604826
    },
    {
        id: 4906984848// 网易云歌单ID
    }   // 播放列表的最后一项大括号后面不要加逗号
];''')

主要使用了qq音乐如下接口:

https://c.y.qq.com/qzone/fcg-bin/fcg_ucc_getcdinfo_byids_cp.fcg?type=1&json=1&utf8=1&onlysong=0&new_format=1&disstid={ID信息}&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0

同时注意修改本代码中除歌曲信息外的其他写入信息,如代码第5行的歌单ID、18行的musicList.js文件路径、55行的自定义列表名称、56行的自定义列表头像、90行之后网易云列表ID。

同时可以把该python脚本加入计划任务,使其每天更新一次musicList.js。