2025适配 尚不稳定但是可能能用

This commit is contained in:
Remik1r3n
2025-06-12 22:23:52 +08:00
parent 465211ac96
commit f53dfef7ca
6 changed files with 89 additions and 108 deletions

View File

@@ -71,32 +71,29 @@ def getSDGBApiHash(api):
# 有空做一下 Hash 的彩虹表?
return hashlib.md5((api+"MaimaiChn"+ObfuscateParam).encode()).hexdigest()
def apiSDGB2(
def apiSDGB(
data: str,
targetApi: str,
userAgentExtraData: str,
noLog: bool = False,
timeout: int = 5,
useProxy: bool = False,
proxyUrl: Optional[str] = None
maxRetries: int = 3,
) -> str:
"""
舞萌DX API 通讯用函数(增强版)
舞萌DX 2025 API 通讯用函数
:param data: 请求数据
:param targetApi: 使用的 API
:param userAgentExtraData: UA 附加信息机台相关则为狗号如A63E01E9564用户相关则为 UID
:param noLog: 是否不记录日志
:param timeout: 请求超时时间(秒)
:param useProxy: 是否使用代理
:param proxyUrl: 代理地址(如果使用代理)
:return: 解码后的响应数据
"""
maxRetries = 3
# 处理参数
agentExtra = str(userAgentExtraData)
aes = aes_pkcs7(AesKey, AesIV) # Assuming aes_pkcs7, AesKey, AesIV are defined elsewhere
aes = aes_pkcs7(AesKey, AesIV)
endpoint = "https://maimai-gm.wahlap.com:42081/Maimai2Servlet/"
# Prepare request data
# 准备好请求数据
requestDataFinal = aes.encrypt(zlib.compress(data.encode('utf-8')))
if not noLog:
@@ -105,19 +102,17 @@ def apiSDGB2(
retries = 0
while retries < maxRetries:
try:
# Configure HTTP client
# 配置 HTTP 客户端
if useProxy and proxyUrl:
if not noLog:
logger.debug("使用代理")
logger.debug("使用代理")
httpClient = httpx.Client(proxy=proxyUrl, verify=False)
else:
if not noLog:
logger.debug("不使用代理")
logger.debug("不使用代理")
httpClient = httpx.Client(verify=False)
# Send request
# 发送请求
response = httpClient.post(
url=endpoint + getSDGBApiHash(targetApi), # Assuming getSDGBApiHash is defined
url=endpoint + getSDGBApiHash(targetApi),
headers={
"User-Agent": f"{getSDGBApiHash(targetApi)}#{agentExtra}",
"Content-Type": "application/json",
@@ -127,7 +122,7 @@ def apiSDGB2(
"Content-Encoding": "deflate",
"Expect": "100-continue"
},
content=requestDataFinal,
content=requestDataFinal, #数据
timeout=timeout
)
@@ -139,9 +134,10 @@ def apiSDGB2(
logger.error(errorMessage)
raise SDGBRequestError(errorMessage)
# Process response
# 处理响应内容
responseContentRaw = response.content
# 先尝试解密
try:
responseContentDecrypted = aes.decrypt(responseContentRaw)
if not noLog:
@@ -149,41 +145,28 @@ def apiSDGB2(
except Exception as e:
logger.warning(f"解密失败,原始响应: {responseContentRaw}, 错误: {e}")
raise SDGBResponseError("解密失败")
# 然后尝试解压
try:
# 检查 ResponseContentDecrypted 是否为 zlib 压缩格式
# 看看文件头是否正确
if not responseContentDecrypted.startswith(b'\x78\x9c'):
logger.warning("Not Zlib. Not decompressed.")
logger.warning("NOT ZLIB FORMAT")
raise Exception(f"响应内容不是 zlib 压缩格式, 内容: {responseContentDecrypted}")
responseContentFinal = zlib.decompress(responseContentDecrypted).decode('utf-8')
if not noLog:
logger.debug("成功解压响应!")
#logger.debug("成功解压响应!")
logger.debug(f"响应: {responseContentFinal}")
return responseContentFinal
except zlib.error as e:
logger.warning(f"解压失败,原始响应: {responseContentDecrypted}, 错误: {e}")
except:
logger.warning(f"解压失败,原始响应: {responseContentDecrypted}")
raise SDGBResponseError("解压失败")
# If decompression fails after attempts, trigger a retry of the entire request
retries += 1
if retries < maxRetries:
logger.warning(f"解压失败,将重试请求 (第 {retries + 1}/{maxRetries} 次)")
time.sleep(2)
continue
raise SDGBResponseError("多次尝试后仍无法解压响应")
except SDGBRequestError as e:
# Request format error, no retry
logger.error(f"请求格式错误: {e}")
raise
except SDGBResponseError as e:
# Response parsing error, retry once more
logger.warning(f"响应错误,将重试: {e}")
retries += 1
time.sleep(2)
except Exception as e:
# Other errors, retry
logger.warning(f"请求失败,将重试: {e}")
retries += 1
time.sleep(2)
@@ -207,43 +190,8 @@ def calcPlaySpecial():
num2 >>= 1
return c_int32(result.value).value
"""
DEPRECATED: 旧的 SpecialNumber 算法
def calcSpecialNumber2():
max = 1037933
num2 = random.randint(1, max) * 2069
num2 += 1024 # specialnum
num3 = 0
for i in range(0, 32):
num3 <<= 1
num3 += num2 % 2
num2 >>= 1
return num3
"""
# 舞萌DX 2024
# omg it's leaking
AesKey = "n7bx6:@Fg_:2;5E89Phy7AyIcpxEQ:R@"
AesIV = ";;KjR1C3hgB1ovXa"
ObfuscateParam = "BEs2D5vW"
class SDGBApiError(Exception):
pass
class SDGBRequestError(SDGBApiError):
pass
class SDGBResponseError(SDGBApiError):
pass
class AESPKCS7:
class AESPKCS7_2024:
# 实现了 maimai 通讯所用的 AES 加密的类
def __init__(self, key: str, iv: str):
self.key = key.encode('utf-8')
@@ -265,7 +213,7 @@ class AESPKCS7:
decrypted = unpad(decrypted_padded, AES.block_size)
return decrypted
def apiSDGB(data:str, targetApi:str, userAgentExtraData:str, noLog:bool=False, timeout:int=5):
def apiSDGB_2024(data:str, targetApi:str, userAgentExtraData:str, noLog:bool=False, timeout:int=5):
"""
舞萌DX 2024 API 通讯用函数
:param data: 请求数据
@@ -275,7 +223,7 @@ def apiSDGB(data:str, targetApi:str, userAgentExtraData:str, noLog:bool=False, t
"""
maxRetries = 3
agentExtra = str(userAgentExtraData)
aes = AESPKCS7(AesKey, AesIV)
aes = AESPKCS7_2024(AesKey, AesIV)
reqData_encrypted = aes.encrypt(data)
reqData_deflated = zlib.compress(reqData_encrypted)
endpoint = "https://maimai-gm.wahlap.com:42081/Maimai2Servlet/"