最近换了耳机,想把QQ音乐歌单里的歌下到电脑上,奈何无损要绿钻,解析虽然能整个歌单解析但是只能一首一首的下载。于是乎,抓了几个qq音乐网页版的api凑活着用。还有挺多优化的地方。
我已将QQ音乐解析写成接口
解析歌曲速度还凑活,歌单中歌曲较多的话速度较慢,后续根据需要会考虑使用多线程进行优化
请求地址: http://api.onecolour.cn/music/链接
请求方式: GET
请求示例: http://api.onecolour.cn/music/https://y.qq.com/n/yqq/song/000W9uty06xVPY.html
返回格式: json
返回示例:
{'code': 1, 'datas': [{'name': '如同悲伤被下载了两次-陈珊妮&林宥嘉', 'link': {'flac': 'http://streamoc.music.tc.qq.com/F000000W9uty06xVPY.flac?guid=9354789579&vkey=B86F2718A37E86192210A8204675CB3F8B7306525A79A684008205B3D33CDCF32922CA5026B0EEB9531AFE33B410999F40F1E0BD7076C9AC&uin=0&fromtag=58', 'ape': 'http://streamoc.music.tc.qq.com/A000000W9uty06xVPY.ape?guid=9354789579&vkey=B86F2718A37E86192210A8204675CB3F8B7306525A79A684008205B3D33CDCF32922CA5026B0EEB9531AFE33B410999F40F1E0BD7076C9AC&uin=0&fromtag=58', '320mp3': 'http://streamoc.music.tc.qq.com/M800000W9uty06xVPY.mp3?guid=9354789579&vkey=B86F2718A37E86192210A8204675CB3F8B7306525A79A684008205B3D33CDCF32922CA5026B0EEB9531AFE33B410999F40F1E0BD7076C9AC&uin=0&fromtag=58', '128mp3': 'http://streamoc.music.tc.qq.com/M500000W9uty06xVPY.mp3?guid=9354789579&vkey=B86F2718A37E86192210A8204675CB3F8B7306525A79A684008205B3D33CDCF32922CA5026B0EEB9531AFE33B410999F40F1E0BD7076C9AC&uin=0&fromtag=58', 'm4a': 'http://streamoc.music.tc.qq.com/C400000W9uty06xVPY.m4a?guid=9354789579&vkey=B86F2718A37E86192210A8204675CB3F8B7306525A79A684008205B3D33CDCF32922CA5026B0EEB9531AFE33B410999F40F1E0BD7076C9AC&uin=0&fromtag=58'}}]}
code == 1,解析成功
code == -1,解析失败
code == -2,传入链接错误
传入链接格式:
单曲链接:https://y.qq.com/n/yqq/song/000W9uty06xVPY.html
专辑链接:https://y.qq.com/n/yqq/album/000ym9e23zZSBL.html
歌单链接:https://y.qq.com/n/yqq/playsquare/3846214337.html 或 https://y.qq.com/n/yqq/playlist/3846214337.html
以下内容部分失效
1.歌单接口
qq音乐的歌单地址有两种
其一.:‘https://y.qq.com/n/yqq/playlist/’+歌单id+'.html'
其二:‘https://y.qq.com/n/yqq/playsquare/’+歌单id+'.html'
两种歌单地址可以相互转换,内容是完全相同的
https://c.y.qq.com/qzone/fcg-bin/fcg_ucc_getcdinfo_byids_cp.fcg?uin=0&format=json&inCharset=utf-8&outCharset=utf-8¬ice=0&platform=h5&needNewCode=1&new_format=1&pic=500&disstid=3719969047&type=1&json=1&utf8=1&onlysong=0&picmid=1&nosign=1&song_begin=0&song_num=1000&_=1537276176570
url参数中暂未验证哪些参数是必须的,其中disstid为歌单id,song_num为请求歌曲数量,经过测试只要数值填大一点就不用考虑歌曲数量的问题了。url最后的参数为unix十三位时间戳。
该接口必须构造请求头否则无法访问。
header = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',
'referer':'https://y.qq.com/portal/playlist.html'
}
接口返回数据示例,其中包含了歌曲mid,歌手,歌曲名,QQ音乐乐库中各种音质文件的大小,等等。
{
'code': 0,
'subcode': 0,
'accessed_plaza_cache': 1,
'accessed_favbase': 1,
'login': 'on**',
'cdnum': 1,
'cdlist': [{
'disstid': '3719969047',
'dirid': 4,
'coveradurl': '',
'dissid': 3719969,
'login': 'on**',
'uin': '7wEPowcl7w4l',
'encrypt_uin': '7wEPowcl7w4l',
'owndir': 0,
'dissname': '月球',
'logo': 'http://p.qpic.cn/music_cover/M9yfGQDpkIiacD2YAY0EbFPHwIO4qRfttIh2C6Zb9ciaIdyGibo1J1DkA/600?n=1',
'pic_mid': '',
'album_pic_mid': '',
'pic_dpi': 500,
'isAd': 0,
'desc': '',
'ctime': 1518242240,
'mtime': 0,
'headurl': 'http://thirdqq.qlogo.cn/g?b=sdk&k=4icib4Oc6f9AzUAb22VLP2KQ&s=140&t=1534384831',
'ifpicurl': '',
'nick': '沐昜灬',
'nickname': '沐昜灬',
'type': 0,
'singerid': 0,
'singermid': '',
'isvip': 0,
'isdj': 0,
'tags': [],
'songnum': 3,
'songids': '1234505,105937539,444607',
'songtypes': '13,13,13',
'disstype': 0,
'dir_pic_url2': '',
'song_update_time': 0,
'song_update_num': 0,
'total_song_num': 3,
'song_begin': 0,
'cur_song_num': 3,
'songlist': [{
'id': 1234505,
'type': 0,
'songtype': 13,
'mid': '001PpG3B0TR4UH',
'name': '月球上的人',
'title': '月球上的人',
'subtitle': '',
'interval': 222,
'isonly': 1,
'language': 1,
'genre': 1,
'index_cd': 1,
'index_album': 19,
'status': 0,
'fnote': 4009,
'url': 'http://stream6.qqmusic.qq.com/13234505.wma',
'time_public': '2008-08-26',
'singer': [{
'id': 143,
'mid': '003Nz2So3XXYek',
'name': '陈奕迅',
'title': '陈奕迅'
}],
'album': {
'id': 35776,
'mid': '000gpcQK4XrHUF',
'name': 'Solidays',
'title': 'Solidays',
'subtitle': ''
},
'mv': {
'id': 173503,
'vid': 'q0011p39o55'
},
'ksong': {
'id': 0,
'mid': '001zoLqq2RrpFM'
},
'file': {
'media_mid': '001PpG3B0TR4UH',
'size_try': 0,
'try_begin': 0,
'try_end': 0,
'size_24aac': 701277,
'size_48aac': 1365567,
'size_96aac': 2556612,
'size_192aac': 4844247,
'size_192ogg': 4543935,
'size_128mp3': 3563740,
'size_320mp3': 8909020,
'size_aac': 1365567,
'size_ogg': 4543935,
'size_128': 3563740,
'size_320': 8909020,
'size_ape': 19537522,
'size_flac': 19749952,
'size_dts': 0
},
'volume': {
'gain': 0.0,
'peak': 0.0,
'lra': 0.0
},
'pay': {
'pay_month': 1,
'price_track': 200,
'price_album': 0,
'pay_play': 0,
'pay_down': 1,
'pay_status': 0,
'time_free': 0
},
'action': {
'switch': 17413891,
'msgid': 14,
'msgpay': 6,
'alert': 100021,
'icons': 147324
}
}, {
'id': 105937539,
'type': 0,
'songtype': 13,
'mid': '0020rxSH2gkIjz',
'name': '月球下的人',
'title': '月球下的人',
'subtitle': '',
'interval': 283,
'isonly': 1,
'language': 1,
'genre': 1,
'index_cd': 0,
'index_album': 5,
'status': 0,
'fnote': 4009,
'url': 'http://stream3.qqmusic.qq.com/117937539.wma',
'time_public': '2016-04-18',
'singer': [{
'id': 3860,
'mid': '001qDxJb18rQ8c',
'name': '李幸倪',
'title': '李幸倪'
}],
'album': {
'id': 1329523,
'mid': '000tbCh12RdPbg',
'name': 'beGin',
'title': 'beGin',
'subtitle': ''
},
'mv': {
'id': 673449,
'vid': 'j0019w7ruug'
},
'ksong': {
'id': 0,
'mid': '001RQrqE1Nkvy2'
},
'file': {
'media_mid': '0020rxSH2gkIjz',
'size_try': 0,
'try_begin': 75048,
'try_end': 115983,
'size_24aac': 899262,
'size_48aac': 1774417,
'size_96aac': 3457827,
'size_192aac': 6533798,
'size_192ogg': 6153735,
'size_128mp3': 4543836,
'size_320mp3': 11359287,
'size_aac': 1774417,
'size_ogg': 6153735,
'size_128': 4543836,
'size_320': 11359287,
'size_ape': 0,
'size_flac': 0,
'size_dts': 0
},
'volume': {
'gain': 0.0,
'peak': 0.0,
'lra': 0.0
},
'pay': {
'pay_month': 1,
'price_track': 200,
'price_album': 0,
'pay_play': 0,
'pay_down': 1,
'pay_status': 0,
'time_free': 0
},
'action': {
'switch': 17413891,
'msgid': 14,
'msgpay': 6,
'alert': 100021,
'icons': 147324
}
}, {
'id': 444607,
'type': 0,
'songtype': 13,
'mid': '004QZYUH0NgqFp',
'name': '捞月亮的人',
'title': '捞月亮的人',
'subtitle': '',
'interval': 219,
'isonly': 1,
'language': 1,
'genre': 1,
'index_cd': 0,
'index_album': 3,
'status': 0,
'fnote': 4009,
'url': 'http://stream2.qqmusic.qq.com/12444607.wma',
'time_public': '2008-09-26',
'singer': [{
'id': 171,
'mid': '000xogLP35ayzS',
'name': '杨千嬅',
'title': '杨千嬅'
}],
'album': {
'id': 36202,
'mid': '002z6Gua0pfTBj',
'name': 'Wonder Miriam',
'title': 'Wonder Miriam',
'subtitle': '《圆缺》粤语版'
},
'mv': {
'id': 0,
'vid': ''
},
'ksong': {
'id': 0,
'mid': '004UuTDn24Fe9y'
},
'file': {
'media_mid': '001zpbA10dTMuK',
'size_try': 0,
'try_begin': 0,
'try_end': 0,
'size_24aac': 682883,
'size_48aac': 1337759,
'size_96aac': 2676559,
'size_192aac': 5322633,
'size_192ogg': 4789270,
'size_128mp3': 3516926,
'size_320mp3': 8791989,
'size_aac': 1337759,
'size_ogg': 4789270,
'size_128': 3516926,
'size_320': 8791989,
'size_ape': 19929377,
'size_flac': 20043239,
'size_dts': 0
},
'volume': {
'gain': 0.0,
'peak': 0.0,
'lra': 0.0
},
'pay': {
'pay_month': 1,
'price_track': 200,
'price_album': 0,
'pay_play': 0,
'pay_down': 1,
'pay_status': 0,
'time_free': 0
},
'action': {
'switch': 17413891,
'msgid': 14,
'msgpay': 6,
'alert': 100002,
'icons': 139132
}
}],
'visitnum': 22,
'cmtnum': 0,
'buynum': 0,
'scoreavage': '0.0',
'scoreusercount': 0
}],
'realcdnum': 1
}
2.专辑接口
https://c.y.qq.com/v8/fcg-bin/fcg_v8_album_info_cp.fcg?albummid=000QXjVc1r7NQO
该接口请求地址中除了albummid是有效参数外,其余都是无效参数,甚至连请求头都不用构造,同样是返回json。
该接口同样返回很多数据,于我而言,只需要最好的音质以及songmid写一个json文件就行了
返回数据示例:
{
'code': 0,
'data': {
'aDate': '2018-09-12',
'albumTips': '',
'color': 2305342,
'company': '北京有此山文化传媒有限公司',
'company_new': {
'brief': '',
'headPic': '',
'id': 96238,
'is_show': 1,
'name': '北京有此山文化传媒有限公司'
},
'cur_song_num': 1,
'desc': '自然固有潮汐\n热烈的、兴奋的,自然是欢欣鼓舞\n质疑的、哀怨的,也得要待到从头\n溯洄从之,道阻且长。也如流淌,也如生活。\n',
'genre': 'Pop 流行',
'id': 4605253,
'lan': '国语',
'list': [{
'albumdesc': '',
'albumid': 4605253,
'albummid': '000QXjVc1r7NQO',
'albumname': '从头',
'alertid': 100002,
'belongCD': 1,
'cdIdx': 0,
'interval': 208,
'isonly': 0,
'label': '0',
'msgid': 14,
'pay': {
'payalbum': 0,
'payalbumprice': 0,
'paydownload': 1,
'payinfo': 1,
'payplay': 0,
'paytrackmouth': 1,
'paytrackprice': 200,
'timefree': 0
},
'preview': {
'trybegin': 0,
'tryend': 0,
'trysize': 0
},
'rate': 23,
'singer': [{
'id': 940748,
'mid': '004WgCsE3KBddt',
'name': '陈粒'
}],
'size128': 3335084,
'size320': 8337429,
'size5_1': 0,
'sizeape': 0,
'sizeflac': 43902080,
'sizeogg': 4461478,
'songid': 217139396,
'songmid': '001hnH5h3NvqKx',
'songname': '从头',
'songorig': '从头',
'songtype': 0,
'strMediaMid': '000lOhOr0ektcd',
'stream': 13,
'switch': 17413891,
'type': 0,
'vid': ''
}],
'mid': '000QXjVc1r7NQO',
'name': '从头',
'radio_anchor': 0,
'singerid': 940748,
'singermblog': None,
'singermid': '004WgCsE3KBddt',
'singername': '陈粒',
'song_begin': 0,
'total': 1,
'total_song_num': 1
},
'message': 'succ',
'subcode': 0
}
3.歌曲接口
暂未去分析接口,接口带的数据太多,调试起来很麻烦。更改ua之后访问
https://i.y.qq.com/v8/playsong.html?songmid=000O4VzT4Md9S8
发现网页中有一个audio标签,包含了歌曲的试听链接,链接中就有歌曲的vkey,对于QQ音乐下载来说,vkey是最为关键的。
标签内容如下:
<audio id="h5audio_media" height="0" width="0"
src="http://dl.stream.qqmusic.qq.com/C400000O4VzT4Md9S8.m4a?guid=8738455084&vkey=CC599E2CA6F330E08889E5DF931A9E67DFAF118AF4B08D0D155ECE7E6C6E0F8E6A3C0D75D4DE45ACB6A46F345515B52ED4C83B37115B6E2D&uin=7465&fromtag=38"
autoplay="" __idm_id__="378182657">
</audio>
能够在网页上试听的音乐能够很方便的获取到vkey,对于不能直接获取到vkey的,目前我正在尝试抓包,希望能发现其他接口
- 下载音乐
有了歌曲的vkey之后,直接构造链接下载即可,audio标签里链接内含的各个参数除了修改fromtag=53之外,将链接中的song参数修改即可
ape地址构造:
“http://dl.stream.qqmusic.qq.com/A000” + songmid + “.ape” + “?vkey=” + vkey + “&guid=” + guid + “&uin=” + uin + “&fromtag=53
flac地址构造:
“http://dl.stream.qqmusic.qq.com/F000” + songmid + “.flac” + “?vkey=” + vkey + “&guid=” + guid + “&uin=” + uin + “&fromtag=53
320kbps mp3地址构造:
“http://dl.stream.qqmusic.qq.com/M800” + songmid + “.mp3” + “?vkey=” + vkey + “&guid=” + guid + “&uin=” + uin + “&fromtag=53
128kbps mp3地址构造:
“http://dl.stream.qqmusic.qq.com/M500” + songmid + “.mp3” + “?vkey=” + vkey + “&guid=” + guid + “&uin=” + uin + “&fromtag=53
网友评论