抓取网易云音乐评论

#找到未加密参数
#将参数加密为params,encseckey
from Crypto.Cipher import AES
from base64 import b64encode
import requests,json,re
url='https://music.163.com/weapi/comment/resource/comments/get?csrf_token='

data={
    'csrf_token': "",
    'cursor': "-1",
    'offset': "0",
    'orderType': "1",
    'pageNo': "1",
    'pageSize': "20",
    'rid': "R_SO_4_31445772",
    'threadId': "R_SO_4_31445772"
}
f = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"
g = "0CoJUm6Qyw8W8jud"
e = "010001"
i = "bFTUrhRzH34JPTx4"
def get_key():
    return "88e4bf864d7738ae3abf963037d87ca0d3c1deb2f7f83d9ab7134f23824632cf09da046608d22eeaf1e2d60d9348450de41162d3f91840a751e16563286cb32d1d4dabde8453593ae27e8e76e1dd1dc0aa4f0ebc55c3906172a3d123cf0162edc42be562cb84c77d28a487f3e38044230fd7f3b740d49742ccfe9cff66b6eaec"
def get_params(data):
    first=enc_params(data,g)
    second=enc_params(first,i)
    return second

def to_16(data):
    pad=16-len(data)%16
    data += chr(pad)*pad
    return data
def enc_params(data,key):
    iv='0102030405060708'
    data=to_16(data)
    # print(data)
    aes=AES.new(key=key.encode('utf-8'),IV=iv.encode('utf-8'),mode=AES.MODE_CBC)#创建加密器
    bs=aes.encrypt(data.encode('utf-8')) #加密,加密的内容长度必须是16的倍数  假设data='1234567890',长度差6位,那么要补6个chr(6),属于加密算法规定;
    return str(b64encode(bs),'utf-8')

resp=requests.post(url,data={
    'params':get_params(json.dumps(data)),
    'encSecKey':get_key()
})
resp=resp.text
# print(resp)

ex="content.*?,"

ret=re.findall(ex,resp)
print(ret)
with open('./网易云评论.txt','w',encoding='utf-8') as fp:
    for r in ret:
        fp.write(r+'\n')

#解析aes算法
'''
    function a(a=16) {
        var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";
        for (d = 0; a > d; d += 1) #循环16次
            e = Math.random() * b.length, #随机数
            e = Math.floor(e), #取整
            c += b.charAt(e); # 取字符串b中的e字符赋给c,并让c自增每次循环的字符;
        return c
    }
    function b(a, b) {   a是被加密项,因为c是密钥,b也是密钥
        var c = CryptoJS.enc.Utf8.parse(b)
          , d = CryptoJS.enc.Utf8.parse("0102030405060708")
          , e = CryptoJS.enc.Utf8.parse(a) #e是被加密数据
          , f = CryptoJS.AES.encrypt(e, c, { 这里缺少密钥,所有推导c是密钥
            iv: d, #偏移量
            mode: CryptoJS.mode.CBC #模式cbc加密方式
        });
        return f.toString()
    }
    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位随机值
        return 
        h.encText = b(d, g), 参数g传递给函数b的参数b,所有g是密钥
        h.encText = b(h.encText, i), i也是密钥,            返回的就是params,两次加密
        h.encSecKey = c(i, e, f), 得到的就是encseckey,e和f是固定的,一旦i固定,且c函数是固定算法,那么c固定
        h
    }
'''

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值