声明:
该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关
下载资源链接:https://download.csdn.net/download/randy521520/90374039
一、找出需要加密的参数
1.js运行 atob(‘aHR0cHM6Ly95LnFxLmNvbS9uL3J5cXEvdG9wbGlzdC80’) 拿到网址,F12打开调试工具,搜索某个歌手歌单,找到/cgi-bin/musics.fcg请求(获取歌单),鼠标右击请求找到Copy>Copy as cUrl(cmd)
2.打开网站:https://spidertools.cn/#/curl2Request,把拷贝好的curl转成python代码
3.新建qq.py文件,把代码复制到该文件内,由于需要请求多个请求吧,所以把requests改为requests.sesseion,还需要把data参数utf-8转码,json.dumps时需要加上ensure_ascii=False参数防止非ASCII字符转换成Unicode
4.请求中的header并没有加密信息,而cookies中的字段基本是账号登录后的cookie不用管,其中请求中的params是加密字段,再发送一条请求对比打他中的参数会发现,data中的中的searchid是可变的,所以只需要解决params、searchid就行
二、分析searchid加密代码
1.network关键字搜索searchid,在searchid赋值的地方断点
2.重新发送请求,会进入该断点,鼠标悬浮到searchid加密函数,点击链接可以找到加密函数
3.新建webpack.js,把加密函数复到该文件,重复运行即可补全该加密函数,该环境比较简单就不演示过程了
三、分析params加密代码
1.network关键字搜索sign:,在sign:赋值的地方断点
2.重新发送请求,会进入其中一个断点,分析代码会发现sign是data加密生成,且加密的函数是n(350).default,该加密函数是webpack的特性;分析上面代码会发现_=Date.now()
3.根据分析补上_
4.鼠标悬浮到n上可以找到加载webpack得代码,把代码全部复制到webpack.js,分析代码得知主要函数为f
5.根据分析修改webpack.js
6.鼠标悬浮到n(350).default,找到加密函数得文件,把文件中得代码全部复制到webpack.js顶部,大概有两万多行得代码
7.删除之前得测试函数,写一个方法获取sign,调用函数后会发现sign获取成功,且长度是42,对比之前请求成功得sign会发现长度不一样,说明环境不对
8.环境比较简单就不演示了,只需要补上location、navigator就行,可以使用下面代码吐出环境
// 代理器封装
function getEnv(proxy_array) {
for(var i=0; i<proxy_array.length; i++){
handler = `{\n
get: function(target, property, receiver) {\n
console.log('方法:get',' 对象:${proxy_array[i]}',' 属性:',property,' 属性类型:',typeof property,' 属性值类型:',typeof target[property]);
return target[property];
},
set: function(target, property, value, receiver){\n
console.log('方法:set',' 对象:${proxy_array[i]}',' 属性:',property,' 属性类型:',typeof property,' 属性值类型:',typeof target[property]);
return Reflect.set(...arguments);
}
}`;
eval(`
try{\n
${proxy_array[i]};\n
${proxy_array[i]} = new Proxy(${proxy_array[i]},${handler});
}catch(e){\n
${proxy_array[i]}={};\n
${proxy_array[i]} = new Proxy(${proxy_array[i]},${handler});
}
`)
}
}
// proxy_array = ['window', 'document', 'location', 'navigator', 'history','screen','target' ]
// getEnv(proxy_array)
module.exports = getEnv
9.修改qq.py验证结果,会发现已经拿到歌单;这只是歌单,并没有拿到歌曲得url
四、分析歌曲url
1.点击一首歌进行播放,会进入播放列表页面,f12打开调试工具,刷新页面,network搜索.m4a请求,可以找到歌曲的url,复制url,另打开个窗口访问url会发现歌曲可以正常播放,说明就是此url,这边儿使用的是微信账号,如果是qq账号.m4a找不到,可以搜索.mp3
2.搜索C400002202B43Cq4V4.m4a?guid=,可以找到获取歌曲url的请求,这里会发现同样是/cgi-bin/musics.fcg请求
3.复制请求结果到工具格式化,搜索C400002202B43Cq4V4.m4a?guid=会发现在req_8中
4.使用工具分别对比这次的/cgi-bin/musics.fcg请求和歌单的/cgi-bin/musics.fcg请求的cookie、data参数,会发现cookie中的ts_last不同,data中的comm相同;虽然获取歌曲url中的请求除了comm还有很多参数,但是在之前分析请求结果是时请求url在req_8中,所以只需要关心req_8参数就行
5.修改qq.py,根据分析封装/cgi-bin/musics.fcg请求
6.分析req_8参数,其中songmid是歌曲id,uni是之前请求中的comm参数uni
7.回到歌单页面搜索songmid,会发现是之前歌单请求结果中的mid
8.根据分析修改qq.py,获取歌曲url,至此获取某个歌单到歌曲url结束
五、下载歌曲
1.下载歌曲时需要歌手名称作为文件夹,所以需要在get_music_src中创建文件夹
2.写个down_music函数,下载歌曲
3.测试是否可以下载歌曲