网易云API请求body分析 【一】

import random

import math

from Crypto.Cipher import AES

import codecs

import base64



class niub:
    def __init__(self):

        self.key = '0CoJUm6Qyw8W8jud'

        self.f = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'

        self.e = '010001'

        self.singer_id = '1411492497'

        self.post_url1 = 'https://music.163.com/weapi/user/getfolloweds?csrf_token='

        self.post_url2 = 'https://music.163.com/weapi/v1/play/record?csrf_token='

    # 生成16个随机字符

    def _generate_random_strs(self, length):

        string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

        # 控制次数参数i

        i = 0

        # 初始化随机字符串

        random_strs = ""

        while i < length:
            e = random.random() * len(string)

            # 向下取整

            e = math.floor(e)

            random_strs = random_strs + list(string)[e]

            i = i + 1

        return random_strs

    # AES加密

    def _AESencrypt(self, msg, key):

        # 如果不是16的倍数则进行填充(paddiing)

        padding = 16 - len(msg) % 16

        msg = msg + padding * chr(padding)

        # 用来加密或者解密的初始向量(必须是16位)

        iv = '0102030405060708'

        Cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8'))

        # 加密后得到的是bytes类型的数据

        encryptedbytes = Cipher.encrypt(msg.encode('utf8'))

        # 使用Base64进行编码,返回byte字符串

        encodestrs = base64.b64encode(encryptedbytes)

        # 对byte字符串按utf-8进行解码

        enctext = encodestrs.decode('utf-8')

        return enctext

    # RSA加密

    def _RSAencrypt(self, randomstrs, key, f):

        # 随机字符串逆序排列

        string = randomstrs[::-1]

        # 将随机字符串转换成byte类型数据

        text = bytes(string, 'utf-8')

        seckey = int(codecs.encode(text, encoding='hex'), 16) ** int(key, 16) % int(f, 16)

        return format(seckey, 'x').zfill(256)

    def _get_params1(self, page):

        offset = (page - 1) * 20

        msg = '{"userId": "1411492497", "offset":' + str(offset) + ', "total": "false", "limit": "20", "csrf_token": ""}'

        enctext = self._AESencrypt(msg, self.key)

        # 生成长度为16的随机字符串

        i = self._generate_random_strs(16)

        # 两次AES加密之后得到params的值

        encText = self._AESencrypt(enctext, i)

        # RSA加密之后得到encSecKey的值

        encSecKey = self._RSAencrypt(i, self.e, self.f)

        return encText, encSecKey



    def start_requests(self):
        params, encSecKey = self._get_params1(0)
        liebiao = []

        formdata = {

            'params': params, 'encSecKey': encSecKey

        }




        return formdata


if __name__ == '__main__':
    x = niub()
    msg = '{"userId": "1411492497", "offset":"1", "total": "false", "limit": "20", "csrf_token": ""}'
    key = '0CoJUm6Qyw8W8jud'
    # print(x.start_requests())
    heji = []
    heji1 = []

    #print(i)
    for i in range(51, 53):  #控制生成params, encSecKey   heji =params   heji1=encSecKey
        data = x._get_params1(i)
        heji.append(data[0])
        heji1.append(data[1])


    print(heji)
    print(heji1)
    print(heji[0])#params
    print(heji1[1])# encSecKey






    #print(data['params'])
    #print(data['encSecKey'])









   

首先谷歌浏览器抓包网易云网站:得到请求body

 

 然后在去代码里找params,encSecKey,找到后,写python代码,就可以通用网易云所有请求。上面代码就是根据页码生成params,encSecKey。

posted @ 2020-10-02 15:54  凹凸曼大人  阅读(391)  评论(0)    收藏  举报