QQmusic python,js获取sign及音频爬虫示例

js获取sign

sign是什么

以本人喜欢的歌手(ふじた まいこ)主页为示例
链接: https://y.qq.com/n/yqq/singer/003ya8w823iLae.html.
在刷新页面时从XHR中找到以musics.fcg开头的文件,从中能找到sign
在这里插入图片描述

sign获取

sign加密方式

1.sign是参数,在search中搜索sign=,从Sources找到一个js文件,在从文件中搜索sign找到getSecuritySign函数

2.load()方法指向一个新的URL,跳转后获得一个js文件,里面只有一个匿名函数,进行格式化后,能看到__sign_hash_20200305应该是最新sign加密方法
在这里插入图片描述
3.设置断点调试,由于getSecuritySign需要一个r.data.data的参数,所以便在这里设置断点,然后能看到需要传递的参数就是musics.fcg开头的文件中的data(即第一张图最后的data),继续跳转就到了刚才获取的js文件,其中的匿名函数会返回一个变量t
在这里插入图片描述
在这里插入图片描述
4.把该匿名函数直接复制新建一个js文件,定义一个新的变量和函数来获取返回值并进行传递,最后得到的就是我们需要的sign

在这里插入图片描述
在这里插入图片描述

音频爬虫示例

在线播放页面刷新,在XHR中以musics.fcg开头文件中能找到vkey和data,同时在media中能找到对应接口,我们需要三个参数(QQ号,sign,parse.quote(data)),另外搜索vkey找到musics.fcg?-=getplaysongvkey开头文件,可找到一个能直接使用的purl,直接放代码
在这里插入图片描述

Python代码(调用js文件)

import execjs,requests
from urllib import parse


headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36',
    'Referer':'https://y.qq.com/n/yqq/singer/003ya8w823iLae.html',
}


def getSign(data):
    with open('./jsdecoding.js', 'r', encoding='utf-8') as f:
        js_content = f.read()

    js_exec = execjs.compile(js_content)
    sign = js_exec.call('getSecuritySign',data)
    return sign


def download():
    data = ''
    sign = getSign(data)   
    qq = '' 
    url = 'https://u.y.qq.com/cgi-bin/musics.fcg?-=getplaysongvkey27494207511290925'\
        '&g_tk=1291538537&sign={}&loginUin={}'\
        '&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0'\
        '&platform=yqq.json&needNewCode=0&data={}'.format(sign,qq,parse.quote(data))
    html = requests.get(url,headers = headers).json()
    try:
        purl = html['req_0']['data']['midurlinfo'][0]['purl']
        filename = html['req_0']['data']['midurlinfo'][0]['filename']
        url = 'http://119.147.228.27/amobile.music.tc.qq.com/{}'.format(purl)
        html = requests.get(url,headers = headers)
        html.encoding = 'utf-8'
        with open(filename,'wb') as f:
            f.write(html.content)   
            print('succeed')
    except:
        print('failed')


if __name__ == '__main__':
    download()

js文件行数过大发不出来,自行下载https://download.csdn.net/download/Houdr243/12672041或者私信我

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值