import re
from base64 import b64decode
from json import loads
from pprint import pp
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,负数的无符号右移>>>
"""
if n < 0:
n = c_uint32(n).value
if i < 0:
return -int_overflow(n << abs(i))
return int_overflow(n >> i)
def decode(data:str):
"""
"""
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)
if not data.endswith("=="):
data += "=="
data = b64decode(data).decode()
pattern = re.compile(r'[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}')
if pattern.search(data):
length = len(data)
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 = (
""
)
pp(_decrypt(data))