我是靠谱客的博主 欢喜音响,最近开发中收集的这篇文章主要介绍Python扫码登录保存和验证cookies值——网易云音乐篇(九)一、打开二维码扫码登录页面,找到二维码图片链接二、破解获取params和encSecKey值三、进行扫码操作,找到确认链接四、判断cookie是否有效五、其他文件六、保存cookies值并进行验证完整代码七 、 更多文章,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
python实现扫码登录网易云音乐网页版
- 一、打开二维码扫码登录页面,找到二维码图片链接
- 二、破解获取params和encSecKey值
- 注意:from Crypto.Cipher import AES
- 三、进行扫码操作,找到确认链接
- 四、判断cookie是否有效
- 五、其他文件
- 六、保存cookies值并进行验证完整代码
- 完整代码
- 七 、 更多文章
一、打开二维码扫码登录页面,找到二维码图片链接
- 本篇幅度比较长,有点难度,不过经过小编反复测试,终于找到规律完成扫码操作和获取登录cookie信息。稍微加了一些图片来说明吧。
- 先找到生成二维码的链接,打开登录页面:https://music.163.com/#/login
- 点击二维码右键鼠标,选择检查选项,每个浏览器不一样,小编用的是谷歌浏览器,如下图:
- 找到了二维码链接:http://music.163.com/login?codekey=9582af31-7ac9-4863-a83b-0764b11e08e3
- 发现变量参数codekey,下一步就去获取
- 通过:https://music.163.com/weapi/login/qrcode/unikey?csrf_token=。这个可以获取unikey值
二、破解获取params和encSecKey值
- 上面我们知道了获取unikey值的链接,但是访问此链接必须要有两个参数params和encSecKey值
- 要获取这两个参数,小编花费不少时间~
- 搜索其中一个参数encSecKey,双击下面链接
- 优化js代码,CTRL+F继续进行搜索encSecKey值,找到这两个值生成方式
- 通过上面代码可以看出我们需要知道bWv7o的值,这个值由下面这个四组合的
(JSON.stringify(i6c), bsK7D(["流泪", "强"]), bsK7D(XR0x.md), bsK7D(["爱心", "女孩", "惊恐", "大笑"])
- 首先获取i6c的值,通过断点可以知道
i6c: {key: "1b601cd2-960c-4ee5-b1c6-e90dcc5a3f59", type: "1", csrf_token: ""}
- 再者**bsK7D([“流泪”, “强”])**的值,同上面方法,点击红色块跳另一个地方,进行断点运行
Return value: "010001"
- 然后**bsK7D(XR0x.md)**的值,再点击运行,就可以出现Return value值
Return value: "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"
- 最后一个值bsK7D([“爱心”, “女孩”, “惊恐”, “大笑”]
Return value: "0CoJUm6Qyw8W8jud"
- 四个值获取到了
- i6c: {key: “1b601cd2-960c-4ee5-b1c6-e90dcc5a3f59”, type: “1”, csrf_token: “”}
- Return value: "010001"
- Return value: "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"
- Return value:"0CoJUm6Qyw8W8jud"
- key值是变量值,其他值都是固定值,下面在vipcashier.umd.js中找到获取key值的方法,就是时间加随机加固定值组合而成
function S() {
var e = (new Date).getTime();
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(t) {
var n = (e + 16 * Math.random()) % 16 | 0;
return e = Math.floor(e / 16),
("x" === t ? n : 7 & n | 8).toString(16)
})
}
-上面四个参数获取到了,还有一个大包围window.asrsea
var bWv7o = window.asrsea(JSON.stringify(i6c), bsK7D(["流泪", "强"]), bsK7D(XR0x.md), bsK7D(["爱心", "女孩", "惊恐", "大笑"]));
- d,e,f,g就是上面那四个参数的按步骤获取的参数,这里断点运行之后直接就可以看到
d: "{"key":"1b601cd2-960c-4ee5-b1c6-e90dcc5a3f59","type":"1","csrf_token":""}"
e: "010001"
f: "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"
g: "0CoJUm6Qyw8W8jud"
- 通过上面这段代码可以看出,这里又继续加密了
进一步化简:
i = a(16)
h.encText = b(d, g)
h.encText = b(h.encText, i)
h.encSecKey = c(i, e, f)
大概就这个意思
encText = b(b(d, g), i)
encSecKey = c(i, e, f)
- d, e, f, g的值我们获取到了,下面首先获取 i 值
- 获取 i 值:i = a(16),同上方法进行寻找
- i值获取方式,将i = a(16)带入该函数单独随机生成,没其他函数参与
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
}
可以看出这就是由这段代码随机生成的16位值
- 接着就是b(b(d, g), i),这个函数AES加密的
- 从上面可以看出iv=0102030405060708,这是偏移量,固定值
iv:0102030405060708
- 将a,b值带入函数中生成新的参数,是b(d, g),变成b(a, b),其实就是a就是d值,g就是b值
d: "{"key":"1b601cd2-960c-4ee5-b1c6-e90dcc5a3f59","type":"1","csrf_token":""}"
g: "0CoJUm6Qyw8W8jud"
- 将b(b(d, g), i)函数代码转换成python代码,b函数加密了两次
def keys(key):
while len(key) % 16 != 0:
key += '