diff --git a/API_AimeDB.py b/API_AimeDB.py index ac74c0e..ae64111 100644 --- a/API_AimeDB.py +++ b/API_AimeDB.py @@ -5,7 +5,7 @@ import hashlib import time import requests -import json +from rapidjson import json import re # 常量 diff --git a/API_TitleServer.py b/API_TitleServer.py index 7f71941..e84855b 100644 --- a/API_TitleServer.py +++ b/API_TitleServer.py @@ -1,4 +1,4 @@ -# 舞萌DX 2024 +# 舞萌DX # 标题服务器通讯实现 import zlib @@ -11,8 +11,10 @@ from ctypes import c_int32 from Crypto.Cipher import AES from Crypto.Util.Padding import unpad from Config import * +import certifi # 舞萌DX 2024 +# omg it's leaking AesKey = "n7bx6:@Fg_:2;5E89Phy7AyIcpxEQ:R@" AesIV = ";;KjR1C3hgB1ovXa" ObfuscateParam = "BEs2D5vW" @@ -57,6 +59,8 @@ class AES_PKCS7(object): return text + padding_text def getSDGBApiHash(api): + # API 的 Hash 的生成 + # 有空做一下 Hash 的彩虹表? return hashlib.md5((api+"MaimaiChn"+ObfuscateParam).encode()).hexdigest() def apiSDGB(data:str, targetApi:str, userAgentExtraData:str, noLog:bool=False, timeout:int=5): @@ -91,7 +95,7 @@ def apiSDGB(data:str, targetApi:str, userAgentExtraData:str, noLog:bool=False, t "Expect": "100-continue" }, content=reqData_deflated, - verify=False, + verify=certifi.where(), timeout=timeout ) if not noLog: @@ -129,16 +133,16 @@ def apiSDGB(data:str, targetApi:str, userAgentExtraData:str, noLog:bool=False, t raise SDGBRequestError("请求格式错误") except SDGBResponseError as e: # 响应解析错误,重试但是只一次 - logger.warning(f"Will now retry. {e}") + logger.warning(f"将重试一次 Resp Err: {e}") retries += 2 time.sleep(2) except Exception as e: # 其他错误,重试 - logger.warning(f"Will now retry. {e}") + logger.warning(f"将开始重试请求. {e}") retries += 1 time.sleep(2) - raise SDGBApiError("Multiple retries failed to make a successful request") + raise SDGBApiError("重试多次仍然无法成功请求服务器") def calcSpecialNumber(): """使用 c_int32 实现的 SpecialNumber 算法""" diff --git a/ActionLoginBonus.py b/ActionLoginBonus.py index a984c91..309fd36 100644 --- a/ActionLoginBonus.py +++ b/ActionLoginBonus.py @@ -1,7 +1,7 @@ # ログインボーナス!やったね! # セガ秘 内部使用のみ(トレードマーク) -import json +from rapidjson import json from loguru import logger from Config import * diff --git a/AuthLite_GetUpdate.py b/AuthLite_GetUpdate.py new file mode 100644 index 0000000..d6a38db --- /dev/null +++ b/AuthLite_GetUpdate.py @@ -0,0 +1 @@ +# It will be finished very soon, I promise diff --git a/Best50_To_Diving_Fish.py b/Best50_To_Diving_Fish.py index 333d081..c6cf921 100644 --- a/Best50_To_Diving_Fish.py +++ b/Best50_To_Diving_Fish.py @@ -7,14 +7,6 @@ from HelperMusicDB import getMusicTitle import requests -# 日志设置 -if False: - import sys - log_level = "DEBUG" - log_format = "{time:YYYY-MM-DD HH:mm:ss.SSS zz} | {level: <8} | Line {line: >4} ({file}): {message}" - logger.add(sys.stderr, level=log_level, format=log_format, colorize=True, backtrace=True, diagnose=True) - logger.add("file.log", level=log_level, format=log_format, colorize=False, backtrace=True, diagnose=True) - # 水鱼查分器的 API 地址 BASE_URL = 'https://www.diving-fish.com/api/maimaidxprober' @@ -79,18 +71,14 @@ def maimaiUserMusicDetailToDivingFishFormat(userMusicDetailList) -> list: divingFishList.append({ 'achievements': (currentMusicDetail['achievement'] / 10000), # 水鱼的成绩是 float 而非舞萌的 int 'title': currentMusicTitle, - 'type': notesType, # 我不理解这为什么不能在后端判断 + 'type': notesType, 'level_index': currentMusicDetail['level'], 'fc': COMBO_ID_TO_NAME[currentMusicDetail['comboStatus']], 'fs': SYNC_ID_TO_NAME[currentMusicDetail['syncStatus']], 'dxScore': currentMusicDetail['deluxscoreMax'], }) except: - logger.error(f"Fish Format Translate Error: {currentMusicDetail}") - - # debug output fish list to file - #with open("fishList.txt", "w", encoding="utf-8") as f: - # f.write(str(divingFishList)) + logger.error(f"无法将 UserMusic 翻译成水鱼格式: {currentMusicDetail}") return divingFishList @@ -106,7 +94,7 @@ def isVaildFishToken(importToken:str): def implUserMusicToDivingFish(userId:int, fishImportToken:str): '''上传所有成绩到水鱼的参考实现,返回成绩的数量或者False''' - logger.info("开始上传舞萌成绩到水鱼查分器!") + logger.info("开始尝试上传舞萌成绩到水鱼查分器!") userFullMusicDetailList = getUserFullMusicDetail(userId) logger.info("成功得到成绩!转换成水鱼格式..") divingFishData = maimaiUserMusicDetailToDivingFishFormat(userFullMusicDetailList) diff --git a/ChargeTicket.py b/ChargeTicket.py index 3ee6deb..f27cbe1 100644 --- a/ChargeTicket.py +++ b/ChargeTicket.py @@ -1,5 +1,5 @@ # 倍票相关 API 的实现 -import json +from rapidjson import json import pytz from datetime import datetime, timedelta diff --git a/ForceLogout.py b/ForceLogout.py index d203b7c..3453345 100644 --- a/ForceLogout.py +++ b/ForceLogout.py @@ -5,7 +5,7 @@ from Config import * from API_TitleServer import * from GetPreview import apiGetUserPreview from HelperLogInOut import apiLogout -import json +from rapidjson import json from loguru import logger import time from datetime import datetime @@ -25,10 +25,10 @@ def getHumanReadableTime(unixTime): def getMaimaiUNIXTime(mmddhhmmss, year=2025): """ 解析用户输入的 MMDDHHMMSS 格式的时间,返回 Unix 时间戳 - 时间会被推后一个小时,因为舞萌貌似是 UTC+9 + 时间会被推后一个小时,因为舞萌貌似是 UTC+9? """ #date_time_str = f"{year}{mmddhhmmss}" - # 舞萌需要把小时按往后推一个小时来计算,加上一个小时 + # 加上一个小时 date_time_str = f"{year}{mmddhhmmss[:4]}{int(mmddhhmmss[4:6])+1:02}{mmddhhmmss[6:]}" date_time_obj = datetime.strptime(date_time_str, '%Y%m%d%H%M%S') # 将 datetime 对象转换为 Unix 时间戳 diff --git a/GetPreview.py b/GetPreview.py index 9932771..3a2a462 100644 --- a/GetPreview.py +++ b/GetPreview.py @@ -1,6 +1,6 @@ # 获取用户简略预览数据的 API 实现,此 API 无需任何登录即可调取 -import json +from rapidjson import json from API_TitleServer import apiSDGB from Config import * import time @@ -19,8 +19,12 @@ if __name__ == "__main__": userId = testUid2 print(apiGetUserPreview(userId)) +### +### 以下仅留作归档 +### def crawlAllUserPreview(): + """omg it's a evil crawler""" # 这里设置开始和结束的 UserId BeginUserId = 11000000 EndUserId = 12599999 diff --git a/HelperFullPlay.py b/HelperFullPlay.py index d6abf95..3beb4d7 100644 --- a/HelperFullPlay.py +++ b/HelperFullPlay.py @@ -1,4 +1,4 @@ -import json +from rapidjson import json from loguru import logger from Config import * diff --git a/HelperGetUserMusicDetail.py b/HelperGetUserMusicDetail.py index f6cac3f..e3bc97a 100644 --- a/HelperGetUserMusicDetail.py +++ b/HelperGetUserMusicDetail.py @@ -2,7 +2,7 @@ from API_TitleServer import * from HelperLogInOut import apiLogin, apiLogout, generateTimestamp from Config import * -import json +from rapidjson import json from HelperMusicDB import getMusicTitle from loguru import logger import sys diff --git a/HelperGetUserThing.py b/HelperGetUserThing.py index c19898b..7d0e850 100644 --- a/HelperGetUserThing.py +++ b/HelperGetUserThing.py @@ -1,6 +1,6 @@ # 获取用户数据的 API 实现 from loguru import logger -import json +from rapidjson import json from API_TitleServer import apiSDGB def apiGetUserData(userId:int) -> str: diff --git a/HelperLogInOut.py b/HelperLogInOut.py index 7a8671d..fa3ad63 100644 --- a/HelperLogInOut.py +++ b/HelperLogInOut.py @@ -1,7 +1,7 @@ # 登录·登出实现 # 一般作为模块使用,但也可以作为 CLI 程序运行以强制登出账号。 -import json +from rapidjson import json import time from loguru import logger diff --git a/HelperMisc.py b/HelperMisc.py index 33eea82..229738b 100644 --- a/HelperMisc.py +++ b/HelperMisc.py @@ -1,6 +1,6 @@ # 杂项助手函数 # 主要用于当作模块使用的时候的一些生活质量提升 -import json +from rapidjson import json from loguru import logger from HelperGetUserThing import implGetUser_ import unicodedata diff --git a/HelperUploadUserPlayLog.py b/HelperUploadUserPlayLog.py index 931fe76..f1a4d8c 100644 --- a/HelperUploadUserPlayLog.py +++ b/HelperUploadUserPlayLog.py @@ -1,6 +1,6 @@ # 上传一个占位用的游玩记录的 API 实现 -import json +from rapidjson import json import pytz import time import random diff --git a/Standalone/DummyAimeDBServer.py b/Standalone/DummyAimeDBServer.py index 308af94..7990bea 100644 --- a/Standalone/DummyAimeDBServer.py +++ b/Standalone/DummyAimeDBServer.py @@ -29,7 +29,7 @@ from fastapi.responses import ( PlainTextResponse, JSONResponse ) -import json +from rapidjson import json import uvicorn from loguru import logger diff --git a/Standalone/Script_GenerateMusicDB.py b/Standalone/Script_GenerateMusicDB.py index 491b159..dd5105c 100644 --- a/Standalone/Script_GenerateMusicDB.py +++ b/Standalone/Script_GenerateMusicDB.py @@ -1,7 +1,7 @@ # 感谢伟大的 Diving-Fish 让我被迫直面恐惧 import xml.dom.minidom as minidom from pathlib import Path -import json +from rapidjson import json from loguru import logger def makeMusicDBJson(): diff --git a/Standalone/UI.py b/Standalone/UI.py index 75e7e96..e67cc49 100644 --- a/Standalone/UI.py +++ b/Standalone/UI.py @@ -1,5 +1,5 @@ import sys -import json +from rapidjson import json from PyQt6.QtWidgets import ( QApplication, QMainWindow, QWidget, QVBoxLayout, QLineEdit, QTextEdit, QPushButton, QLabel, QHBoxLayout