打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
使用Python下载QQ音乐歌曲

有些时候我们需要下载一些音乐文件到本地,比较操蛋是必须要付费,所以写了一个下载器用!!

开发工具

Python版本:3.7相关模块:

requestsreurllibosffmpeg

QQ音乐网站数据请求url

第一个接口需要根据歌曲名构造完整链接来搜索需要下载的歌曲信息;

第二个接口需要根据第一个接口返回的信息来构造完整链接来获取歌曲下载地址的部分信息;

第三个接口即为歌曲下载地址,需要根据前两个接口获取的信息来构造完整链接。

  1. self.searchUrl ='https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.top&searchid=34725291680541638&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w={}&g_tk=5381&jsonpCallback=MusicJsonCallback703296236531272&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0'

  2. self.fcg_url = 'https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?g_tk=5381&jsonpCallback=MusicJsonCallback9239412173137234&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0&cid=205361747&callback=MusicJsonCallback9239412173137234&uin=0&songmid={}&filename={}.m4a&guid=8208467632'

  3. self.downloader_url = 'http://dl.stream.qqmusic.qq.com/{}.m4a?vkey={}&guid=8208467632&uin=0&fromtag=66'

详细代码(内含有完整注释)

  1. import requests

  2. import re

  3. import urllib

  4. import os

  5. #使用pypud 需要依赖库  ffmpeg

  6. from pydub import AudioSegment

  7. class QQDownLoader(object):

  8.    def __init__(self):

  9.        self.headers = {

  10.            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'

  11.        }

  12.        #搜索需要下载的歌曲信息

  13.        self.searchUrl ='https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.top&searchid=34725291680541638&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w={}&g_tk=5381&jsonpCallback=MusicJsonCallback703296236531272&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0'

  14.        self.fcg_url = 'https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?g_tk=5381&jsonpCallback=MusicJsonCallback9239412173137234&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0&cid=205361747&callback=MusicJsonCallback9239412173137234&uin=0&songmid={}&filename={}.m4a&guid=8208467632'

  15.        self.downloader_url = 'http://dl.stream.qqmusic.qq.com/{}.m4a?vkey={}&guid=8208467632&uin=0&fromtag=66'

  16.    def getSingInfo(self,name,num):

  17.        print('正在获取歌曲信息。。。')

  18.        #查询的歌的名字

  19.        singurl = self.searchUrl.format(name)

  20.        singData = requests.get(singurl,headers = self.headers).text

  21.        self.analysisData(singData,num)

  22.    def analysisData(self,res,num):

  23.        # media_mid

  24.        media_mid_temp = re.findall(''media_mid':'(.*?)'', res)

  25.        media_mid = []

  26.        for i in range(len(media_mid_temp)):

  27.            media_mid.append('C400' + media_mid_temp[i])

  28.        # songmid

  29.        songmid = re.findall(''lyric_hilight':'.*?','mid':'(.*?)','mv'', res)

  30.        # singer

  31.        singer_temp = re.findall(''singer':\[.*?\]', res)

  32.        singer = []

  33.        for s in singer_temp:

  34.            singer.append(re.findall(''name':'(.*?)'', s)[0])

  35.        # songname

  36.        songname = re.findall('},'name':'(.*?)','newStatus'', res)

  37.        # print(media_mid)

  38.        # print(songmid)

  39.        # print(singer)

  40.        # print(songname)

  41.        self.getDownloaderUrl(media_mid,songmid,singer,songname,num)

  42.    def getDownloaderUrl(self,media_mid,songmid,singer,songname,num):

  43.        urls = []

  44.        songname_keep = []

  45.        singer_keep = []

  46.        for m in range(len(media_mid)):

  47.            try:

  48.                fcg_res = requests.get(self.fcg_url.format(songmid[m], media_mid[m]), headers=self.headers)

  49.                # print(fcg_res.text)

  50.                vkey = re.findall(''vkey':'(.*?)'', fcg_res.text)[0]

  51.                urls.append(self.downloader_url.format(media_mid[m], vkey))

  52.                songname_keep.append(songname[m])

  53.                singer_keep.append(singer[m])

  54.            except:

  55.                print('[Warning]:One song lost...')

  56.            # time.sleep(0.5)

  57.        # print(songname_keep)

  58.        # print(singer_keep)

  59.        self.downloadMp3(urls,songname_keep,singer_keep,num)

  60.    def downloadMp3(self,urls,songname_keep,singer_keep,num=1):

  61.        # print(urls)

  62.        if num > len(urls):

  63.            print('[Warning]:Only find %d songs...' % len(urls))

  64.            num = len(urls)

  65.        if not os.path.exists('./MP3'):

  66.            os.mkdir('./MP3')

  67.        for n in range(num):

  68.            print('正在下载第 %d 第一首歌...' % (n+1))

  69.            filepath = './MP3/{}'.format(songname_keep[n]+'_'+singer_keep[n]+'.m4a')

  70.            urllib.request.urlretrieve(urls[n], filepath)

  71.            self.changeFormate(filepath)

  72.        print('下载完成')

  73.    def changeFormate(self,filepath):

  74.        print('正在转码。。。')

  75.        '''

  76.        mp3与wav格式进行互转

  77.        '''

  78.        # song = AudioSegment.from_mp3(filepath)

  79.        # song.export('now.wav', format='wav')

  80.        # 讲m4a 转成 MP3

  81.        os.system('ffmpeg -i ' + filepath + ' ' + filepath[:filepath.rfind('.')] + '.mp3')

  82.        os.remove(filepath)

  83.    def run(self,name,num):

  84.        self.getSingInfo(name,num)

  85. qq = QQDownLoader()

  86. qq.run('爱你',1)


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
用 Python 制作音乐聚合下载器
教你如何复制别人的QQ空间
获取访客QQ号码
scrapy遇上ajax,抓取QQ音乐周杰伦专辑与歌词(6)
Python分布式爬虫一点也不难!Scrapy MongoDB爬取QQ音乐实战
10秒钟自制出小程序 与任意QQ号聊天-通讯工具-QQ-天极网
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服