【7】实战:爬取⽹易云⾳乐歌曲对应id并剔除⽆版权歌曲⽬录
我们的如果想要播放⽹易云⾳乐上的⾳频,只需拿到其mp3的url即可,对应外链的url格式如下:(完整格式可从⽹上搜索,后缀+
‘.mp3‘)
*/song/media/outer/url?id=
其中,id为⾳乐列表对应编号。
故若要根据⽤户的要求播放指定的⾳频,就要找到指定⾳频的对应id。
由此,我们的分析步骤如下:
1. 在中搜索林俊杰可得到下图结果:
品牌的重要性
2. 我们查看源代码,并对照浏览器渲染后的代码,可以发现歌曲是后续加载的:
浏览器渲染代码:
⽹页源代码:
3. 查看XHR与JS⽂件,确定数据包来源:
通过查看该url的请求头部,可知其请求⽅式为POST,且有特定的请求参数params与encSecKey:
故⽽若我们要请求到⽬标数据,需求构造特定的请求头与请求参数。
4. 找到构造请求的⽅法:
⾸先可知该段是⼀段⽴即执⾏函数,格式化该段代码后可知该段代码主要有四个函数(函数中调⽤的有关密码学的函数均在同⼀js⽂件中有所定义):
a. 函数a的作⽤即⽣成指定字节的随机数:
b. 函数b的作⽤为AES加密:
c. 函数c的作⽤为RSA加密:
d. 函数d为主要逻辑控制函数,⽣成params与encSecKey:
除以上函数之外,该⽴即执⾏函数中还设置了两个参数分别指向函数d与函数e:
不等式计算
总的⽽⾔,由以上四个函数,尤其是函数d,我们可以总结出⽹易云⾳乐⽣成params与encSecKey的主要逻辑以及服务器解析的主要逻辑如下图所⽰(d为要加密的⽂本,AES的初始密钥为g,f为RSA的⼤模数,e为RSA的公钥,i为⽣成的随机数):先进技术
故⽽如果我们需要知道上述d函数的参数,才能得到特定的请求参数。
5. 找到d函数的参数:
由于该段是⼀个⽴即执⾏的函数,那么我们可以通过调试该js⽂件即可找到d函数的参数,故⽽我们直接监控该⽂件,在第88⾏下断点,查看其调⽤栈:
第⼀次直接运⾏,可以看到运⾏到88⾏时该d函数已经调⽤了a函数,⽽d函数是由v8n.bl9c调⽤,我们点击d函数,查看下⾯的调⽤信息:
征友启事由此,我们便拿到了第⼀次运⾏到d函数的4个调⽤参数。
我们点击继续运⾏,发现⽹页还没有显⽰歌单,且会第⼆次运⾏到88⾏,此时d函数被第⼆次调⽤:
可以看到e、f、g三个参数均没有发⽣改变,⽽d发⽣了改变;
我们点击继续运⾏,发现⽹页依然没有显⽰歌单,且会第三次运⾏到88⾏,此时d函数被第三次调⽤:
龙门激浪嗯,歌单依然没有出来,但我们现在基本可以确认e、f、g三个参数是固定的,我们继续运⾏,直到第七次调⽤:
可以看到,d参数中出现了不⼀样的数据,我们查找的内容即林俊杰,对应参数中的keyword,我们继续运⾏,但歌单依然没有刷新……所以继续运⾏,到了第⼋次调⽤:
好,这⼀次依然是有关键信息的,如id、s与type,均与我们的查找参数对应:
故⽽我们单步调试该次调⽤,记录该次⽣成的params与encSecKey:
点击继续运⾏后,我们可以在Network中可以看到其对⽬标发出了请求:
但是歌单信息还是没有请求到,继续运⾏:
再次继续运⾏,发现歌单终于出来了,且请求参数与先前不同:菡的意思
淹黄瓜咸菜
故我们可以确定的是整个调⽤过程共请求了⽬标
两次,且两次参数并不相同,故⽽后续我们以上述两次请求的参数来构造请求,以验证能否请求得到信息。
但是,在实际测试中,只有第⼀次构造的参数才能够请求到对应的数据。
6. 构造请求:
如以上分析,我们只需构造类似于a,b,c,d四个函数的相应操作,即按照此前分析的基本请求头构造流程来构造请求即可:
a. ⽣成随机数,即相当于a函数,由于我们的调试中可以知道a函数的调⽤参数为16,故⽽我们直接默认⽣成16字节的随机数即可:
武汉保卫战简介
b. AES加密,相当于b函数,其中需要对text与key进⾏padding,padding的规则在原JS代码中的par代码中定义:
c. RSA加密,相当于c函数:
d. 主逻辑控制函数,相当于d函数: