基于Python与第三方API实现音乐下载工具

听雨眠
听雨眠
发布时间:2026-10-12 | 2人浏览过
原创

本文介绍如何使用Python编写一个简易的音乐下载器。通过调用第三方提供的音乐搜索接口,利用requests库发送POST请求获取歌曲元数据及下载地址,并进一步下载音频文件至本地。文章涵盖了从接口分析、代码实现到功能扩展的思路,适合初学者参考学习网络请求与文件处理的基本操作。

前言

在一个深夜,整理文件夹时发现了以往编写的许多看似无实际用途的代码。由此产生了一个念头:既然生活已显平淡,不妨再增添一些“无聊”的乐趣。于是决定开启一个名为“kimol君的无聊小发明”的专题系列。

直接切入正题,本文旨在使用Python开发一个名为MusicLover的音乐下载工具,具体效果如下图所示:

看到这里,读者可能会联想到复杂的JS逆向工程或繁琐的参数分析,这些通常是初学者面临的难题。

但本文并不采用上述复杂方式(内心独白:“没想到吧?”)。该方法对初学者非常友好,且功能依然强大。接下来请继续阅读。

一、技术实现

1.站在巨人的肩膀上

为了避免进行繁琐的接口分析和破解工作,我没有直接针对某云音乐或某Q音乐进行逆向开发。通过网络搜索,我找到了一个现有的支持多平台音乐下载的网站。经测试,该网站确实支持多个音乐平台的歌曲下载。因此,我决定基于该网站提供的接口进行二次开发,正所谓“前人栽树,后人乘凉”,这显然是一个高效的选择。

2.基于接口的二次开发

通过浏览器开发者工具(按F12)进行网络抓包分析,可以得知该接口请求方式为POST,且仅包含4个参数:

利用Python的requests库即可轻松实现该请求。

# 定义相关参数
url = 'https://music.sonimei.cn' # 下载接口
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0',
      'Accept':'application/json, text/javascript, */*; q=0.01',
      'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
      'Accept-Encoding':'gzip, deflate, br',
      'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
      'X-Requested-With':'XMLHttpRequest',
      'Content-Length':'53',
      'Connection':'keep-alive'} # 请求头
data = {'input':'林俊杰',
    'filter':'name',
    'type':'qq',
    'page':1} # 请求参数
res = requests.post(url,headers=headers,data=data)

接口返回的数据格式为JSON,其中包含了歌曲名称、演唱者以及最终的音频下载地址等信息。获取到下载地址后,只需将其下载至本地即可:

with open('test.m4a','wb') as f:
  res = requests.get('http://dl.stream.qqmusic.qq.com/C1000045NGM43ZAUXG.m4a?fromtag=38')
  f.write(res.content)

至此,核心功能已实现。我们基于现有接口完成了“后来者居上”的效果,接下来只需对代码进行封装和集成即可。

3.完整代码封装

封装方式多种多样,此处提供我的实现思路,仅供参考,完整代码如下:

# =============================================================================
# MusicLover by kimol
# =============================================================================
import os
import requests
from tqdm import tqdm

# 定义相关参数
url = 'https://music.sonimei.cn' # 下载接口
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0',
      'Accept':'application/json, text/javascript, */*; q=0.01',
      'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
      'Accept-Encoding':'gzip, deflate, br',
      'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
      'X-Requested-With':'XMLHttpRequest',
      'Content-Length':'53',
      'Connection':'keep-alive'} # 请求头
data = {'input':'',
    'filter':'name',
    'type':'qq',
    'page':1} # 请求参数
savePath = './musics' # 音乐保存目录

# 检查存储路径是否存在
if not os.path.exists(savePath):
  os.mkdir(savePath)

# 欢迎界面
welcome = '''

        __ ___      _   __            
        / |/ /_ _______(_)____/ /  ____ _  _____ _____
       / /|_/ / / / / ___/ / ___/ /  / __ \ | / / _ \/ ___/
       / / / / /_/ (__ ) / /__/ /___/ /_/ / |/ / __/ /  
      /_/ /_/\__,_/____/_/\___/_____/\____/|___/\___/_/   
                                

     '''
os.system('cls')
os.system('mode con cols=85 lines=25')
print(welcome)
# 循环开始
while True:
  choice = input('>>>请输入歌名(或歌手):')
  if choice == 'quit':
    print('欢迎再次使用~')
    break
  data['input'] = choice
  res = requests.post(url,headers=headers,data=data)
  d_json = res.json() # 搜索结果
  musics = d_json['data']
  if d_json['code'] != 200:
    print('搜索结果为空,请重新输入')
    continue
  else:
    print('*'*45)
    print('{0:{3}<4}{1:{3}<10}{2:{3}^10}{3}'.format('序号','歌名','作者',chr(12288)))
    print('*'*45)
    N = 1 # 序号
    for m in musics:
      print('{0:{3}<4}{1:{3}<10}{2:{3}^10}{3}'.format(N,m['title'],m['author'],chr(12288)))
      N += 1
    print('*'*45)
    choice = input('>>>请选择需要下载的歌曲:')
    n = int(choice)
    name = musics[n-1]['title'] # 歌名
    url_download = musics[n-1]['url'] # 下载地址
    bar = tqdm(range(1),ncols=60) # 进度条
    for b in bar:
      res = requests.get(url_download)
      with open('%s/%s.m4a'%(savePath,name),'wb') as f:
        f.write(res.content)
      bar.set_description('下载中')
    

经测试,下载功能运行正常:

二、后续改进方向

显然,上述代码仅为基础Demo,仍有诸多优化空间,例如:

  1. 优化界面设计,解决混合文字对齐问题;
  2. 引入多线程机制,以提升下载速度;
  3. 增加图形用户界面(GUI),提升操作便捷性;
  4. 增加多选功能,实现批量一键下载。

可拓展的功能非常多,此处仅作抛砖引玉,欢迎大家发挥想象力进行完善。

以上就是使用Python制作音乐下载器的详细内容,更多关于Python音乐下载器的资料请持续关注本站其他相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表