佳节胖三斤,跑步减脂势在必行。而跑步配乐很重要,根据丹尼尔斯经典跑步训练法,长跑步频控制在180左右最为高效,下面我们使用python和nodejs从网易云喜欢歌单中挑选bpm为180左右的歌曲。
1.获取歌单音乐文件
获取歌单信息
登录网易云https://music.163.com,登录账户,点开“我的喜欢”,url形如:https://music.163.com/#/my/m/music/playlist?id=441143083。即ID形如441143083为我们要获取的歌单ID。以后根据此id即可获取歌单信息,不再次需要登录。
获取歌曲信息
分析歌单网页元素,发现每首歌都有一个唯一id,根据id构造成形如https://music.163.com/#/song?id=26883017的url,此页面为歌曲的详细信息,可以直接获取到歌名、歌手、专辑及封面等信息。下载地址并没有直接给出,需要进一步分析
获取下载地址
打开浏览器的Network抓包功能,点击播放按钮,可发现形如https://m10.music.126.net/20190201105733/434339567651b37996b1a8729b752930/ymusic/ae75/980f/7b41/83ffac06ee0af1802ce0e50e3d7a9208.mp3的url被加载,此url就是下载地址了。根据下载url,分析播放音乐时,加载的其他包,可以看到形如https://music.163.com/weapi/song/enhance/player/url?csrf_token=3755d273a3b04482f79f27997ad96efa请求返回的正是mp3的下载地址,而这个请求是post类型的,需要提交两个参数params
和encSecKey
。这两个参数是从何而来?查找网页的所有js文件,发现https://s3.music.126.net/web/s/core_4400a8199614820ac541685ca5726316.js?4400a8199614820ac541685ca5726316
中包含params
和encSecKey
,格式化js文件后在12984和19852行可以看到相关代码
var bUK5P =window.asrsea(JSON.stringify(i5n), brA7t(["流泪", "强"]), brA7t(WU9L.md), brA7t(["爱心", "女孩", "惊恐", "大笑"]));
e5j.data = k5p.cz6t({
params: bUK5P.encText,
encSecKey: bUK5P.encSecKey
})
发现params和enSecKey和window.asrsea函数有关。
windows.asrsea()的代码为
!function() {
function a(a) {
var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";
for (d = 0; a > d; d += 1)
e = Math.random() * b.length,
e = Math.floor(e),
c += b.charAt(e);
return c
}
function b(a, b) {
var c = CryptoJS.enc.Utf8.parse(b)
, d = CryptoJS.enc.Utf8.parse("0102030405060708")
, e = CryptoJS.enc.Utf8.parse(a)
, f = CryptoJS.AES.encrypt(e, c, {
iv: d,
mode: CryptoJS.mode.CBC
});
return f.toString()
}
function c(a, b, c) {
var d, e;
return setMaxDigits(131),
d = new RSAKeyPair(b,"",c),
e = encryptedString(d, a)
}
function d(d, e, f, g) {
var h = {}
, i = a(16);
return h.encText = b(d, g),
h.encText = b(h.encText, i),
h.encSecKey = c(i, e, f),
h
}
function e(a, b, d, e) {
var f = {};
return f.encText = c(a + e, b, d),
f
}
window.asrsea = d,
window.ecnonasr = e
}();
windows.asrsea即为函数名为d
的函数,d函数有4个参数d,e,f,g;
经加断点调试,发现函参数d内有三个属性br,csrf_token,ids,其中ids为音乐id,csrf_token为url中的参数值,经测试csrf_token在实际构造请求时可以为任何值;br为128000,估计是波特率,对应音质的;参数e,f,g为常量。
e=“010001”
f=“00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a87