diff --git a/action/UnlockMusic.py b/action/UnlockMusic.py new file mode 100644 index 0000000..ff93663 --- /dev/null +++ b/action/UnlockMusic.py @@ -0,0 +1,138 @@ +import json +import asyncio +import logging + +import httpx + +from sdgb import MaimaiClient +from sdgb.settings import userId, musicData +from sdgb.payload import ( + requestData_UserLogin, + requestData_UserLogout, + requestData_UserPreview, + requestData_UserData, + UserAll_payload, +) + +maimai = MaimaiClient() + + +logging.basicConfig( + level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s" +) +logger = logging.getLogger(__name__) + + +async def run_workflow( + self: MaimaiClient, + musicId: int, + unlock_music: bool = True, + unlock_master: bool = False, + unlock_remaster: bool = False, +): + + async with httpx.AsyncClient(verify=False) as client: + # Preview 探测 + + PreviewResponse = json.loads( + await self.call_api( + client, "GetUserPreviewApi", requestData_UserPreview, userId + ) + ) + if PreviewResponse["isLogin"]: + logger.error("已在他处登录。") + return + + # UserLogin + + LoginResponse = json.loads( + await self.call_api(client, "UserLoginApi", requestData_UserLogin, userId) + ) + if LoginResponse["returnCode"] != 1: + logger.error("login failed.") + return + + loginId = LoginResponse["loginId"] + loginDate = LoginResponse["lastLoginDate"] + + # UserData 等 + + tasks = [ + self.call_api(client, "GetUserDataApi", requestData_UserData, userId), + self.call_api(client, "GetUserExtendApi", requestData_UserData, userId), + self.call_api(client, "GetUserOptionApi", requestData_UserData, userId), + self.call_api(client, "GetUserRatingApi", requestData_UserData, userId), + self.call_api(client, "GetUserChargeApi", requestData_UserData, userId), + self.call_api(client, "GetUserActivityApi", requestData_UserData, userId), + self.call_api( + client, "GetUserMissionDataApi", requestData_UserData, userId + ), + ] + + GeneralUserInfo = await asyncio.gather(*tasks) + await asyncio.sleep(60) # 模拟游戏时间 + + # UserAll + + requestData_UserAll = UserAll_payload( + loginId, loginDate, musicData, GeneralUserInfo + ) + + userItemList = [] + + if unlock_music: + userItemList.append( + 0, + { + "itemKind": 5, # MUSIC + "itemId": musicId, + "stock": 1, + "isValid": True, + }, + ) + + if unlock_master: + userItemList.append( + 0, + { + "itemKind": 6, + "itemId": musicId, # MASTER + "stock": 1, + "isValid": True, + }, + ) + + if unlock_remaster: + userItemList.append( + { + "itemKind": 7, + "itemId": musicId, # RE: MASTER + "stock": 1, + "isValid": True, + } + ) + + requestData_UserAll |= { + "userMusicDetailList": [musicData], + "isNewMusicDetailList": "1", + "userItemList": userItemList, + "isNewItemList": len(userItemList) * "1", + } + + await self.call_api(client, "UpsertUserAllApi", requestData_UserAll, userId) + + # UserLogout + + await self.call_api(client, "UserLogoutApi", requestData_UserLogout, userId) + + +if __name__ == "__main__": + asyncio.run( + run_workflow( + maimai, + musicId=834, + unlock_music=False, + # unlock_master=True, + unlock_remaster=True, + ) + ) diff --git a/src/sdgb/.settings.py b/src/sdgb/.settings.py index 61082d6..76a551e 100644 --- a/src/sdgb/.settings.py +++ b/src/sdgb/.settings.py @@ -5,17 +5,18 @@ userId = ... qrCode = ... musicData = { - "musicId": 417, - "level": 3, + "musicId": 11538, # Amber Chronicle + "level": 0, "playCount": 1, - "achievement": 1010000, - "comboStatus": 4, - "syncStatus": 4, - "deluxscoreMax": 2277, - "scoreRank": 13, + "achievement": 0, + "comboStatus": 0, + "syncStatus": 0, + "deluxscoreMax": 0, + "scoreRank": 0, "extNum1": 0, } + regionId = 1 regionName = "北京" placeId = 1403