例行打开抓包工具,不用想就知道这是一个阿贾克斯请求。打开后没怎么找就发现了评论内容。
看起来加密参数有两个,跟栈以找加密位置就出现了,挺好找的。打上短点刷新请求
输入加密内容,就出现了我们要的加密加密参数。
多次刷新后发现,后面的参数并不是服务器返回的,而是存在js源码里面的。唯一变化的参数就是第一个,并且只有page变化,page是什么就不用说了。
进入到window.asrsea函数内部,依次打上断点,a(16)发现是个随机数,每次控制台输出都会发生变化。h.enclext是第一次加密过程,进去后发现这是个aes加密方式。
随便找个aes在线工具,传入参数发现跟这个函数return参数一样,第一层加密就过去了。
然后来到第二次加密的算法的位置,发现传入的两个参数第一个是上一次加密的结果,另外一个是一个随机数,然后再进行一个aes加密。
进去加密b函数,把key跟加密内容修改下,第二层的加密模式也让破解了;
剩下的一个加密参数,是用a(16)出一个随机数,然后进行一次加密的,直接固定下来,懒得分析了,直接设置为定值完整代码如下
from Crypto.Cipher import AES import base64 BLOCK_SIZE = 16 # Bytes pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * \ chr(BLOCK_SIZE - len(s) % BLOCK_SIZE) unpad = lambda s: s[:-ord(s[len(s) - 1:])] url = ' d = '{"rid":"R_SO_4_1901371647","threadId":"R_SO_4_1901371647","pageNo":44,"pageSize":"150","cursor":"1646708474245","offset":"0","orderType":"1","csrf_token":""}' e = '010001' f = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7' g = '0CoJUm6Qyw8W8jud' i = '87C8WxdEZ1mf3QH4' iv = "0102030405060708" def AES_Encrypt(key, data): data = pad(data) # 字符串补位 cipher = AES.new(key.encode('utf8'), AES.MODE_CBC, iv.encode('utf8')) encryptedbytes = cipher.encrypt(data.encode('utf8')) # 加密后得到的是bytes类型的数据,使用Base64进行编码,返回byte字符串 encodestrs = base64.b64encode(encryptedbytes) # 对byte字符串按utf-8进行解码 enctext = encodestrs.decode('utf8') return enctext enctext = AES_Encrypt(g, d) print(enctext) enctext1 = AES_Encrypt(i, enctext) jiami2 = '5036ea55f9536c27a6c0fd82dff8db4bac71c0d1c847913173ea44d9fb2c3f68ec7f56c1b60e0508f9d9e885077d8a8a772bf60ee2bedeba122e5cab184cb149b4fc81847f9aac394eaf719c070224a4e7ed42532aba38b72cc37b5e9aa5488848d79e29fc26781dfd0a8d46ebc6aa3ce892b992b4834d4343a2751d6366eee7' data = {'params': enctext1, 'encSecKey': jiami2} head = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'} qw = requests.post(url, data=data, headers=head).json()['data']['comments'] for i in qw: print(i) print('用户名字:', i['user']['nickname']) print(i['content'])效果如下:
批量爬取的话,要选把歌曲id爬下来,然后进行跟换,就好了