亲测可用!免费下载QQ音乐大部分资源!
优化后亲测可用!免费下载QQ音乐大部分资源
通知
时间问题 博客园这边暂时停更要下载的去GitHub或者90盘
GitHub项目地址 https://github.com/TotoWang-hhh/music_down
90盘地址应该可以在GitHub找到
注意随时留意评论区
通知被留下时V 3.3已经发布,请更新!
眼看着网上许多下歌的插件用不了了,又不想买VIP,便非常着急。
突然我想到了接口这玩意儿,于是我······

奥我真是个人才!
突然我看见了某人写过的代码,发现部分功能已经失效了,就修复了一下。
版权问题(反正你们也不会看的)
这玩意儿已经被驳回了,被迫加上这些累赘 ······应该不会再有问题了。
原网页没有任何版权保护。
关于音乐,你们最好去支持正版。不然我一拳揍死你
好吧如果这还能有问题我只能CV大法了
本工具只用作个人学习研究,禁止用于商业及非法用途,如产生法律纠纷与本人无关。如果需要保存音乐,请自行去各个网站下载正版。
正在完成的更改
- [x] 修复BUG
- [x] 调整路径
- [x] 脱离黑底白字(可视化界面)
上代码
#-*- coding:utf-8 -*-# author:**ZLH**
# datetime:2019/8/2 16:47
# software: PyCharm
import requests
import json
import easygui
headers = {
'Host': 'c.y.qq.com',
'Referer': 'http://c.y.qq.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 '
'Safari/537.36 '
}
def douqq_post(mid):
"""
返回歌曲下载url
:param mid:歌曲mid
:return: 字典
"""
post_url = 'http://www.douqq.com/qqmusic/qqapi.php'
data = {'mid': mid}
res = requests.post(post_url, data=data)
get_json = json.loads(res.text)
return eval(get_json)
def download_file(src, file_path):
"""
歌曲下载
:param src: 下载链接
:param file_path: 存储路径
:return: 文件路径
"""
r = requests.get(src, stream=True)
f = open(file_path, "wb")
for chunk in r.iter_content(chunk_size=512):
if chunk:
f.write(chunk)
return file_path
def choice_download(dic):
src = dic['m4a']
postfix = '.m4a'
return postfix, src.replace('\/\/', '//').replace('\/', '/')
def find_song(word):
"""
查找歌曲
:param word: 歌曲名
:return: 返回歌曲mid
"""
get_url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n' \
'=20&w=' + word
try:
res1 = requests.get(get_url, headers=headers)
get_json = json.loads(res1.text.strip('callback()[]'))
jsons = get_json['data']['song']['list']
songmid = []
media_mid = []
song_singer = []
i = 1
for song in jsons:
# print(i, ':' + song['songname'], '---', song['singer'][0]['name'], song['songmid'], song['media_mid'])
print(i, ':' + song['songname'], '---', song['singer'][0]['name'])
songmid.append(song['songmid'])
media_mid.append(song['media_mid'])
song_singer.append(song['singer'][0]['name'])
i = i + 1
select = int(input("请输入您的选择:")) - 1
return songmid[select], song_singer[select]
except Exception as e:
print(f'歌曲查找有误:{e}')
return None
if __name__ == '__main__':
# songname = '叹云兮'
while True:
songname = input("请输入音乐名称:")
song_mid, singer = find_song(songname)
dic = douqq_post(song_mid)
# {
# "mid":"004FjJo32TISsY",
# "m4a":"http:\/\/dl.stream.qqmusic.qq.com\/C400004FjJo32TISsY.m4a?guid=2095717240&vkey=0B599CA74745F8A27A33A1FED2C7F6925FFFE8ED040569FB3540EB011FE9C5A3D7F36EAE4BDBD450F25076A23EBAF95A5ECB54B22C5E8F10&uin=0&fromtag=38",
# "mp3_l":"http:\/\/dl.stream.qqmusic.qq.com\/M500004FjJo32TISsY.mp3?guid=2095717240&vkey=0B599CA74745F8A27A33A1FED2C7F6925FFFE8ED040569FB3540EB011FE9C5A3D7F36EAE4BDBD450F25076A23EBAF95A5ECB54B22C5E8F10&uin=0&fromtag=53",
# "mp3_h":media_mid"http:\/\/dl.stream.qqmusic.qq.com\/M800004FjJo32TISsY.mp3?guid=2095717240&vkey=0B599CA74745F8A27A33A1FED2C7F6925FFFE8ED040569FB3540EB011FE9C5A3D7F36EAE4BDBD450F25076A23EBAF95A5ECB54B22C5E8F10&uin=0&fromtag=53",
# "ape":"http:\/\/dl.stream.qqmusic.qq.com\/A000004FjJo32TISsY.ape?guid=2095717240&vkey=0B599CA74745F8A27A33A1FED2C7F6925FFFE8ED040569FB3540EB011FE9C5A3D7F36EAE4BDBD450F25076A23EBAF95A5ECB54B22C5E8F10&uin=0&fromtag=53",
# "flac":"http:\/\/dl.stream.qqmusic.qq.com\/F000004FjJo32TISsY.flac?guid=2095717240&vkey=0B599CA74745F8A27A33A1FED2C7F6925FFFE8ED040569FB3540EB011FE9C5A3D7F36EAE4BDBD450F25076A23EBAF95A5ECB54B22C5E8F10&uin=0&fromtag=53",
# "pic":"https:\/\/y.gtimg.cn\/music\/photo_new\/T002R300x300M000003NZyTh4eMMsp.jpg?max_age=2592000"
# }
# print('mid:'+dic['mid'])
postfix, url = choice_download(dic)
save_path = easygui.filesavebox(title='保存文件')
download_file(url, save_path + postfix)
con = input('是否重启程序以下载另一首音乐: y/n ')
if con == 'n':
break
原版来自吾爱破解论坛,这里修改了一些内容(详见“修改内容”)。
原版链接
修改内容
- 删除失效部分
- 添加路径选择功能(文件路径选择窗口哦!)
- 对部分位置进行汉化
- 添加可视化界面
原网页上也有人修复过
import os
import requests
import json
headers = {
'Host': 'c.y.qq.com',
'Referer': 'http://c.y.qq.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 '
'Safari/537.36 '
}
def douqq_post(mid):
"""
返回歌曲下载url
:param mid:歌曲mid
:return: 字典
"""
post_url = 'http://www.douqq.com/qqmusic/qqapi.php'
data = {'mid': mid}
res = requests.post(post_url, data=data)
get_json = json.loads(res.text)
return eval(get_json)
def download_file(src, file_path):
"""
歌曲下载
:param src: 下载链接
:param file_path: 存储路径
:return: 文件路径
"""
r = requests.get(src, stream=True)
f = open(file_path, "wb")
for chunk in r.iter_content(chunk_size=512):
if chunk:
f.write(chunk)
return file_path
def choice_download(dic):
print('1. m4a视频')
print('2. mp3普通品质')
print('3. mp3高品质')
print('4. ape高品无损')
print('5. flac无损音频')
select = int(input("请选择需要下载的音乐音质:"))
src = ''
postfix = ''
if select == 1:
src = dic['m4a']
postfix = '.m4a'
if select == 2:
src = dic['mp3_l']
postfix = '.mp3'
if select == 3:
src = dic['mp3_h']
postfix = '.mp3'
if select == 4:
src = dic['ape']
postfix = '.ape'
if select == 5:
src = dic['flac']
postfix = '.flac'
return postfix, src.replace('\/\/', '//').replace('\/', '/')
def find_song(word):
"""
查找歌曲
:param word: 歌曲名
:return: 返回歌曲mid
"""
get_url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n' \
'=20&w=' + word
try:
res1 = requests.get(get_url, headers=headers)
get_json = json.loads(res1.text.strip('callback()[]'))
jsons = get_json['data']['song']['list']
songmid = []
media_mid = []
song_singer = []
i = 1
for song in jsons:
# 特殊情况下搜索条件会为空,测试的时候报错了几次跳过即可
if song['albumid'] == 0:
continue
print(i, ':' + song['songname'], '---', song['singer'][0]['name'])
songmid.append(song['songmid'])
media_mid.append(song['media_mid'])
song_singer.append(song['singer'][0]['name'])
i = i + 1
select = int(input("请输入您的选择:")) - 1
return songmid[select], song_singer[select], jsons[select]['albumname']
except Exception as e:
print(f'歌曲查找有误:{e}')
return None
if __name__ == '__main__':
while True:
songname = input("请输入需要下载的音乐的名字:")
song_mid, singer,songname = find_song(songname)
dic = douqq_post(song_mid)
postfix, url = choice_download(dic)
save_path = "D:\\Music\\"
# 判断文件夹是否存在,不存在则创建文件夹
if not os.path.exists(save_path):
# 不存在则创建
os.makedirs(save_path)
download_file(url, save_path + songname + ' - ' + singer + postfix)
print('下载完成啦,自动保存在D盘的Music文件夹下面', end='\n')
print('是否继续下载?: y/n', end='\n')
con = input()
if con == 'n':
print('结束')
break
修复了两个使用的时候出现的BUG,可能还不完善求大佬改良1、修改搜索部分歌名会报错NoneType' object is not iterabl的问题 详情见89行注释2、修复文件夹不存在报错问题,目前解决方法如不存在则自动在D盘路径下创建一个Music文件夹[/mw_shl_code]3、另修改了一下下载后保存文件名为自己输入的名字而不是原本音乐名字的BUG 详情见98行
——Protoss_krz 发表于 2019-11-21 10:00
以上代码会询问下载格式,请选择1(“M4A视频”),放心吧,不是视频,估计是作者敲错了。另外,其他格式下下来听不了。
也欢迎你在评论区贡献完美的代码。
原版代码
#-*- coding:utf-8 -*-# author:**ZLH**
# datetime:2019/8/2 16:47
# software: PyCharm
import requests
import json
headers = {
'Host': 'c.y.qq.com',
'Referer': 'http://c.y.qq.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 '
'Safari/537.36 '
}
def douqq_post(mid):
"""
返回歌曲下载url
:param mid:歌曲mid
:return: 字典
"""
post_url = 'http://www.douqq.com/qqmusic/qqapi.php'
data = {'mid': mid}
res = requests.post(post_url, data=data)
get_json = json.loads(res.text)
return eval(get_json)
def download_file(src, file_path):
"""
歌曲下载
:param src: 下载链接
:param file_path: 存储路径
:return: 文件路径
"""
r = requests.get(src, stream=True)
f = open(file_path, "wb")
for chunk in r.iter_content(chunk_size=512):
if chunk:
f.write(chunk)
return file_path
def choice_download(dic):
print('1. m4a视频')
print('2. mp3普通品质')
print('3. mp3高品质')
print('4. ape高品无损')
print('5. flac无损音频')
select = int(input("请输入您的选择:"))
src = ''
postfix = ''
if select == 1:
src = dic['m4a']
postfix = '.m4a'
if select == 2:
src = dic['mp3_l']
postfix = '.mp3'
if select == 3:
src = dic['mp3_h']
postfix = '.mp3'
if select == 4:
src = dic['ape']
postfix = '.ape'
if select == 5:
src = dic['flac']
postfix = '.flac'
return postfix, src.replace('\/\/', '//').replace('\/', '/')
def find_song(word):
"""
查找歌曲
:param word: 歌曲名
:return: 返回歌曲mid
"""
get_url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n' \
'=20&w=' + word
try:
res1 = requests.get(get_url, headers=headers)
get_json = json.loads(res1.text.strip('callback()[]'))
jsons = get_json['data']['song']['list']
songmid = []
media_mid = []
song_singer = []
i = 1
for song in jsons:
# print(i, ':' + song['songname'], '---', song['singer'][0]['name'], song['songmid'], song['media_mid'])
print(i, ':' + song['songname'], '---', song['singer'][0]['name'])
songmid.append(song['songmid'])
media_mid.append(song['media_mid'])
song_singer.append(song['singer'][0]['name'])
i = i + 1
select = int(input("请输入您的选择:")) - 1
return songmid[select], song_singer[select]
except Exception as e:
print(f'歌曲查找有误:{e}')
return None
if __name__ == '__main__':
# songname = '叹云兮'
while True:
songname = input("Please input the music name:")
song_mid, singer = find_song(songname)
dic = douqq_post(song_mid)
# {
# "mid":"004FjJo32TISsY",
# "m4a":"http:\/\/dl.stream.qqmusic.qq.com\/C400004FjJo32TISsY.m4a?guid=2095717240&vkey=0B599CA74745F8A27A33A1FED2C7F6925FFFE8ED040569FB3540EB011FE9C5A3D7F36EAE4BDBD450F25076A23EBAF95A5ECB54B22C5E8F10&uin=0&fromtag=38",
# "mp3_l":"http:\/\/dl.stream.qqmusic.qq.com\/M500004FjJo32TISsY.mp3?guid=2095717240&vkey=0B599CA74745F8A27A33A1FED2C7F6925FFFE8ED040569FB3540EB011FE9C5A3D7F36EAE4BDBD450F25076A23EBAF95A5ECB54B22C5E8F10&uin=0&fromtag=53",
# "mp3_h":media_mid"http:\/\/dl.stream.qqmusic.qq.com\/M800004FjJo32TISsY.mp3?guid=2095717240&vkey=0B599CA74745F8A27A33A1FED2C7F6925FFFE8ED040569FB3540EB011FE9C5A3D7F36EAE4BDBD450F25076A23EBAF95A5ECB54B22C5E8F10&uin=0&fromtag=53",
# "ape":"http:\/\/dl.stream.qqmusic.qq.com\/A000004FjJo32TISsY.ape?guid=2095717240&vkey=0B599CA74745F8A27A33A1FED2C7F6925FFFE8ED040569FB3540EB011FE9C5A3D7F36EAE4BDBD450F25076A23EBAF95A5ECB54B22C5E8F10&uin=0&fromtag=53",
# "flac":"http:\/\/dl.stream.qqmusic.qq.com\/F000004FjJo32TISsY.flac?guid=2095717240&vkey=0B599CA74745F8A27A33A1FED2C7F6925FFFE8ED040569FB3540EB011FE9C5A3D7F36EAE4BDBD450F25076A23EBAF95A5ECB54B22C5E8F10&uin=0&fromtag=53",
# "pic":"https:\/\/y.gtimg.cn\/music\/photo_new\/T002R300x300M000003NZyTh4eMMsp.jpg?max_age=2592000"
# }
# print('mid:'+dic['mid'])
postfix, url = choice_download(dic)
save_path = "D:\\Music\\"
download_file(url, save_path + songname + ' - ' + singer + postfix)
con = input('Download success or not continue: y/n')
if con == 'n':
break
下载
代码在上面,自己复制,没有EXE,Pyinstaller没法打包,在想办法。
下载链接提供一键安装库功能。请自己下载
诚通网盘
https://n802.com/dir/27256477-39300593-4f1b29
2020/06/02 追
好吧······我竟然才发现:
我参考了吾爱破解论坛的一个帖子,但原文写道
首先这个帖子的代码大不部分是参考@珍珠奶茶丶板牙的,我当时下载的他的源码。
然后用着不是特别方便,就自己改良了一下下,然后又打包成无需环境的exe程序,让我朋友们使用。
原文给了作者参考的文章地址,我进去看了看······发现
下午闲着无聊,看到了@丸子吃枣药丸 他发的文章, API采用QQMusic,我将Python 实现了他的功能,更方便大家下载
我是真的无语了······
亲测可用!免费下载QQ音乐大部分资源!的更多相关文章
- ArcGIS Desktop 10.1+ArcEngine10.1完全破解安装教程(含下载地址+亲测可用!)
最近在二次开发中用到了VS2010+ArcGIS的二次开发模式,因为之前的某些原因,对ArcGIS的接触甚少.初次安装也遇到了很多问题,这里做一个总结. 系统环境 win732位操作系统 需要文件 ( ...
- vmware workstation15.1.0下载地址及密钥(亲测可用)
官网下载链接: https://download3.vmware.com/software/wkst/file/VMware-workstation-full-15.1.0-13591040.exe ...
- github 下载子目录内容 亲测可用!
下载我的LYBTouchID项目的Kit目录内容 (1)在github上点开这个目录,浏览器地址栏可以得到这个地址 https://github.com/Liuyubao/LYBTouchID/tre ...
- 番茄助手 最新 Visual Assist X 适应于VS2019 VS2017 VS2015 VS2013 亲测可用
番茄助手 最新 Visual Assist X 适应于VS2019 VS2017 VS2015 VS2013 亲测可用 如图: 颜色已经改变: 下载说明: /* INSTALLATION 0) Uni ...
- IntelliJ13+tomcat+jrebel实现热部署(亲测可用)
网上有很多介绍intellij idea整合jrebel插件实现热部署的文章,但是有的比较复杂,有的不能成功,最后经过各种尝试,实现了整合,亲测可用!步骤说明如下: 一.先下载jrebel安 ...
- 亲测可用!!!golang如何在idea中保存时自动进行代码格式化
亲测可用,golang在idea中的代码自动格式化 1.ctrl+alt+s打开设置界面,选择[Plugins] -> [Install JetBrains plugin...] -> 搜 ...
- IDEA 使用Mybatis效率飞起来的必备工具:MybatisCodeHelperPro 最新破解版,亲测可用!
IDEA 2018.3.5 最新版本亲测可用. Git地址:https://github.com/pengzhile/MyBatisCodeHelper-Pro-Crack/releases 下载最新 ...
- Windows10安装pycocotools方法,亲测可用!
如果遇到:No module named 'pycocotools' 错误,说明你的环境需要安装pycocotools,以下介绍在Windows10下安装pycocotools的方法,这是本人结合看过 ...
- PS CC 破解安装教程(亲测可用)
PS CC版本新增了一些更高效的切图工具,比如可以直接右击图层转化为PNG图像 下面介绍一种亲测可用的破解安装教程 软件下载地址:https://pan.baidu.com/s/1dFJFqhj 一. ...
随机推荐
- Python利用openpyxl带格式统计数据(2)- 处理mysql数据
上一篇些了openpyxl处理excel数据,再写一篇处理mysql数据的,还是老规矩,贴图,要处理的数据截图: 再贴最终要求的统计格式截图: 第三贴代码: 1 ''' 2 #利用openpyxl向e ...
- CI/CD自动化发版系统设计简介
转载自:https://www.cnblogs.com/wellful/archive/2004/01/13/10604151.html 版本迭代是每一个互联网公司必须经历的,尤其是中小型公司,相信不 ...
- ADF 第七篇:控制流
Azure Data Factory 系列博客: ADF 第一篇:Azure Data Factory介绍 ADF 第二篇:使用UI创建数据工厂 ADF 第三篇:Integration runtime ...
- Java 面向对象概述
本文部分摘自 On Java 8 面向对象编程 在提及面向对象时,不得不提到另一个概念:抽象.编程的最终目的是为了解决某个问题,问题的复杂度直接取决于抽象的类型和质量.早期的汇编语言通过对底层机器作轻 ...
- windows 任何软件出现异常有日志 w3wp.exe [10608]中发生了未处理的Microsoft .Net Framework异常
右键我的电脑 管理
- $emit的用法
自定义事件$emit.使用$emit建立父子组件之间的通信.子组件到父组件之间的通信. 子组件: 父组件:
- Hyperledger fabric-SDK-GO客户端开发篇(六)
Hyperledger fabric-SDK-GO客户端开发篇(六) Fabric-SDK-GO是提供的Go语言开发包,应用程序可以利用Fabric-SDK-GO与fabric网络进行交互并访问链码. ...
- 讲两个int 数组找出重复的数字 用最少的循环
int a[] = {1,3}; int b[] = {1,3,5}; int size = a.length>b.length ?a.length:b.length; int valueA = ...
- Liunx运维(七)-用户管理及用户信息查询命令
文档目录: 一.useradd:创建用户 二.usermod:修改用户信息 三.userdel:删除用户 四.groupadd:创建新的用户组 五.groupdel:删除用户组 六.passwd:修改 ...
- 如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?
这可以使用 DEV 工具来实现.通过这种依赖关系,您可以节省任何更改,嵌入式 tomcat将重新启动.Spring Boot 有一个开发工具(DevTools)模块,它有助于提高开发人员的生产力.Ja ...