700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 破解网易云js加密 爬虫获取网易云评论

破解网易云js加密 爬虫获取网易云评论

时间:2023-01-19 21:25:37

相关推荐

破解网易云js加密 爬虫获取网易云评论

破解网易云js加密,爬虫获取网易云评论

抓包

这里是对网页版的网易云音乐进行抓包,分析网络请求,url /#/song?id=36229055 然后可以发现 所有的网易云热评都是通过/weapi/v1/resource/comments/R_SO_4_32785700?csrf_token=这个接口返回的json可以看到这个请求是post请求 请求参数是请求参数由两个params以及encSecKey,这两个参数明显是加密过后的,我们要想获得评论数据必须要知道这两个参数怎么生成的。找到js文件 根据习惯我们先搜索一下看看能不能找得到这两个参数;打开全局搜索很巧的是 我们在这里可以直接根据encSecKey定位到加密参数,有很多别的网站会把名字改动,就没这么好找了

往下翻一下可以看到

只要定位到加密参数接下来的就容易很多了,在这里可以看到这两个参数是由window.asrsea获得的在然后就可以找到这个函数是怎么生成的,用了哪些参数

这这里可以看到abc几个函数的功能,这个时候我们就要动态调试一下 看看这几个函数的作用 变量到底是什么值

其中a是产生一个16位的随机数(这里我直接让它等于FwtEYduOXlNEHbLP)为什么要等与这个呢 hhh 因为我发现这个随机数,他在生成encText的时候用了一次,生成encSecKey的时候,又用了一次,而且encSecKey就只跟这个随机数相关,所以让这个随机数为定值的话,就可以直接得到encSecKey的值,不用再去搞一个rsa加密b函数就是我们主要要解决的AES加密,经过调试,我们可以知道它的两个参数a、b分别是加密字符转、密钥。以及AES的偏移量为0102030405060708、加密模式为CBC经过了一番调试以后我们知道了这几个参数的具体值 我们就可以用python代码把这几个参数实现出来。

def AES_encrypt(text, key): pad = 16 - len(text) % 16 text = text + pad * chr(pad) encryptor = AES.new(key, AES.MODE_CBC, "0102030405060708") encrypt_text = encryptor.encrypt(text) encrypt_text = base64.b64encode(encrypt_text) return encrypt_text

经过js加密码的分析,我用python实现了一下AES加密,具体代码如下,包含两个参数,一个是需要加密的字符串,一个是密钥

f_key = "0CoJUm6Qyw8W8jud"text = "{\"rid\":\"R_SO_4_32785700\",\"offset\":\"20\",\"total\":\"true\",\"limit\":\"20\",\"csrf_token\":\"\"}"rs = AES_encrypt(text, f_key)params = AES_encrypt(str(rs)[2:-1], "FwtEYduOXlNEHbLP")

这里解释一下,text是我进过N次调试得出的,因为在请求评论之前,text有好几个值来验证其他的东西,这里我大概理解了一下text的含义,这里我们只要知道offset是偏移量,limit是每次请求多少条,比如你请求前二十条则offset=0,limit = 20,我上面的是请求20-40条。

然后直接获取的encSecKey直接赋值就好啦,结合这两个参数,我们的请求参数就构造好了,直接POST吧,就能得到评论啦

data = {'params': params, 'encSecKey': encSecKey}headers = {'Accept-Language':"zh-CN,zh;q=0.9,en;q=0.8", 'User-Agent':'Mozilla/5.0 (X11; Linux x86_64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36','Cookie': 'appver=1.5.0.75771', 'Referer': '/'}url = "/weapi/v1/resource/comments/R_SO_4_32785700?csrf_token="raw = requests.post(url,headers=headers, data=data)print(raw.json())

拿到参数就可以直接post从接口获取评论数据啦

END

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。