# 获取用户成绩的各种实现 import rapidjson as json from loguru import logger from HelperMusicDB import getMusicTitle from API_TitleServer import apiSDGB from MyConfig import testUid # 日志设置 # 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) def getUserMusicDetail(userId: int, nextIndex: int = 0, maxCount: int = 50) -> dict: """获取用户的成绩的API""" data = json.dumps( {"userId": int(userId), "nextIndex": nextIndex, "maxCount": maxCount} ) return json.loads(apiSDGB(data, "GetUserMusicApi", userId)) def getUserFullMusicDetail(userId: int): """获取用户的全部成绩""" currentUserMusicDetailList = [] nextIndex: int | None = None # 初始化 nextIndex while nextIndex != 0 or nextIndex is None: # 只要还有nextIndex就一直获取获取 userMusicResponse = getUserMusicDetail(userId, nextIndex or 0) nextIndex = userMusicResponse["nextIndex"] logger.info(f"NextIndex: {nextIndex}") # 处理已经没有 userMusicList 的情况 if not userMusicResponse["userMusicList"]: break # 只要还有 userMusicList 就一直加进去,直到全部获取完毕 for currentMusic in userMusicResponse["userMusicList"]: for currentMusicDetail in currentMusic["userMusicDetailList"]: if not currentMusicDetail["playCount"] > 0: continue currentUserMusicDetailList.append(currentMusicDetail) return currentUserMusicDetailList def parseUserFullMusicDetail(userFullMusicDetailList: list): """解析用户的全部成绩,给出一个迫真人类可读 list 套 dict""" musicDetailList = [] for currentMusicDetail in userFullMusicDetailList: musicDetailList.append( { "歌名": getMusicTitle(currentMusicDetail["musicId"]), "难度": currentMusicDetail["level"], "分数": currentMusicDetail["achievement"] / 10000, "DX分数": currentMusicDetail["deluxscoreMax"], } ) return musicDetailList if __name__ == "__main__": userId = testUid userFullMusicDetailList = getUserFullMusicDetail(userId) parsedUserFullMusicDetail = parseUserFullMusicDetail(userFullMusicDetailList) logger.info(parsedUserFullMusicDetail)