页面加载中
博客快捷键
按住 Shift 键查看可用快捷键
ShiftK
开启/关闭快捷键功能
ShiftA
打开/关闭中控台
ShiftD
深色/浅色显示模式
ShiftS
站内搜索
ShiftR
随机访问
ShiftH
返回首页
ShiftL
友链页面
ShiftP
关于本站
ShiftI
原版/本站右键菜单
松开 Shift 键或点击外部区域关闭
互动
最近评论
暂无评论
标签
寻找感兴趣的领域
暂无标签
    0
    文章
    0
    标签
    8
    分类
    10
    评论
    128
    功能
    深色模式
    标签
    JavaScript12TypeScript8React15Next.js6Vue10Node.js7CSS5前端20
    互动
    最近评论
    暂无评论
    标签
    寻找感兴趣的领域
    暂无标签
      0
      文章
      0
      标签
      8
      分类
      10
      评论
      128
      功能
      深色模式
      标签
      JavaScript12TypeScript8React15Next.js6Vue10Node.js7CSS5前端20
      随便逛逛
      博客分类
      文章标签
      复制地址
      深色模式
      AnHeYuAnHeYu
      Search⌘K
      博客
        暂无其他文档

        meting音乐api的仿造

        使用nginx仿造一个meting-api接口以供个人主页和博客调用

        October 22, 20259 分钟 阅读62 次阅读

        观前提醒

        请务必做好网站防护,避免被刷流量


        作用/意义

        由于meting-api是调用网易云的接口,所以需要vip的歌曲需要一个有vip的账号cookie才能完整解析,本着能白嫖绝不花钱的原则,我制作了一个python脚本将已经离线的歌曲文件伪造成meting-api用nginx返回

        这样不仅可以避免每个月多一笔开销,还能避免自己喜欢的歌曲失效


        效果演示

        使用效果取决于你的服务器,与音乐平台无关了

        物品/软件准备

        1. 服务器一台
        2. nginx(默认已经配置好域名,证书等)
        3. 音乐资源(带独立/嵌入的歌曲封面/歌词)
        4. python (可选docker内运行)
        5. ffmpeg二进制文件

        配置过程

        分析meting-api返回结果

        在访问meting-api的url如http://127.0.0.1/?server=netease&type=playlist&id=9379831714返回的结果(仅展示部分)

        json
        [
            {
                "name": "经过",
                "artist": "张杰/HOYO-MiX",
                "url": "http://127.0.0.1/?server=netease&type=url&id=2631333977",
                "pic": "http://127.0.0.1/?server=netease&type=pic&id=109951170000135696",
                "lrc": "http://127.0.0.1/?server=netease&type=lrc&id=2631333977"
            },
            {
                "name": "Myself & I",
                "artist": "TheFatRat/RIELL",
                "url": "http://127.0.0.1/?server=netease&type=url&id=2140097072",
                "pic": "http://127.0.0.1/?server=netease&type=pic&id=109951169448554402",
                "lrc": "http://127.0.0.1/?server=netease&type=lrc&id=2140097072"
            }
        ]

        其中的链接是跳转到音乐平台的资源的,这里可以直接换成自己的

        所以我们只需要拿到 歌手 歌名 歌曲资源链接 歌曲封面资源链接 歌词资源链接这几个东西再写进一个json即可,这些东西都是静态的,所以可以用nginx搞定


        配置nginx文件服务器

        1. 新建一个nginx可以访问的 /res/music文件夹以存放音乐相关资源文件
        nginx
        └─ res
           └─ music
              ├─ flac.json
              ├─ mp3.json
              └─ input
                 ├─ 歌手 - 歌名1.flac
                 ├─ 歌手 - 歌名1.lrc
                 ├─ 歌手 - 歌名2.lrc
                 └─ 歌手 - 歌名2.mp3
        1. 新建一个res.conf文件并在nginx.conf引入
        nginx
        server {
            listen [::]:443 ssl;
            listen 443 ssl;
            listen [::]:80;
            listen 80;
            ssl_certificate /cert/A/fullchain.cer;
            ssl_certificate_key /cert/A/key.key;
            server_name res.your-domain.com;
            root /res;
            location / {
                add_header Access-Control-Allow-Origin *;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
                # autoindex on;                         # 启用自动首页功能
                # autoindex_format html;                # 首页格式为HTML
                autoindex_exact_size off;             # 文件大小自动换算
                autoindex_localtime on;               # 按照服务器时间显示文件时间
                default_type application/octet-stream;# 将当前目录中所有文件的默认MIME类型设置为application/octet-stream
                if ($request_filename ~* ^.*?\.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx)$){# 当文件格式为上述格式时,将头字段属性Content-Disposition的值设置为"attachment"
                    add_header Content-Disposition: 'attachment;'; 
                }
                sendfile on;                          # 开启零复制文件传输功能
                sendfile_max_chunk 1m;                # 每个sendfile调用的最大传输量为1MB
                tcp_nopush on;                        # 启用最小传输限制功能
        #       aio on;                               # 启用异步传输
                directio 5m;                          # 当文件大于5MB时以直接读取磁盘的方式读取文件
                directio_alignment 4096;              # 与磁盘的文件系统对齐
                output_buffers 4 32k;                 # 文件输出的缓冲区大小为128KB
        #       limit_rate 1m;                        # 限制下载速度为1MB
        #       limit_rate_after 2m;                  # 当客户端下载速度达到2MB时进入限速模式
                max_ranges 4096;                      # 客户端执行范围读取的最大值是4096B
                send_timeout 20s;                     # 客户端引发传输超时时间为20s
                postpone_output 2048;                 # 当缓冲区的数据达到2048B时再向客户端发送
                chunked_transfer_encoding on;         # 启用分块传输标识
            }
        }
        1. 检查nginx配置文件语法是否正确,如果正确则热重启以让上面的配置生效
        bash
        nginx -t
        nginx -s reload

        配置python脚本

        下载ffmpeg的二进制文件,放在/ffmpegh以供调用

        在其他地方新建一个main.py并用python运行

        python
        import os
        import json
        import subprocess
        
        input_dir = '/res/music/input'
        pic_dir = '/res/music/pic'
        mp3_dir = '/res/music/output/mp3'
        flac_dir = '/res/music/output/flac'
        lrc_dir = '/res/music/lrc'
        mp3_json = '/res/music/mp3.json'
        mp3_json_file = '/res/music/mp3'
        flac_json = '/res/music/flac.json'
        flac_json_file = '/res/music/flac'
        res_url= "https://res.your-domain.com/music/"
        
        #已有mp3时是否跳过重复压缩
        pass_recompression=True
        
        #已有文件时是否跳过重复强制复制
        pass_recopy=True
        
        #已有文件时是否跳过重复强制生成图片
        pass_repic=True
        
        # 创建输出目录
        os.makedirs(pic_dir, exist_ok=True)
        os.makedirs(mp3_dir, exist_ok=True)
        os.makedirs(flac_dir, exist_ok=True)
        os.makedirs(lrc_dir, exist_ok=True)
        
        # 初始化JSON数据
        m4a_data = []
        mp3_data = []
        flac_data = []
        
        # 遍历输入目录中的FLAC文件
        print("开始处理flac文件")
        i=1
        files=int(len(os.listdir(input_dir))/2-1)
        for filename in os.listdir(input_dir):
            if filename.endswith('.flac'):
                file_path = os.path.join(input_dir, filename)
                base_name = os.path.splitext(filename)[0]
                print(f"正在读取:{base_name}.flac  总进度:{i}/{files}")
                title = base_name.split(' - ',1)[1]
                author= base_name.split(' - ',1)[0]
        
                # 提取图片
                pic_path = os.path.join(pic_dir, f'{base_name}.jpg')
                if os.path.exists(pic_path) and pass_repic:
                    print("图片已存在,跳过提取")
                else:
                    try:
                        # subprocess.run(['/ffmpeg/ffmpeg', '-i', file_path, '-an', '-vcodec', 'copy', pic_path])
                        result = subprocess.run(['/ffmpeg/ffmpeg', '-i', file_path, '-an', '-vcodec', 'copy', '-y', pic_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
                    except Exception as e:
                        print(f"{base_name}.flac : 图片提取失败")
                        print(e)
                    else:
                        print(f"{base_name}.flac : 图片提取成功")
        
                # 复制flac
                flac_path = os.path.join(input_dir, f'{base_name}.flac')
                if os.path.exists(flac_path) and pass_recopy:
                    print("文件已存在,跳过复制")
                else:
                    try:
                        # subprocess.run(['/ffmpeg/ffmpeg', '-i', file_path, '-c:a', 'flac', flac_path]) # 压缩音质并转换为FLAC
                        os.system(f'cp -f "{flac_path}" "{flac_dir}"')
                    except Exception as e:
                        print(f"{base_name}.flac : 音乐复制失败")
                        print(e)
                    else:
                        print(f"{base_name}.flac : 音乐复制成功")
                
                #复制歌词
                lrc_path = os.path.join(input_dir, f'{base_name}.lrc')
                if os.path.exists(lrc_path) and pass_recopy:
                    print("文件已存在,跳过复制")
                else:
                    try:
                        os.system(f'cp -f "{lrc_path}" "{lrc_dir}"')
                    except Exception as e:
                        print(f"{base_name}.lrc : 歌词复制失败")
                        print(e)
                    else:
                        print(f"{base_name}.flac : 歌词复制成功")
        
                # 压缩音质并转换为MP3
                mp3_path = os.path.join(mp3_dir, f'{base_name}.mp3')
                if os.path.exists(mp3_path) and pass_recompression:
                    print("文件已存在,跳过压缩")
                else:
                    print("开始压缩音质,请耐心等待")
                    try:
                        # subprocess.run(['/ffmpeg/ffmpeg', '-i', file_path, '-q:a', '0',"-y", mp3_path])
                        result = subprocess.run(['/ffmpeg/ffmpeg', '-i', file_path, '-q:a', '0',"-y", mp3_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
                    except Exception as e:
                        print(f"{base_name}.flac : 音质压缩失败")
                        print(e)
                    else:
                        print(f"{base_name}.flac : 音质压缩成功")
        
                path_to_pic = res_url+f"pic/{base_name}.jpg"
                path_to_mp3 = res_url+f"output/mp3/{base_name}.mp3"
                path_to_flac = res_url+f"output/flac/{base_name}.flac"
                path_to_lrc = res_url+f"lrc/{base_name}.lrc"
        
                # 添加到JSON数据
                mp3_data.append({
                    'title': title,
                    'author': author,
                    'pic': path_to_pic,
                    'url': path_to_mp3,
                    'lrc': path_to_lrc
                })
                flac_data.append({
                    'title': title,
                    'author': author,
                    'pic': path_to_pic,
                    'url': path_to_flac,
                    'lrc': path_to_lrc
                })
                print("写入json数据ing")
                print("-"*30)
                i+=1
        print("\nflac sucess\n")
        
        
        # 遍历输入目录中的MP3文件
        print("开始处理mp3文件")
        for filename in os.listdir(input_dir):
            if filename.endswith('.mp3'):
                file_path = os.path.join(input_dir, filename)
                base_name = os.path.splitext(filename)[0]
                print(f"正在读取:{base_name}.mp3  总进度:{i}/{files}")
                title = base_name.split(' - ',1)[1]
                author= base_name.split(' - ',1)[0]
        
                # 提取图片
                pic_path = os.path.join(pic_dir, f'{base_name}.jpg')
                if os.path.exists(pic_path) and pass_repic:
                    print("图片已存在,跳过提取")
                else:
                    try:
                        # subprocess.run(['/ffmpeg/ffmpeg', '-i', file_path, '-an', '-vcodec', 'copy', pic_path])
                        result = subprocess.run(['/ffmpeg/ffmpeg', '-i', file_path, '-an', '-vcodec', 'copy', '-y', pic_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
                    except Exception as e:
                        print(f"{base_name}.mp3 : 图片提取失败")
                        print(e)
                    else:
                        print(f"{base_name}.mp3 : 图片提取成功")
                
        
                # 复制mp3
                mp3_path = os.path.join(input_dir, f'{base_name}.mp3')
                if os.path.exists(mp3_path) and pass_recopy:
                    print("文件已存在,跳过压缩")
                else:
                    try:
                        os.system(f'cp -f "{mp3_path}" "{mp3_dir}"')
                    except Exception as e:
                        print(f"{base_name}.mp3 : 音乐复制失败")
                        print(e)
                    else:
                        print(f"{base_name}.mp3 : 音乐复制成功")
                
                #复制歌词
                lrc_path = os.path.join(input_dir, f'{base_name}.lrc')
                if os.path.exists(lrc_path) and pass_recopy:
                    print("文件已存在,跳过压缩")
                else:
                    try:
                        os.system(f'cp -f "{lrc_path}" "{lrc_dir}"')
                    except Exception as e:
                        print(f"{base_name}.lrc : 歌词复制失败")
                        print(e)
                    else:
                        print(f"{base_name}.lrc : 歌词复制成功")
        
                path_to_pic = res_url+f"pic/{base_name}.jpg"
                path_to_mp3 = res_url+f"output/mp3/{base_name}.mp3"
                path_to_lrc = res_url+f"lrc/{base_name}.lrc"
        
                # 添加到JSON数据
                mp3_data.append({
                    'title': title,
                    'author': author,
                    'pic': path_to_pic,
                    'url': path_to_mp3,
                    'lrc': path_to_lrc
                })
                print("写入json数据ing")
                print("-"*30)
                i+=1
        print("\nmp3 sucess\n")
        
        
        print("写入JSON文件")
        with open(mp3_json_file, 'w') as f:
            json.dump(mp3_data, f, indent=4)
        with open(mp3_json, 'w') as f:
            json.dump(mp3_data, f, indent=4)
        with open(flac_json_file, 'w') as f:
            json.dump(flac_data, f, indent=4)
        with open(flac_json, 'w') as f:
            json.dump(flac_data, f, indent=4)
        
        print("write sucess")

        Docker化

        根据自己情况修改
        dockerfile:

        dockerfile
        yaml

        根据自己情况修改

        dockerfile
        yaml

        在博客中使用此接口

        flac音质: https://res.your-domain.com/music/flac

        mp3音质: https://res.your-domain.com/music/mp3

        最后更新于 October 22, 2025
        On this page
        暂无目录