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

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

抓包

  1. 这里是对网页版的网易云音乐进行抓包,分析网络请求,url https://music.163.com/#/song?id=36229055 然后可以发现 所有的网易云热评都是通过https://music.163.com/weapi/v1/resource/comments/R_SO_4_32785700?csrf_token=这个接口返回的json破解网易云js加密,爬虫获取网易云评论_第1张图片
  2. 可以看到这个请求是post请求 请求参数是请求参数由两个params以及encSecKey,这两个参数明显是加密过后的,我们要想获得评论数据必须要知道这两个参数怎么生成的。
  3. 找到js文件 根据习惯我们先搜索一下看看能不能找得到这两个参数;打开全局搜索很巧的是 我们在这里可以直接根据encSecKey定位到加密参数,有很多别的网站会把名字改动,就没这么好找了破解网易云js加密,爬虫获取网易云评论_第2张图片
    往下翻一下可以看到
    破解网易云js加密,爬虫获取网易云评论_第3张图片
    只要定位到加密参数接下来的就容易很多了,在这里可以看到这两个参数是由window.asrsea获得的
  4. 在然后就可以找到这个函数是怎么生成的,用了哪些参数
    破解网易云js加密,爬虫获取网易云评论_第4张图片
    这这里可以看到abc几个函数的功能,这个时候我们就要动态调试一下 看看这几个函数的作用 变量到底是什么值
    在这里插入图片描述
    在这里插入图片描述
  5. 其中a是产生一个16位的随机数(这里我直接让它等于FwtEYduOXlNEHbLP)为什么要等与这个呢 hhh 因为我发现这个随机数,他在生成encText的时候用了一次,生成encSecKey的时候,又用了一次,而且encSecKey就只跟这个随机数相关,所以让这个随机数为定值的话,就可以直接得到encSecKey的值,不用再去搞一个rsa加密
  6. b函数就是我们主要要解决的AES加密,经过调试,我们可以知道它的两个参数a、b分别是加密字符转、密钥。以及AES的偏移量为0102030405060708、加密模式为CBC
  7. 经过了一番调试以后我们知道了这几个参数的具体值 我们就可以用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': 'http://music.163.com/'
   }
   url = "https://music.163.com/weapi/v1/resource/comments/R_SO_4_32785700?csrf_token="
   raw = requests.post(url,headers=headers, data=data)print(raw.json())

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

你可能感兴趣的:(爬虫)