From 5c7414d173630c927a31e0c9a729287bcaefdae3 Mon Sep 17 00:00:00 2001 From: Remik1r3n Date: Fri, 7 Feb 2025 16:57:41 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=B0=8F=E9=BB=91=E5=B1=8B=E7=AC=AC?= =?UTF-8?q?=E4=B8=80=E7=89=88=20+=20=E7=88=ACUID=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ForceLogout.py | 75 ++++++++++++++++++--------------- GetPreview.py | 6 +-- HelperLogInOut.py | 17 ++++---- Standalone/DummyAimeDBServer.py | 14 +++++- 4 files changed, 66 insertions(+), 46 deletions(-) diff --git a/ForceLogout.py b/ForceLogout.py index a926724..22a0261 100644 --- a/ForceLogout.py +++ b/ForceLogout.py @@ -10,15 +10,20 @@ from loguru import logger import time from datetime import datetime - def isUserLoggedIn(userId): - return True - return json.loads(apiGetUserPreview(userId))['isLogin'] + isLogin = json.loads(apiGetUserPreview(userId))['isLogin'] + logger.info(f"用户 {userId} 是否登录: {isLogin}") + return isLogin -def getUNIXTime(mmddhhmmss, year=2025): - # 解析 MMDDHHMMSS 格式的时间,返回 Unix 时间戳 +def getMaimaiUNIXTime(mmddhhmmss, year=2025): + """ + 解析用户输入的 MMDDHHMMSS 格式的时间,返回 Unix 时间戳 + 时间会被推后一个小时,因为舞萌貌似是 UTC+9 + """ try: - date_time_str = f"{year}{mmddhhmmss}" + #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 时间戳 unix_timestamp = int(time.mktime(date_time_obj.timetuple())) @@ -29,27 +34,27 @@ def getUNIXTime(mmddhhmmss, year=2025): return None def logOut(userId, Timestamp): - DEBUGMODE = True - if DEBUGMODE: - # 用于调试的时间戳 - debugRealTimestamp = 1738663945 - logger.info(f"调试模式: 传入的时间戳和调试时间戳之差: {Timestamp - debugRealTimestamp}") - time.sleep(0.2) - return True + """极其简单的登出实现,成功返回 True,失败返回 False + 注意:不会检查用户是否真的登出了,只会尝试登出""" try: - result = apiLogout(Timestamp, userId) - loadedResult = json.loads(result) - if loadedResult['returnCode'] == 1: + if apiLogout(Timestamp, userId)['returnCode'] == 1: + # 成功送出了登出请求 + logger.debug(f"已成功尝试登出用户 {userId}") return True except: + logger.error(f"登出用户 {userId} 的时候发生了错误") return False def isCorrectTimestamp(timestamp, userId): - '''暴力的检查时间戳是否正确''' - logoutResult = logOut(userId, timestamp) - if not logoutResult: + ''' + 动作:给定一个时间戳,用它尝试登出用户,然后检查用户是否成功登出。 + 如果用户成功登出,返回 True;否则返回 False。 + ''' + if not logOut(userId, timestamp): + logger.error(f"用时间戳 {timestamp} 登出用户 {userId} 的时候发生了错误") return False isLoggedOut = not isUserLoggedIn(userId) + logger.debug(f"时间戳 {timestamp} 是否正确: {isLoggedOut}") return isLoggedOut def findCorrectTimestamp(timestamp, userId, max_attempts=1200): @@ -59,28 +64,32 @@ def findCorrectTimestamp(timestamp, userId, max_attempts=1200): while attempts < max_attempts: # 尝试当前时间戳 - if isCorrectTimestamp(timestamp, userId): - print(f"Found correct timestamp: {timestamp}") - return timestamp + currentTryTimestamp = timestamp + if isCorrectTimestamp(currentTryTimestamp, userId): + logger.info(f"正确的时间戳: {currentTryTimestamp}") + return currentTryTimestamp # 增加偏移量尝试 - if isCorrectTimestamp(timestamp + offset, userId): - print(f"Found correct timestamp: {timestamp + offset}") - return timestamp + offset + currentTryTimestamp = timestamp + offset + if isCorrectTimestamp(currentTryTimestamp, userId): + logger.info(f"正确的时间戳(在给定时间以后): {currentTryTimestamp}") + return currentTryTimestamp # 减少偏移量尝试 - if isCorrectTimestamp(timestamp - offset, userId): - print(f"Found correct timestamp: {timestamp - offset}") - return timestamp - offset + currentTryTimestamp = timestamp - offset + if isCorrectTimestamp(currentTryTimestamp, userId): + logger.info(f"正确的时间戳(在给定时间以前): {currentTryTimestamp}") + return currentTryTimestamp # 增加尝试次数和偏移量 attempts += 2 offset += 1 - print("尝试多次后未找到正确时间戳") + logger.error(f"无法找到正确的时间戳,尝试次数超过了 {max_attempts}") return None -human_time = "0204061500" -beginTimestamp = getUNIXTime(human_time) -print(f"我们将开始用这个时间戳开始尝试: {beginTimestamp}") -correctTimestamp = findCorrectTimestamp(beginTimestamp, testUid) +if __name__ == "__main__": + human_time = "0207155500" + beginTimestamp = getMaimaiUNIXTime(human_time) + print(f"我们将开始用这个时间戳开始尝试: {beginTimestamp}") + correctTimestamp = findCorrectTimestamp(beginTimestamp, testUid2) diff --git a/GetPreview.py b/GetPreview.py index d46ec56..f3aba54 100644 --- a/GetPreview.py +++ b/GetPreview.py @@ -16,7 +16,7 @@ def apiGetUserPreview(userId) -> str: # CLI 示例 if __name__ == "__main__": #userId = input("请输入用户 ID:") - userId = testUid + userId = testUid2 print(apiGetUserPreview(userId)) @@ -47,5 +47,5 @@ def crawlAllUserPreview(): print('Finished!') -if __name__ == "__main__": - crawlAllUserPreview() +#if __name__ == "__main__": +# crawlAllUserPreview() diff --git a/HelperLogInOut.py b/HelperLogInOut.py index 5c718ad..cfec1e5 100644 --- a/HelperLogInOut.py +++ b/HelperLogInOut.py @@ -8,8 +8,8 @@ from loguru import logger from Config import * from API_TitleServer import apiSDGB -def apiLogin(timestamp:int, userId:int) -> dict: - """登录,返回服务器给的 Json 的 dict""" +def apiLogin(timestamp:int, userId:int, noLog:bool=False) -> dict: + """登录,返回 dict""" data = json.dumps({ "userId": userId, "accessCode": "", @@ -21,11 +21,12 @@ def apiLogin(timestamp:int, userId:int) -> dict: "genericFlag": 0, }) login_result = json.loads(apiSDGB(data, "UserLoginApi", userId)) - logger.info("登录:结果:"+ str(login_result)) + if not noLog: + logger.info("登录:结果:"+ str(login_result)) return login_result -def apiLogout(timestamp:int, userId:int) -> dict: - """登出,返回 Json dict""" +def apiLogout(timestamp:int, userId:int, noLog:bool=False) -> dict: + """登出,返回 dict""" data = json.dumps({ "userId": userId, "accessCode": "", @@ -36,12 +37,12 @@ def apiLogout(timestamp:int, userId:int) -> dict: "type": 1 }) logout_result = json.loads(apiSDGB(data, "UserLogoutApi", userId)) - logger.info("登出:结果:"+ str(logout_result)) + if not noLog: + logger.info("登出:结果:"+ str(logout_result)) return logout_result - def generateTimestamp() -> int: - """生成时间戳""" + """生成一个凑合用的时间戳""" timestamp = int(time.time()) - 60 logger.info(f"生成时间戳: {timestamp}") return timestamp diff --git a/Standalone/DummyAimeDBServer.py b/Standalone/DummyAimeDBServer.py index 8d9cc5c..308af94 100644 --- a/Standalone/DummyAimeDBServer.py +++ b/Standalone/DummyAimeDBServer.py @@ -8,8 +8,18 @@ # 0 返回本地生成的假结果 # 1 原样返回官方服务器的结果 useOfficialServer = 0 -# 本地生成假结果时候,总是返回这个UID -DUMMY_USER_ID = 10086 + +from loguru import logger +# 解析命令行参数,作为用户 ID +import argparse +try: + parser = argparse.ArgumentParser(description="舞萌DX AimeDB 服务器模拟实现") + parser.add_argument("userId", type=int, help="用户 ID") + args = parser.parse_args() + DUMMY_USER_ID = args.userId +except: + logger.warning("未传入用户 ID,使用默认值") + DUMMY_USER_ID = 1 from fastapi import ( FastAPI,