爬取最新QQ音乐下载地址分析

爬取最新QQ音乐下载地址分析

以下均以歌名 不要说话 分析

  1. 通过音乐名字搜索

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    'qq'                 => [
    'method' => 'GET',
    'url' => 'http://c.y.qq.com/soso/fcgi-bin/client_search_cp',
    'referer' => 'http://m.y.qq.com',
    'proxy' => false,
    'body' => [
    'w' => $query,
    'p' => $page,
    'n' => 10,
    'format' => 'json'
    ],
    'user-agent' => 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'
    ]

    即组成 http://c.y.qq.com/soso/fcgi-bin/client_search_cp?w=不要说话&p=1&n=10&format=json 通过定义的useragent通过Get取得的内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    {
    "code":0,
    "data":{
    "keyword":"不要说话",
    "priority":0,
    "qc":[

    ],
    "semantic":{
    "curnum":0,
    "curpage":1,
    "list":[

    ],
    "totalnum":0
    },
    "song":{
    "curnum":10,
    "curpage":1,
    "list":[
    {
    "albumid":35182,
    "albummid":"000J1pJ50cDCVE",
    "albumname":"不想放手",
    "albumname_hilight":"不想放手",
    "alertid":23,
    "belongCD":0,
    "cdIdx":7,
    "chinesesinger":0,
    "docid":"14691017891116423173",
    "grp":[

    ],
    "interval":285,
    "isonly":0,
    "lyric":"《时尚先生》电影主题曲",
    "lyric_hilight":"《时尚先生》电影主题曲",
    "media_mid":"004cc3OU0GLJHb",
    "msgid":16,
    "newStatus":2,
    "nt":1413023447,
    "pay":{
    "payalbum":0,
    "payalbumprice":0,
    "paydownload":1,
    "payinfo":1,
    "payplay":0,
    "paytrackmouth":1,
    "paytrackprice":200
    },
    "preview":{
    "trybegin":74064,
    "tryend":102207,
    "trysize":960887
    },
    "pubtime":1214755200,
    "pure":0,
    "singer":[
    {
    "id":143,
    "mid":"003Nz2So3XXYek",
    "name":"陈奕迅",
    "name_hilight":"陈奕迅"
    }
    ],
    "size128":4566820,
    "size320":11416753,
    "sizeape":0,
    "sizeflac":30255204,
    "sizeogg":6051718,
    "songid":9059607,
    "songmid":"002B2EAA3brD5b",
    "songname":"不要说话",
    "songname_hilight":"<em>不要说话</em>",
    "strMediaMid":"004cc3OU0GLJHb",
    "stream":1,
    "switch":16888579,
    "t":1,
    "tag":11,
    "type":0,
    "ver":0,
    "vid":"e0011thbfzs"
    }
    ],
    "totalnum":600
    },
    "tab":0,
    "taglist":[

    ],
    "totaltime":0,
    "zhida":{
    "chinesesinger":0,
    "type":0
    }
    },
    "message":"",
    "notice":"",
    "subcode":0,
    "time":1632975151,
    "tips":""
    }

    通过返回的json可以取得歌曲的songmid为 002B2EAA3brD5b

  2. 通过歌曲的songmid取得音频信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    'qq'                => [
    'method' => 'GET',
    'url' => 'http://c.y.qq.com/v8/fcg-bin/fcg_play_single_song.fcg',
    'referer' => 'http://m.y.qq.com',
    'proxy' => false,
    'body' => [
    'songmid' => $songid,
    'format' => 'json'
    ],
    'user-agent' => 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'
    ]

    即通过 http://c.y.qq.com/v8/fcg-bin/fcg_play_single_song.fcg?songmid=002B2EAA3brD5b&format=json 和自定义的头,返回的json如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    {
    "code":0,
    "data":[
    {
    "action":{
    "alert":21,
    "icons":8535932,
    "msgdown":0,
    "msgfav":0,
    "msgid":14,
    "msgpay":6,
    "msgshare":0,
    "switch":16888579
    },
    "aid":0,
    "album":{
    "id":35182,
    "mid":"000J1pJ50cDCVE",
    "name":"不想放手",
    "pmid":"000J1pJ50cDCVE_3",
    "subtitle":"《时尚先生》电影主题曲",
    "time_public":"2008-06-30",
    "title":"不想放手"
    },
    "bpm":66,
    "data_type":0,
    "es":"",
    "file":{
    "b_30s":0,
    "e_30s":60000,
    "hires_bitdepth":0,
    "hires_sample":0,
    "media_mid":"004cc3OU0GLJHb",
    "size_128mp3":4566820,
    "size_192aac":6893143,
    "size_192ogg":6051718,
    "size_24aac":0,
    "size_320mp3":11416753,
    "size_48aac":1733017,
    "size_96aac":3476533,
    "size_96ogg":3079411,
    "size_ape":0,
    "size_dts":0,
    "size_flac":30255204,
    "size_hires":0,
    "size_try":960887,
    "try_begin":74064,
    "try_end":102207,
    "url":""
    },
    "fnote":4009,
    "genre":1,
    "id":9059607,
    "index_album":7,
    "index_cd":0,
    "interval":285,
    "isonly":0,
    "ksong":{
    "id":4841,
    "mid":"000A57lN1qgVTQ"
    },
    "label":"0",
    "language":0,
    "mid":"002B2EAA3brD5b",
    "modify_stamp":0,
    "mv":{
    "id":173498,
    "name":"",
    "title":"",
    "vid":"e0011thbfzs",
    "vt":0
    },
    "name":"不要说话",
    "ov":0,
    "pay":{
    "pay_down":1,
    "pay_month":1,
    "pay_play":0,
    "pay_status":0,
    "price_album":0,
    "price_track":200,
    "time_free":0
    },
    "sa":0,
    "singer":[
    {
    "id":143,
    "mid":"003Nz2So3XXYek",
    "name":"陈奕迅",
    "pmid":"",
    "title":"陈奕迅",
    "type":0,
    "uin":0
    }
    ],
    "status":0,
    "subtitle":"《时尚先生》电影主题曲",
    "tid":0,
    "time_public":"2008-06-30",
    "title":"不要说话",
    "trace":"",
    "type":0,
    "url":"",
    "version":0,
    "volume":{
    "gain":-8.178000000000001,
    "lra":9.406000000000001,
    "peak":1
    }
    }
    ],
    "url":{
    "9059607":"ws.stream.qqmusic.qq.com/C100002B2EAA3brD5b.m4a?fromtag=38"
    },
    "url1":{

    },
    "extra_data":[

    ],
    "joox":0,
    "joox_login":1,
    "msgid":0
    }
  3. 通过登录QQ取得guid和uin进而取得vkey
    QQ音乐的地址如下:
    dl.stream.qqmusic.qq.com/C400000QCwge3B6Ad1.m4a?vkey=
    6FBECDE68E94D9E5B1F6731C5A8D83AE2DE961466D2CF64694D86F94590B3E27592575D38322394478AFC921DA703B6805A4278DE54344F1&GUID=
    1849502645&UIN=1000&fromtag=66
    其实就是:
    dl.stream.qqmusic.qq.com/C400$songmid.m4a?vkey=$vkey的值&guid=$guid值&uin=$uin&fromtag=66

guid需要QQ登录后才能取得,uin就是你登录的QQ号,经测试guid和qq号可以任意输出,而不需要登录,仅客户端的VIP歌曲无效
根据guid和uin通过https://u.y.qq.com/cgi-bin/musicu.fcg取得vkey,取得过程可以看下面的python代码

python代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import requests
import json

class QQmusic:
def __init__(self):
self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'}
self.sl = []
self.musicList = []

# 获取页面
def getPage(self,url,headers):
res = requests.get(url,headers = headers)
res.encoding = 'utf-8'
return res

# 获取音乐songmid
def getSongmid(self):
num = int(input('请输入获取条数:'))
# num = 20
#name = input('请输入歌名或歌手:')
name = '张学友'
url = 'http://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=%d&w=%s'%(num,name)
# 搜索音乐
res = self.getPage(url,headers=self.headers)
print(res.text)
html = res.text
html = html[9:]
html = html[:-1]
# 获取songmid
js = json.loads(html)
songlist = js['data']['song']['list']
for song in songlist:
print(song)
songmid = song['songmid']
name = song['songname']
self.sl.append((name,songmid))
print('获取成功songmid')


# 获取音乐资源,guid是登录后才能获取,nin也是
def getVkey(self):
guid = 7347620869 #guid = input('请输入guid:') #经过测试不用登录也能获取vkey,但限制仅能客户端播放的除外
uin = 0 #input('请输入uin:')
for s in self.sl:
print('开始获取资源')
# 获取vkey,purl
name = s[0]
songmid = s[1]
keyUrl = 'http://u.y.qq.com/cgi-bin/musicu.fcg?&data={"req":{"param":{"guid":"%s"}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"%s","songmid":["%s"],"uin":"%s"}},"comm":{"uin":%s}}'%(guid,guid,songmid,uin,uin)
res = self.getPage(keyUrl,headers=self.headers)
print(res.text)
html = res.text
keyjs = json.loads(html)
purl = keyjs['req_0']['data']['midurlinfo'][0]['purl']
if len(purl)==0 : #仅限客户端播放的音乐purl会为空
continue
# 拼凑资源url
url = 'http://dl.stream.qqmusic.qq.com/' + purl
self.musicList.append((name,url))
print('资源地址获取成功')

# 下载音乐
def downloadMusic(self):
for m in self.musicList:
url = m[1]
res = self.getPage(url,headers=self.headers)
music = res.content
name = m[0] + '.mp3'
with open(name, 'wb') as f:
f.write(music)
print('下载OK')
f.closed

QQ = QQmusic()
QQ.getSongmid()
QQ.getVkey()
QQ.downloadMusic()

爬取QQ音乐

-------------本文已结束赏个小钱吧-------------
×

感谢您的支持,我们会一直保持!

扫码支持
请土豪扫码随意打赏

打开微信扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

64.7K

相关文章推荐