2025-03-28 18:23:30 +08:00
|
|
|
import base64
|
|
|
|
|
|
|
|
|
|
from loguru import logger
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CustomBase64:
|
|
|
|
|
"""自定义的Base64编码和解码"""
|
|
|
|
|
|
|
|
|
|
mapping = {
|
|
|
|
|
"Y": "V",
|
|
|
|
|
"X": "U",
|
|
|
|
|
"A": "Z",
|
|
|
|
|
"s": "p",
|
|
|
|
|
"J": "G",
|
|
|
|
|
"F": "C",
|
|
|
|
|
"U": "R",
|
|
|
|
|
"u": "r",
|
|
|
|
|
"W": "T",
|
|
|
|
|
"i": "f",
|
|
|
|
|
"V": "S",
|
|
|
|
|
"E": "B",
|
|
|
|
|
"2": "2",
|
|
|
|
|
"P": "M",
|
|
|
|
|
"C": "X",
|
|
|
|
|
"8": "8",
|
|
|
|
|
"r": "o",
|
|
|
|
|
"L": "I",
|
|
|
|
|
"H": "E",
|
|
|
|
|
"M": "J",
|
|
|
|
|
"j": "g",
|
|
|
|
|
"b": "y",
|
|
|
|
|
"p": "m",
|
|
|
|
|
"O": "L",
|
|
|
|
|
"l": "i",
|
|
|
|
|
"R": "O",
|
|
|
|
|
"G": "D",
|
|
|
|
|
"I": "F",
|
|
|
|
|
"y": "v",
|
|
|
|
|
"t": "q",
|
|
|
|
|
"0": "0",
|
|
|
|
|
"c": "x",
|
|
|
|
|
"Q": "N",
|
|
|
|
|
"7": "7",
|
|
|
|
|
"N": "K",
|
|
|
|
|
"3": "3",
|
|
|
|
|
"Z": "W",
|
|
|
|
|
"n": "k",
|
|
|
|
|
"1": "1",
|
|
|
|
|
"d": "a",
|
|
|
|
|
"5": "5",
|
|
|
|
|
"S": "P",
|
|
|
|
|
"K": "H",
|
|
|
|
|
"h": "e",
|
|
|
|
|
"k": "h",
|
|
|
|
|
"w": "t",
|
|
|
|
|
"T": "Q",
|
|
|
|
|
"4": "4",
|
|
|
|
|
"m": "j",
|
|
|
|
|
"z": "w",
|
|
|
|
|
"g": "d",
|
|
|
|
|
"D": "A",
|
|
|
|
|
"v": "s",
|
|
|
|
|
"B": "Y",
|
|
|
|
|
"/": "/",
|
|
|
|
|
"q": "n",
|
|
|
|
|
"f": "c",
|
|
|
|
|
"a": "z",
|
|
|
|
|
"9": "9",
|
|
|
|
|
"o": "l",
|
|
|
|
|
"e": "b",
|
|
|
|
|
"x": "u",
|
|
|
|
|
}
|
|
|
|
|
reverse_mapping = {
|
|
|
|
|
"V": "Y",
|
|
|
|
|
"U": "X",
|
|
|
|
|
"Z": "A",
|
|
|
|
|
"p": "s",
|
|
|
|
|
"G": "J",
|
|
|
|
|
"C": "F",
|
|
|
|
|
"R": "U",
|
|
|
|
|
"r": "u",
|
|
|
|
|
"T": "W",
|
|
|
|
|
"f": "i",
|
|
|
|
|
"S": "V",
|
|
|
|
|
"B": "E",
|
|
|
|
|
"2": "2",
|
|
|
|
|
"M": "P",
|
|
|
|
|
"X": "C",
|
|
|
|
|
"8": "8",
|
|
|
|
|
"o": "r",
|
|
|
|
|
"I": "L",
|
|
|
|
|
"E": "H",
|
|
|
|
|
"J": "M",
|
|
|
|
|
"g": "j",
|
|
|
|
|
"y": "b",
|
|
|
|
|
"m": "p",
|
|
|
|
|
"L": "O",
|
|
|
|
|
"i": "l",
|
|
|
|
|
"O": "R",
|
|
|
|
|
"D": "G",
|
|
|
|
|
"F": "I",
|
|
|
|
|
"v": "y",
|
|
|
|
|
"q": "t",
|
|
|
|
|
"0": "0",
|
|
|
|
|
"x": "c",
|
|
|
|
|
"N": "Q",
|
|
|
|
|
"7": "7",
|
|
|
|
|
"K": "N",
|
|
|
|
|
"3": "3",
|
|
|
|
|
"W": "Z",
|
|
|
|
|
"k": "n",
|
|
|
|
|
"1": "1",
|
|
|
|
|
"a": "d",
|
|
|
|
|
"5": "5",
|
|
|
|
|
"P": "S",
|
|
|
|
|
"H": "K",
|
|
|
|
|
"e": "h",
|
|
|
|
|
"h": "k",
|
|
|
|
|
"t": "w",
|
|
|
|
|
"Q": "T",
|
|
|
|
|
"4": "4",
|
|
|
|
|
"j": "m",
|
|
|
|
|
"w": "z",
|
|
|
|
|
"d": "g",
|
|
|
|
|
"A": "D",
|
|
|
|
|
"s": "v",
|
|
|
|
|
"Y": "B",
|
|
|
|
|
"/": "/",
|
|
|
|
|
"n": "q",
|
|
|
|
|
"c": "f",
|
|
|
|
|
"z": "a",
|
|
|
|
|
"9": "9",
|
|
|
|
|
"l": "o",
|
|
|
|
|
"b": "e",
|
|
|
|
|
"u": "x",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def decode(encoded):
|
|
|
|
|
std_encoded = "".join(CustomBase64.reverse_mapping.get(c, c) for c in encoded)
|
|
|
|
|
if not len(std_encoded) % 4 == 0:
|
|
|
|
|
std_encoded = std_encoded + "=" * (4 - len(std_encoded) % 4)
|
|
|
|
|
try:
|
|
|
|
|
decoded = base64.b64decode(std_encoded).decode()
|
|
|
|
|
return decoded
|
|
|
|
|
except Exception as e:
|
|
|
|
|
logger.error(f"解码错误: {e}")
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def encode(text):
|
|
|
|
|
std_encoded = base64.b64encode(text.encode()).decode()
|
|
|
|
|
custom_encoded = "".join(CustomBase64.mapping.get(c, c) for c in std_encoded)
|
2025-03-30 22:49:37 +08:00
|
|
|
return custom_encoded.replace("=", "")
|