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¬ice=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.youkuaiyun.com/download/Houdr243/12672041或者私信我