本文是一篇学习笔记,整体过程来自于b站
https://www.bilibili.com/video/BV1Wf4y1t7PC?p=48&spm_id_from=pageDriver
运用了js解密的方法
我们首先对wyy的网页进行分析,很显然它的评论不位于网页的源代码内,这时候我们就要通过抓包去找到它评论的url
我们看到传入的data被加密了,所以我们需要获得未加密的参数,这时候我们的思路就有了
- 1.找到未加密的参数
- 2.想办法把参数进行加密(必须参考它的逻辑)
- 3.请求到wy,拿到评论信息
我们点击它的最顶端的一个脚本,因为这是他最后运行的
则
e="010001"
f="00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"
g='0CoJUm6Qyw8W8jud'
data={
"csrf_token": "",
"cursor": "-1",
"offset": "0",
"orderType": "1",
"pageNo": "1",
"pageSize": "20",
"rid": "R_SO_4_1481164987",
"threadId": "R_SO_4_1481164987"
}
然后我们分析下面的加密函数
python
function a(a=16) { #返回了16位随机的字符串
var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";
for (d = 0; a > d; d += 1) #循环16次
e = Math.random() * b.length, #随机数 2.4567
e = Math.floor(e), #向下取整 2
c += b.charAt(e); #取字符串中的某个位置 c
return c
}
function b(a, b) {#a就是是数据,要加密的, b是密钥
var c = CryptoJS.enc.Utf8.parse(b)
, d = CryptoJS.enc.Utf8.parse("0102030405060708") #d新值
, e = CryptoJS.enc.Utf8.parse(a) #e是数据
, f = CryptoJS.AES.encrypt(e, c, { #AES一个加密算法,c为加密的密钥
iv: d, #偏移量
mode: CryptoJS.mode.CBC #用CBC模式加密
});
return f.toString() #把f变成字符串返回
}
function c(a, b, c) {
var d, e;
return setMaxDigits(131),
d = new RSAKeyPair(b,"",c),
e = encryptedString(d, a)
}
function d(d, e, f, g) {#d:数据data e:010001 f:很长的一个变量 g:0CoJUm6Qyw8W8jud
var h = {} #空对象
, i = a(16); #i就是一个16位的随机字符串,我们把i设置成一个定值
return h.encText = b(d, g), #传入的g是密钥
h.encText = b(h.encText, i), #返回的就是params(进行了两次b()加密) i也是密钥
h.encSecKey = c(i, e, f), #返回的就是encSecKey,传入的e和f是定值,变量值为i(一个16位的随机值),如果将i固定,则c()返回的值也是个定值,即encSecKey也是定值
h
}
两次加密:
数据+g =>第一次加密+i =>b => params
因为c里面没有随机数生成,所以我们假设把i也设置为固定值
则
i="riDx3tkIqurdfDtv"
分析完毕后,我们就可以编写代码了
# @Time:2021/12/411:07
# @Author:中意灬
# @File:网易云评论.py
# @ps:tutu qqnum:2117472285
import csv
import re
import requests
from Crypto.Cipher import AES #需要安装pip install pycryptodome
from base64 import b64encode
import json
url="https://music.163.com/weapi/comment/resource/comments/get?csrf_token="
#服务于d函数
e="010001"
f="00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"
g='0CoJUm6Qyw8W8jud'
i="riDx3tkIqurdfDtv"#i是手动固定的
data={
"csrf_token": "",
"cursor": "-1",
"offset": "0",
"orderType": "1",
"pageNo": "1",
"pageSize": "20",
"rid": "R_SO_4_1481164987",
"threadId": "R_SO_4_1481164987"
}
def to_16(data):#为ASE加密算法服务
pad=16-len(data)%16
data=data+chr(pad) * pad
return data
def get_encSecKey():#获取encSecKey值,由于i固定,所以encSecKey也是固定的,就是c(i,e,f)的结果就是固定的
return "4a3d959dab493457825f4679d55ec3560bf5607e785ce0ed8696b62c61625e4a1633ea8f76bf39be79483e385e25f755b2086760869ecf05432c383cc6691889e39dca8dd8da05d1cdcce8e10068bbb7e666123f5019f18cea9142c87588e909ffa079967c636b383e332d650e3a55059fc95dafd093c7ee9c3bf7fe701d0761"
def get_params(data):#默认收到的是字符串#把参数进行加密
first=enc_params(data,g)
sencond=enc_params(first,i)
return sencond #返回的就是params
def enc_params(data,key):#加密过程,即还原b()方法,即还原b()方法中的f生成
iv="0102030405060708" #去网页设置断点来获取
data=to_16(data)
aes=AES.new(key=key.encode('utf-8'),mode=AES.MODE_CBC,iv=iv.encode('utf-8'),) #Create a new AES cipher
bs=aes.encrypt(data.encode('utf-8')) #加密,加密的内容的长度必须是16的倍数,
return str(b64encode(bs),'utf-8') #转换成字符串返回
#请求方式post
resp=requests.post(url,data={
"params": get_params(json.dumps(data)),#将data转换成字符串,因为get_params接收字符串
"encSecKey": get_encSecKey()
})
patter=re.compile('.*?"content":(?P<content>.*?),.*?')
resp.text.encode('utf-8')
text=resp.text
result=patter.finditer(text)
for i in result:
with open('网易于评论.csv','w',newline='',encoding='utf-8')as f:
csvwriter=csv.writer(f)
for i in result:
dic=i.groupdict()
dic['content']=dic['content'].strip('"')
csvwriter.writerow(dic.values())
print('ok!')
运行结果:
最后:大家可以自己更加优化,比如获取全部多页的评论(我试试了修改data里面的pageNo,但好像不行,所以我就没有爬取多页),但有好的建议和方法也欢迎大家与我交流,一起进步咯