ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

提供一个歌曲链接,下载歌曲并获取歌曲三要素

2019-03-07 17:50:39  阅读:346  来源: 互联网

标签:songmid 三要素 callback json html 歌曲 print import 链接


import urllib.request
import time
from pymediainfo import MediaInfo
import json
import re

def DLMusic(url1):
    t = time.time()
    poolname = str(int(round(t * 1000)))#用时间戳来当文件名
    urllib.request.urlretrieve(url1, 'E:\music\\'+poolname+'.m4a')
    print('下载完毕,歌曲名称为:',poolname)
    return poolname

def filemessage(musicname):#输出歌曲文件的绝对路径
    aaa = r'E:\music'
    bbb = aaa +'\\'+musicname+'.m4a'
    print(bbb)
    return bbb

def getmusicMs(musicadd):
    c= musicadd
    media_info = MediaInfo.parse(c)#获取歌曲文件信息
    data = media_info.to_json()#to_json()就是json.dumps()
    content = re.compile('\"tracks\"\: (.*)\}').findall(data)[0]#使用正则表达式掐头去尾
    a = json.loads(content)#再将string类型转换为字典
    print('歌曲名称为:',a[0]['title'])#嵌套字典
    print('专辑名称为:', a[0]['album'])
    print('歌手名称为:', a[0]['performer'])

def test888():
    url666 = r'http://111.202.85.153/amobile.music.tc.qq.com/C400000SF1Sk3QAEG2.m4a?guid=1907614314&vkey=C9A5B9B3F943EBF51EADC036ECA2F07B2C94529E2C5F2AD78FCE177B273889358510CE847E6CF9582D03D25DEFFAD1AF20E9CD5E580552F5&uin=1520&fromtag=66'
    aaa = DLMusic(url666)
    bbb = filemessage(aaa)
    getmusicMs(bbb)


def main():
    test888()

if __name__ == '__main__':
    main()

这个其实有个隐患,只能处理未过期的歌曲链接,如果过期了,就没办法下载了,里面的vkey的来源到现在还不明,下面给出一个处理过期链接的,除了vkey以外别的地方应该都没问题了

from pymediainfo import MediaInfo
import requests
import re
import random
import json

#当歌曲链接失效时
url1 = r'http://111.202.85.153/amobile.music.tc.qq.com/C4000045RzZ24AiYP4.m4a?guid=1907614314&vkey=687316CE4EC22270E35E07471F5C948F32F27B2E424D0585DECA9D14DF519CFFF7FDBFAB738710DEB22E9B3E24EAC3A11292A1C50845F19B&uin=1520&fromtag=66'
#获取歌曲的songmid,0045RzZ24AiYP4
songmid = re.compile('C400(.*)\.m4a').findall(url1)[0]
print ("songmin=",songmid)
#生成callback,貌似是随机数,先当随机数试试
random16 = ""
for i in range(16):
    ch = chr(random.randrange(ord('0'), ord('9') + 1))
    random16 += ch
callback = 'getplaysongvkey'+random16
jsonpCallback = callback
# print('随机数是',random16)

#生成获取信息的url
url2 = r'https://u.y.qq.com/cgi-bin/musicu.fcg?callback='+callback+r'&g_tk=540729270&jsonpCallback='+jsonpCallback+r'&loginUin=953247216&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0&data={"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"1907614314","songmid":["'+songmid+r'"],"songtype":[0],"uin":"953247216","loginflag":1,"platform":"20"}},"comm":{"uin":953247216,"format":"json","ct":24,"cv":0}}'
print('url2=',url2)
#请求url
headers = {
            'referer': 'https://y.qq.com/portal/player.html',
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
        }
params = {
            'callback':callback,
            'g_tk': '540729270',
            'jsonpCallback': jsonpCallback,
            'loginUin': '953247216',
            'hostUin': '0',
            'format': 'jsonp',
            'inCharset': 'utf8',
            'outCharset': 'utf-8',
            'notice': '0',
            'platform': 'yqq',
            'needNewCode': '0',
            'data':'{"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"1907614314","songmid":["'+songmid+r'"],"songtype":[0],"uin":"953247216","loginflag":1,"platform":"20"}},"comm":{"uin":953247216,"format":"json","ct":24,"cv":0}}'
        }
html = requests.get(url2,headers=headers,params=params).text
html = re.compile('getplaysongvkey'+random16+'\((.*?)\)').findall(html)[0]
html = json.loads(html)
a=html['req_0']
b=a['data']
c=b['testfile2g']
print('c=',c)
#新的歌曲链接为
url3=re.compile('(.*?)qq\.com/C40').findall(url1)[0]+'qq.com/'+c
print (url3)

标签:songmid,三要素,callback,json,html,歌曲,print,import,链接
来源: https://blog.csdn.net/siling115/article/details/88314983

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有