编辑代码

import re
from base64 import b64decode
from json import loads
from pprint import pp
# import httpx

def _decrypt(data:str, num:int=3) -> list | dict:
    """
    json数据解密
    """
    def int_overflow(val):
        """
        这个函数可以得到32位int溢出结果
        因为python的int一旦超过宽度就会自动转为long,永远不会溢出
        有的结果却需要溢出的int作为参数继续参与运算(例如JavaScript)
        """
        maxint = 2147483647
        if not -maxint-1 <= val <= maxint:
            val = (val + (maxint + 1)) % (2 * (maxint + 1)) - maxint - 1
        return val

    def unsigned_right_shitf(n, i):
        """
        实现JavaScript,负数的无符号右移>>>
        """
        # 数字小于0,则转为32位无符号uint
        if n < 0:
            n = c_uint32(n).value
        # 正常位移位数是为正数,但是为了兼容js之类的,负数就右移变成左移好了
        if i < 0:
            return -int_overflow(n << abs(i))
        return int_overflow(n >> i)

    def decode(data:str):
        """
        """
        # chunk-vendors.6dde4461.js,2895,k = function(t)
        # 实际效果是去除字符串最后的==
        if "-" in data:
            data = data.replace("-", "+")
        if "_" in data:
            data = data.replace("_", "/")
        pattern = re.compile(r'[^A-Za-z0-9\+\/]')
        if pattern.search(data):
            data = pattern.sub("", data)

        # chunk-vendors.6dde4461.js,2886,n.atob(t)
        # 实际调用window.atob()进行base64解码,python下需要最后的==,所以得手动补上
        if not data.endswith("=="):
            data += "=="
        data = b64decode(data).decode()

        # chunk-vendors.6dde4461.js,2877,t.replace(b, _)
        pattern = re.compile(r'[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}')  # 部分utf-8字符集
        if pattern.search(data):
            length = len(data)
            # u = String.fromCharCode,python为chr
            # String.charCodeAt,python为ord(str[index])
            if length == 4:
                e = (7 & ord(data[0])) << 18 | (63 & ord(data[1])) << 12 | (63 & ord(data[2])) << 6 | 63 & ord(data[3])
                n = e - 65536
                repl = chr( 55296 + unsigned_right_shitf(n, 10) ) + chr( 56320 + (1023 & n) )
            elif length == 3:
                repl = chr( (15 & ord(data[0])) << 12 | (63 & ord(data[1])) << 6 | 63 & ord(data[2]) )
            else:
                repl = chr( 31 & ord(data[0]) << 6 | 63 & ord(data[1]) )
            data = pattern.sub(repl, data)
        return data

    for __ in range(num):
        data = decode(data)
    return loads(data)

data = (
    # "WW01V2MySkJQVDA9"  # None
    ""
)
pp(_decrypt(data))