问大佬们一个问题,查了一下放回<Response [200]>是正常,咋样才能获取到数据嘞
from Crypto.Cipher import AES
from base64 import b64encode
import requests
import json
data = {
"csrf_token": "",
"cursor": "-1",
"offset": "0",
"orderType": "1",
"pageNo": "1",
"pageSize": "20",
"rid": "R_SO_4_1840256180",
"threadId": "R_SO_4_1840256180"
}
e = "01001"
f = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"
g = "0CoJUm6Qyw8W8jud"
i = "tDW1YqAeRUDE71sD"
url = "https://music.163.com/weapi/comment/resource/comments/get?csrf_token="
def getencSecKey():
return "32122f4372a042032d2596cab07952173802fe70fa2febfda51623432fc99f86e1235de882d19c51727abb3f8b808b202510bcb34fe678364f0a55676fd1fa60a784f79137bc71e8f9932305dac8202896ecc94b727e7d83790ecb16f82494176078d3df89068c6c87b10152911e66afabd7d1c66638167d3e30ad63888b9591"
def getparams(data): # 那么字典不能直接整个传了加密,所以一定要把字典变成字符串再进行加密,那么这里的data就默认是字符串
first = enc_params(data, g)
second = enc_params(first, i)
return second # 返回的第二次加密就是params
def to_16(data):
pad = 16 - len(data) % 16
data += chr(pad) * pad
return data
def enc_params(data, key): # 加密过程,那么这里的data根据getparams(data)知道也是字符串,网易的加密是AES加密,所以也要模仿AES,看函数b就知道了
date = to_16(data)
iv = '0102030405060708' # 看到b函数里面有一个iv=d,d = CryptoJS.enc.Utf8.parse("0102030405060708"),为了方便直接d="0102030405060708"
ase = AES.new(key=key.encode('utf-8'), IV=iv.encode("utf-8"),
mode=AES.MODE_CBC) # 首先先创建一个AES加密器,ctrl+b进去函数看到所需要的参数,然后对上就行了
bs = ase.encrypt(date.encode("utf-8")) # 加密,通过执行报错可知道,必须是需要16位或16的倍数位的内容长度,所以要处理一下
# 看回函数b,最后要.toString转换成字符串,那么就要用utf-8去识别,难么加密后的结果utf-8无法识别,所以需要b64处理加密结果
return str(b64encode(bs), "utf-8") # 转化成字符串去对应b函数的toString过程,以字符串的形式返回
# 请求到网易,拿到评论
if __name__ == '__main__':
resp = requests.post(url, data={
"params": getparams(json.dumps(data)), # 此时data是字典,要的是字符串,需要转化,导入json模块
"encSecKey": getencSecKey(),
})
print(resp)