吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 20896|回复: 60
收起左侧

[Python 转载] QQ音乐开源API下载收费歌曲

  [复制链接]
zac7 发表于 2019-8-14 22:25
原文借鉴:原文贴



首先这个帖子的代码大不部分是参考@珍珠奶茶丶板牙的,我当时下载的他的源码。
然后用着不是特别方便,就自己改良了一下下,然后又打包成无需环境的exe程序,让我朋友们使用。
然后我再使用的过程中发现一个bug,下载“逍遥叹”歌曲的时候会有bug。
emmm,刚才我又重新试了一遍,BUG又没了,真的是玄学。看的我一脸懵...
大概就是  media_mid = []   这个列表返回的数据,有的格式不是正确,我也没修。
[Python] 纯文本查看 复制代码
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#-*- 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
微信图片_20190814222216.png

免费评分

参与人数 11吾爱币 +9 热心值 +10 收起 理由
许轲扬 + 1 已经失效了~
清炒藕片丶 + 1 + 1 我很赞同!
yz4491835 + 1 + 1 谢谢@Thanks!
masaomi + 1 我很赞同!
YoungJc + 1 + 1 谢谢@Thanks!
一切随缘1995 + 1 + 1 用心讨论,共获提升!
JikyChou + 1 + 1 谢谢@Thanks!
lunaaero + 1 已经处理,感谢您对吾爱破解论坛的支持!
乔生 + 1 + 1 大佬就不能给发个打包好的嘛
珍珠奶茶丶板牙 + 1 + 1 这是我刚学python的时候写的,不是很规范,谢谢你
CWJYBB + 1 + 1 鼓励转贴优秀软件安全工具和文档!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| zac7 发表于 2019-8-15 10:44
不会打包的请看我的另外一个帖子:
将py文件打包成无需环境就可运行的EXE程序
https://www.52pojie.cn/thread-1008688-1-1.html
(出处: 吾爱破解论坛)
98度c 发表于 2019-9-3 14:44
Protoss_krz 发表于 2019-11-21 10:00
本帖最后由 Protoss_krz 于 2019-11-21 10:31 编辑

# -*- coding:utf-8 -*-# author:**Aiden修改**
# datetime:2019/11/21 22::13
# software: PyCharm
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行
BORE 发表于 2019-8-14 22:36
只限QQ音乐平台吗?
iamqlj123 发表于 2019-8-14 22:42
QQ音乐啊,造福群众,善莫大焉!
ppq233 发表于 2019-8-14 22:45
小白,这要怎么用啊?
blueideal 发表于 2019-8-14 22:52
我也是小白,表示不懂得应用。
FleTime 发表于 2019-8-14 22:53
ppq233 发表于 2019-8-14 22:45
小白,这要怎么用啊?

楼主发的是Pyt语言的源码,你可以编译成成品用
头像被屏蔽
qnshw 发表于 2019-8-14 23:01
提示: 作者被禁止或删除 内容自动屏蔽
lunzi000 发表于 2019-8-14 23:05
不知道怎么弄成成品啊
emailsina 发表于 2019-8-14 23:05
douqq_post 这个函数能不能公开看看?
caicai0712 发表于 2019-8-14 23:11
搞不懂还是顶一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-2 01:08

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表