进入网易云歌单:
通过POST请求数据,需要在请求表单加入请求参数
可以看到这两个参数每次刷新后的值都是不一样的,需要获取到这两个加密参数
使用关键字搜索params定位到加密位置,会搜索到很多个params
一个一个查看,可以看到这一条带有params和encSecKey,是我们要找的两个加密参数
可以看到这两个都是从bYE2x中获取的值
而bYE2x变量中window调用了asrsea()方法
点进去
加密参数的生成函数应该就是这个,函数中传入了四个参数d,e,f,g,
首先查看传入的参数值,添加断点进行调试
直到页面到加载评论这一步,可以看到d的值出现变化
第一个值和第二个值是歌单id \"rid\":\"A_PL_0_13400885874\"
第三个值是歌单页数 \"pageNo\":\"1\"
第四个值是每页返回的评论数量 \"pageSize\":\"20\"
cursor 游标,用于时间倒序分页,
-1
表示从最新开始offset 偏移量,用于分页时控制数据位置,这里是
0
orderType 排序方式:
1
可能表示按热度排序,2
可能是按时间csrf_token 跨站请求伪造的令牌,这里是空的,说明请求不包含校验
其它三个值e,f,g都是固定值
可以看到加密函数中还调用了a、b、c函数
i是随机生成的 AES 密钥(长度16)
encText是经过了两次AES加密
encSecKey用 RSA 的公钥 (e, f) 对随机 AES 密钥 i 进行加密
那么我们可以固定i,并获得 i 对应的encSecKey(获取encText和encSecKey必须是相同的i),那么接下来只需要在python代码中实现AES加密函数
b使用了AES加密(对称加密),a是要加密的数据,b是AES加密的密钥(也就是刚刚的d和g)
先将一些参数转换为UTF-8编码的字节串
AES.encrypt(e,c,{iv:d},mode:CryptoJS.mode.CBC)中,e是要加密的数据,c是密钥,d是初始化向量,加密模式是CBC。
转为python代码
def b(a,b): c = b.encode('utf-8') d = "0102030405060708".encode('utf-8') # 固定iv向量 e = a.encode('utf-8') e = pad(e, 16) #填充 # 创建AES加密对象 cipher = AES.new(c, AES.MODE_CBC, d) # 加密数据 encrypted_data = cipher.encrypt(e) # 返回Base64编码结果 return base64.b64encode(encrypted_data).decode('utf-8')
打断点调试获取到 i 和encSecKey
完整代码网址:wyymusic-spider/comments.py at master · NDEFLL/wyymusic-spider · GitHub