网易云音乐评论抓取(js逆向)
本文通过分析网易云音乐的js加密,通过构造相关的参数,获取网易云音乐评论。
所用语言和相关模块
- python3.6
- requests`
网站特点分析
通过分析网站可知:
评论获取的url:https://music.163.com/weapi/comment/resource/comments/get?csrf_token=
评论获取的方法:post
评论获取的参数:params、encSecKey
且参数为加密参数
实现过程
由上面的分析过程可以得知,实现过程分为3部分完成:
1)找出各参数的js代码
ctrl+shift+f掉出全局搜索,输入参数“encSecKey”,找出各参数形成的位置
2)分析各参数的加密逻辑
在相关的参数加密获得处打上断点,
由图可知,两个参数的值是由一个函数获取得到,其主要的参数为d,e,f,g
d:通过分析参数的格式可知,rid、threadId为歌曲id,pageNo评论页数, pageSize为页的条数,cursor为该页获取的评论的最小发布时间戳,orderType为排序规则
e为固定值010001
f为固定值00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7
g为固定值0CoJUm6Qyw8W8jud
在函数中,有个比较重要的参数i,其为随机的16位字符串,每次请求可取固定的值,取其值为3XDOKTz8borjR3H3
encSecKey的值的加密代码为h.encSecKey = c(i, e, f)
,由于i、e、f可为固定的值,故encSecKey取值为i=3XDOKTz8borjR3H3的加密得到1206a2796de825fceaa6d57bbfaf901ce9c13c9f7364fb721aa1260355020a9e7e753744223f165be7a1b4edda2dbac2edda6add418de29793c177c1578611e606f9a35e3d8cb44da198072531528dc551416a6242d9330d410b066f410f6c9fab866cc6b2cc73131f62669042086f3666e3336bc5a2e0acb38ddef443a615da
params的为aes二次加密得到
故此,只需实现aes加密,模拟获取相关的评论
3)python实现相关的加密代码
params参数获取:
def get_params():
"""
获取params参数的值
:return:
"""
iv = "0102030405060708"
i = '3XDOKTz8borjR3H3'
# 获取密文
encText = AES_encrypt(d, g, iv)
encText = AES_encrypt(encText, i, iv)
return encText
aes加密:
def AES_encrypt(text, key, iv):
"""
进行aes加密
:param text:加密的明文
:param key:密钥
:param iv:
:return:
"""
pad = 16 - len(text) % 16
text = text + pad * chr(pad)
encryptor = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
encrypt_text = encryptor.encrypt(text.encode("utf-8"))
encrypt_text = base64.b64encode(encrypt_text)
return encrypt_text.decode('utf8')