63 lines
2.1 KiB
Python
63 lines
2.1 KiB
Python
import asyncio
|
|
import httpx
|
|
import json
|
|
import logging
|
|
import time
|
|
from encrypt import *
|
|
|
|
# 配置日志,方便调试看请求顺序
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format='%(asctime)s - %(levelname)s - %(message)s'
|
|
)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class MaimaiClient:
|
|
def __init__(self):
|
|
self.base_url = f"https://maimai-gm.wahlap.com:42081/Maimai2Servlet/"
|
|
self.aes = aes_pkcs7(AesKey, AesIV)
|
|
|
|
async def call_api(self, client: httpx.AsyncClient, ApiType: str, data: dict, userId: int):
|
|
"""
|
|
先压缩再加密请求数据,发送请求后解密再解压响应数据
|
|
这里的 client 需要传入外部创建的 httpx.AsyncClient 实例
|
|
"""
|
|
|
|
ApiTypeHash = get_hash_api(ApiType)
|
|
url = f"{self.base_url}{ApiTypeHash}"
|
|
|
|
headers = {
|
|
"User-Agent": f"{ApiTypeHash}#{userId}",
|
|
"Content-Type": "application/json",
|
|
"Mai-Encoding": "1.53",
|
|
"Accept-Encoding": "",
|
|
"Charset": "UTF-8",
|
|
"Content-Encoding": "deflate",
|
|
"Host": "maimai-gm.wahlap.com:42081"
|
|
}
|
|
|
|
data = bytes(json.dumps(data), encoding="utf-8")
|
|
CompressedData = zlib.compress(data)
|
|
AESEncrptedData = self.aes.encrypt(CompressedData)
|
|
|
|
try:
|
|
# 这里的 timeout 设置稍微长一点,防止服务端处理慢
|
|
resp = await client.post(url, headers=headers, data=AESEncrptedData, timeout=10.0)
|
|
resp.raise_for_status() # 如果状态码不是 2xx 则抛出异常
|
|
|
|
AESEncrptedResponse = resp.content
|
|
DecryptedData = self.aes.decrypt(AESEncrptedResponse)
|
|
UncompressedData = zlib.decompress(DecryptedData).decode('utf-8')
|
|
|
|
logger.info(f"✅ [SUCCESS] {ApiType} - {UncompressedData}")
|
|
|
|
return UncompressedData
|
|
|
|
|
|
except httpx.HTTPStatusError as e:
|
|
logger.error(f"❌ [HTTP ERROR] {ApiType}: {e.response.status_code}")
|
|
return None
|
|
except Exception as e:
|
|
logger.error(f"❌ [ERROR] {ApiType}: {str(e)}")
|
|
return None
|