diff --git a/character.py b/character.py deleted file mode 100644 index 5e10762..0000000 --- a/character.py +++ /dev/null @@ -1,17 +0,0 @@ -import json - -from sdgb import sdgb_api - -def character(userId): - data = json.dumps({ - "userId": int(userId), - "nextIndex":10000000000, - "maxCount":1000000000 - }) - - character_result = json.loads(sdgb_api(data, "GetUserCharacterApi", userId)) - - return character_result - -if __name__ == "__main__": - print(character(int(input()))) \ No newline at end of file diff --git a/charge.py b/charge.py deleted file mode 100644 index 0ab05f7..0000000 --- a/charge.py +++ /dev/null @@ -1,13 +0,0 @@ -import json - -from sdgb import sdgb_api - -def charge(userId): - data = json.dumps({ - "userId": userId, - }) - - charge_result = json.loads(sdgb_api(data, "GetUserChargeApi", userId)) - - return charge_result - diff --git a/item.py b/item.py deleted file mode 100644 index bf86c70..0000000 --- a/item.py +++ /dev/null @@ -1,18 +0,0 @@ -import json - -from sdgb import sdgb_api - -def item(userId): - data = json.dumps({ - "userId": int(userId), - "nextIndex":60000000000, - "maxCount":1000000000 - }) - - item_result = json.loads(sdgb_api(data, "GetUserItemApi", userId)) - - return item_result - -if __name__ == "__main__": - a = json.dumps(len(item(11593052)['userItemList'])) - print(a) \ No newline at end of file diff --git a/login_bonus.py b/login_bonus.py deleted file mode 100644 index d1d5f60..0000000 --- a/login_bonus.py +++ /dev/null @@ -1,16 +0,0 @@ -import json - -from sdgb import sdgb_api - -def item(userId): - data = json.dumps({ - "userId": int(userId), - "nextIndex":0, - "maxCount":2000 - }) - - login_bonus_result = json.loads(sdgb_api(data, "GetUserLoginBonusApi", userId)) - - return login_bonus_result - -print(item(11593052)) \ No newline at end of file diff --git a/main.py b/main.py index 17b6045..9361782 100644 --- a/main.py +++ b/main.py @@ -5,125 +5,17 @@ from datetime import datetime from flask import Flask,request,redirect,jsonify from flask_cors import CORS -from sdgb import felica, sdgb_api, aimedb_api from logout import logout from login import login -from ticket import get_ticket -from charge import charge -from map import map -from userdata import userdata -from character import character +from process import * +from sdgb import sdgb_api, felica from mapstock import music_with_retry as mapstock from music import music_with_retry as music from unlock_all import music_with_retry as unlock from map_clear import music_with_retry as map_clear from bonus9 import music_with_retry as login_bonus -def find_map(mapId, user_map_data): - for single in user_map_data: - if single["mapId"] == mapId: - return single - else: - continue - -def isNewMapList(mapId, user_map_data): - if ('{"mapId": ' + str(mapId)) in user_map_data: - return 0 - else: - return 1 - -def item(item_data, user_character_list): - item_list = [] - character_list = [] - for single in item_data: - if single['kind'] == 9: - if ('{"characterId": ' + str(single['id'])) in user_character_list: - pass - else: - data = ({ - "characterId":single['id'], - "level":1, - "awakening":0, - "useCount": 0 - }) - character_list.append(data) - else: - data = ({ - "itemKind": single['kind'], - "itemId": single['id'], - "stock": 1, - "isValid": True - }) - item_list.append(data) - return item_list, character_list, item_data[-1]['distance'] - -def aimedb_userId(IDm): - return aimedb_api(felica(IDm)), felica(IDm) - - -def bonus_list_gen(userId): - with open('login_bonus.json') as file: - cache = json.load(file) - bonus_data = [] - for item in cache: - bonus_data.append(item['id']) - cache = [] - data = json.dumps({ - "userId": int(userId), - "nextIndex":0, - "maxCount":2000 - }) - user_bonus = json.loads(sdgb_api(data, "GetUserLoginBonusApi", userId))['userLoginBonusList'] - for item in user_bonus: - cache.append(item['bonusId']) - bonus_list_unexist = list(set(bonus_data) - set(cache)) - bonus_list = [] - for item in user_bonus: - if item['isComplete'] == False: - if item['bonusId'] in [12, 29, 30, 38, 43, 604]: - data = ({ - "bonusId": item['bonusId'], - "point": 4, - "isCurrent": item['isCurrent'], - "isComplete": False - }) - else: - data = ({ - "bonusId": item['bonusId'], - "point": 9, - "isCurrent": item['isCurrent'], - "isComplete": False - }) - bonus_list.append(data) - elif item['bonusId'] == 999: - data = ({ - "bonusId": 999, - "point": item['point'] // 10 * 10 + 9, - "isCurrent": item['isCurrent'], - "isComplete": False - }) - bonus_list.append(data) - else: - pass - for item in bonus_list_unexist: - if item in [12, 29, 30, 38, 43, 604]: - data = ({ - "bonusId": item, - "point": 4, - "isCurrent": False, - "isComplete": False - }) - else: - data = ({ - "bonusId": item, - "point": 9, - "isCurrent": False, - "isComplete": False - }) - bonus_list.append(data) - return bonus_list - app = Flask(__name__) app.json.sort_keys = False app.json.ensure_ascii = False @@ -150,7 +42,7 @@ def bad_request(e): @app.route("/") def index(): - return jsonify({"status": "200 OK", "timestamp": int(time.time()), "info": "Project Fragrance","availableApi": ["qr", "ticket", "mapstock", "unlock", "map"], "date": datetime.now(pytz.timezone('Asia/Shanghai')).strftime('%a, %d %b %Y %H:%M:%S GMT+8')}), 200 + return jsonify({"status": "200 OK", "timestamp": int(time.time()), "info": "Sennoza - Project Fragrance","availableApi": ["felica", "ticket", "mapstock", "unlock", "music", "map", "bonus"], "date": datetime.now(pytz.timezone('Asia/Shanghai')).strftime('%a, %d %b %Y %H:%M:%S GMT+8')}), 200 @app.route("/felica") def felica_lookup(): @@ -199,8 +91,8 @@ def ticket(): ticket_data = get_ticket(userId) if ticket_data['returnCode'] == 0: logout(userId, accessCode, timestamp) - returnCode = 405 - status = "405 Method Not Allowed" + returnCode = 403 + status = "403 Forbidden" info = "WARNING: THIS INFO SHOULD NEVER APPEARS. IF YOU SEE THIS WARNING PLEASE CONTACT Telegram@sasakure. Unable to operate. Successfully Logged in. Probably User has had one ticket." log = {"UserLoginApiStatus": 1, "UserLogoutApiStatus": 1} elif ticket_data['returnCode'] == 1: @@ -295,13 +187,15 @@ def unlock_process(): @app.route("/music", methods=['POST']) def music_post(): request_data = request.get_json() - if 'userId' in request_data and 'music' in request_data: - if request_data['userId'] is None or isinstance(request_data['userId'], int) is False or len(str(request_data['userId'])) != 8: + if 'IDm' in request_data and 'music' in request_data: + if request_data['IDm'] is None or len(str(request_data['IDm'])) != 16: return jsonify({"apiName": "music", "apiInfo": "Overwrite Music Data in UserData.", "apiUsage": ""}) else: - userId = int(request_data['userId']) + IDm = request_data['IDm'] + userId = aimedb_userId(IDm)[0] + accessCode = aimedb_userId(IDm)[1] timestamp = int(time.time()) - login_data = login(userId, timestamp) + login_data = login(userId, accessCode, timestamp) if login_data['returnCode'] == 102: returnCode = 403 status = "403 Forbidden" @@ -313,9 +207,9 @@ def music_post(): info = "Unable to operate. Probably User has logged in." log = {} elif login_data['returnCode'] == 1: - logout(userId, timestamp) + logout(userId, accessCode, timestamp) music_data = request_data['music'] - music(userId, music_data) + music(userId, accessCode, music_data) returnCode = 200 status = "200 OK" info = "Succeed." diff --git a/map.py b/map.py deleted file mode 100644 index 04c76ec..0000000 --- a/map.py +++ /dev/null @@ -1,17 +0,0 @@ -import json - -from sdgb import sdgb_api - -def map(userId): - data = json.dumps({ - "userId": int(userId), - "nextIndex": 0, - "maxCount": 600 - }) - - map_result = json.loads(sdgb_api(data, "GetUserMapApi", userId)) - - return map_result - -if __name__ == "__main__": - print(map(int(input()))) \ No newline at end of file diff --git a/music.py b/music.py index 9ad2843..0e4026a 100644 --- a/music.py +++ b/music.py @@ -30,22 +30,11 @@ def CalcRandom(): timestamp = int(time.time()) -def music(userId, music_data): - - music = music_data - - musicId = music['musicId'] - level = music['level'] - playCount = music['playCount'] - achievement = music['achievement'] - comboStatus = music['comboStatus'] - syncStatus = music['syncStatus'] - deluxscoreMax = music['deluxscoreMax'] - scoreRank = music['scoreRank'] +def music(userId, accessCode, music_data): # UserLogin - login_result = login(userId, timestamp) + login_result = login(userId, accessCode, timestamp) login_id = login_result['loginId'] login_date = login_result['lastLoginDate'] @@ -61,121 +50,128 @@ def music(userId, music_data): # UserLog + playloglist = [] + + for music in music_data: + data = ({ + "userId": 0, + "orderId": 0, + "playlogId": login_id, + "version": 1050000, + "placeId": placeId, + "placeName": placeName, + "loginDate": int(time.time()), + "playDate": datetime.now(pytz.timezone('Asia/Shanghai')).strftime('%Y-%m-%d'), + "userPlayDate": datetime.now(pytz.timezone('Asia/Shanghai')).strftime('%Y-%m-%d %H:%M:%S') + '.0', + "type": 0, + "musicId": music['musicId'], + "level": music['level'], + "trackNo": len(music_data) - music_data.index(music), + "vsMode": 0, + "vsUserName": "", + "vsStatus": 0, + "vsUserRating": 0, + "vsUserAchievement": 0, + "vsUserGradeRank": 0, + "vsRank": 0, + "playerNum": 1, + "playedUserId1": 0, + "playedUserName1": "", + "playedMusicLevel1": 0, + "playedUserId2": 0, + "playedUserName2": "", + "playedMusicLevel2": 0, + "playedUserId3": 0, + "playedUserName3": "", + "playedMusicLevel3": 0, + "characterId1": userdata['userData']['charaSlot'][0], + "characterLevel1": random.randint(1000,6500), + "characterAwakening1": 5, + "characterId2": userdata['userData']['charaSlot'][1], + "characterLevel2": random.randint(1000,6500), + "characterAwakening2": 5, + "characterId3": userdata['userData']['charaSlot'][2], + "characterLevel3": random.randint(1000,6500), + "characterAwakening3": 5, + "characterId4": userdata['userData']['charaSlot'][3], + "characterLevel4": random.randint(1000,6500), + "characterAwakening4": 5, + "characterId5": userdata['userData']['charaSlot'][4], + "characterLevel5": random.randint(1000,6500), + "characterAwakening5": 5, + "achievement": music['achievement'], + "deluxscore": music['deluxscoreMax'], + "scoreRank": music['scoreRank'], + "maxCombo": random.randint(400,500), + "totalCombo": random.randint(700,900), + "maxSync": 0, + "totalSync": 0, + "tapCriticalPerfect": random.randint(200,400), + "tapPerfect": random.randint(100,250), + "tapGreat": random.randint(0,10), + "tapGood": random.randint(0,10), + "tapMiss": random.randint(0,10), + "holdCriticalPerfect": random.randint(20,40), + "holdPerfect": random.randint(0,15), + "holdGreat": 0, + "holdGood": 0, + "holdMiss": 0, + "slideCriticalPerfect": random.randint(34,60), + "slidePerfect": 0, + "slideGreat": 0, + "slideGood": 0, + "slideMiss": 0, + "touchCriticalPerfect": random.randint(20,70), + "touchPerfect": 0, + "touchGreat": 0, + "touchGood": 0, + "touchMiss": 0, + "breakCriticalPerfect": random.randint(8,30), + "breakPerfect": random.randint(7,10), + "breakGreat": 0, + "breakGood": 0, + "breakMiss": 0, + "isTap": True, + "isHold": True, + "isSlide": True, + "isTouch": True, + "isBreak": True, + "isCriticalDisp": True, + "isFastLateDisp": True, + "fastCount": random.randint(20,30), + "lateCount": random.randint(50,70), + "isAchieveNewRecord": True, + "isDeluxscoreNewRecord": True, + "comboStatus": 0, + "syncStatus": 0, + "isClear": True, + 'beforeRating': userdata['userData']['playerRating'], + 'afterRating': userdata['userData']['playerRating'], + "beforeGrade": 0, + "afterGrade": 0, + "afterGradeRank": 2, + 'beforeDeluxRating': userdata['userData']['playerRating'], + 'afterDeluxRating': userdata['userData']['playerRating'], + "isPlayTutorial": False, + "isEventMode": False, + "isFreedomMode": False, + "playMode": 0, + "isNewFree": False, + "trialPlayAchievement": -1, + "extNum1": 0, + "extNum2": 0, + "extNum4": 2020, + "extBool1": False, + "extBool2": False + }) + playloglist.append(data) + data = json.dumps({ - "userId": int(userId), - "userPlaylog": { - "userId": 0, - "orderId": 0, - "playlogId": login_id, - "version": 1041000, - "placeId": placeId, - "placeName": placeName, - "loginDate": int(time.time()), - "playDate": datetime.now(pytz.timezone('Asia/Shanghai')).strftime('%Y-%m-%d'), - "userPlayDate": datetime.now(pytz.timezone('Asia/Shanghai')).strftime('%Y-%m-%d %H:%M:%S') + '.0', - "type": 0, - "musicId": int(musicId), - "level": int(level), - "trackNo": 1, - "vsMode": 0, - "vsUserName": "", - "vsStatus": 0, - "vsUserRating": 0, - "vsUserAchievement": 0, - "vsUserGradeRank": 0, - "vsRank": 0, - "playerNum": 1, - "playedUserId1": 0, - "playedUserName1": "", - "playedMusicLevel1": 0, - "playedUserId2": 0, - "playedUserName2": "", - "playedMusicLevel2": 0, - "playedUserId3": 0, - "playedUserName3": "", - "playedMusicLevel3": 0, - "characterId1": userdata['userData']['charaSlot'][0], - "characterLevel1": random.randint(1000,6500), - "characterAwakening1": 5, - "characterId2": userdata['userData']['charaSlot'][1], - "characterLevel2": random.randint(1000,6500), - "characterAwakening2": 5, - "characterId3": userdata['userData']['charaSlot'][2], - "characterLevel3": random.randint(1000,6500), - "characterAwakening3": 5, - "characterId4": userdata['userData']['charaSlot'][3], - "characterLevel4": random.randint(1000,6500), - "characterAwakening4": 5, - "characterId5": userdata['userData']['charaSlot'][4], - "characterLevel5": random.randint(1000,6500), - "characterAwakening5": 5, - "achievement": int(achievement), - "deluxscore": int(deluxscoreMax), - "scoreRank": int(scoreRank), - "maxCombo": random.randint(400,500), - "totalCombo": random.randint(700,900), - "maxSync": 0, - "totalSync": 0, - "tapCriticalPerfect": random.randint(200,400), - "tapPerfect": random.randint(100,250), - "tapGreat": random.randint(0,10), - "tapGood": random.randint(0,10), - "tapMiss": random.randint(0,10), - "holdCriticalPerfect": random.randint(20,40), - "holdPerfect": random.randint(0,15), - "holdGreat": 0, - "holdGood": 0, - "holdMiss": 0, - "slideCriticalPerfect": random.randint(34,60), - "slidePerfect": 0, - "slideGreat": 0, - "slideGood": 0, - "slideMiss": 0, - "touchCriticalPerfect": random.randint(20,70), - "touchPerfect": 0, - "touchGreat": 0, - "touchGood": 0, - "touchMiss": 0, - "breakCriticalPerfect": random.randint(8,30), - "breakPerfect": random.randint(7,10), - "breakGreat": 0, - "breakGood": 0, - "breakMiss": 0, - "isTap": True, - "isHold": True, - "isSlide": True, - "isTouch": True, - "isBreak": True, - "isCriticalDisp": True, - "isFastLateDisp": True, - "fastCount": random.randint(20,30), - "lateCount": random.randint(50,70), - "isAchieveNewRecord": True, - "isDeluxscoreNewRecord": True, - "comboStatus": 0, - "syncStatus": 0, - "isClear": True, - 'beforeRating': userdata['userData']['playerRating'], - 'afterRating': userdata['userData']['playerRating'], - "beforeGrade": 0, - "afterGrade": 0, - "afterGradeRank": 2, - 'beforeDeluxRating': userdata['userData']['playerRating'], - 'afterDeluxRating': userdata['userData']['playerRating'], - "isPlayTutorial": False, - "isEventMode": False, - "isFreedomMode": False, - "playMode": 0, - "isNewFree": False, - "trialPlayAchievement": -1, - "extNum1": 0, - "extNum2": 0, - "extNum4": 3020, - "extBool1": False - } + "userId": int(userId), + "userPlaylogList": playloglist }) - userlog_result = json.loads(sdgb_api(data, "UploadUserPlaylogApi", userId)) + userlog_result = json.loads(sdgb_api(data, "UploadUserPlaylogListApi", userId)) # 获取 User Extend data = json.dumps({ @@ -219,155 +215,161 @@ def music(userId, music_data): # UserAll data = json.dumps({ - "userId": int(userId), - "playlogId": login_id, - "isEventMode": False, - "isFreePlay": False, - "upsertUserAll": { - "userData": [ - { - "accessCode": "", - "userName": userdata['userData']['userName'], - "isNetMember": 1, - "iconId": userdata['userData']['iconId'], - "plateId": userdata['userData']['plateId'], - "titleId": userdata['userData']['titleId'], - "partnerId": userdata['userData']['partnerId'], - "frameId": userdata['userData']['frameId'], - "selectMapId": userdata['userData']['selectMapId'], - "totalAwake": userdata['userData']['totalAwake'], - "gradeRating": userdata['userData']['gradeRating'], - "musicRating": userdata['userData']['musicRating'], - "playerRating": userdata['userData']['playerRating'], - "highestRating": userdata['userData']['highestRating'], - "gradeRank": userdata['userData']['gradeRank'], - "classRank": userdata['userData']['classRank'], - "courseRank": userdata['userData']['courseRank'], - "charaSlot": userdata['userData']['charaSlot'], - "charaLockSlot": userdata['userData']['charaLockSlot'], - "contentBit": userdata['userData']['contentBit'], - "playCount": userdata['userData']['playCount'], - "currentPlayCount": userdata['userData']['currentPlayCount'], - "renameCredit": 0, - "mapStock": userdata['userData']['mapStock'], - "eventWatchedDate": userdata['userData']['eventWatchedDate'], - "lastGameId": "SDGB", - "lastRomVersion": userdata['userData']['lastRomVersion'], - "lastDataVersion": userdata['userData']['lastDataVersion'], - "lastLoginDate": login_date, - "lastPlayDate": datetime.now(pytz.timezone('Asia/Shanghai')).strftime('%Y-%m-%d %H:%M:%S') + '.0', - "lastPlayCredit": 1, - "lastPlayMode": 0, - "lastPlaceId": placeId, - "lastPlaceName": placeName, - "lastAllNetId": 0, - "lastRegionId": regionId, - "lastRegionName": regionName, - "lastClientId": clientId, - "lastCountryCode": "CHN", - "lastSelectEMoney": 0, - "lastSelectTicket": 0, - "lastSelectCourse": userdata['userData']['lastSelectCourse'], - "lastCountCourse": 0, - "firstGameId": "SDGB", - "firstRomVersion": userdata['userData']['firstRomVersion'], - "firstDataVersion": userdata['userData']['firstDataVersion'], - "firstPlayDate": userdata['userData']['firstPlayDate'], - "compatibleCmVersion": userdata['userData']['compatibleCmVersion'], - "dailyBonusDate": userdata['userData']['dailyBonusDate'], - "dailyCourseBonusDate": userdata['userData']['dailyCourseBonusDate'], - "lastPairLoginDate": userdata['userData']['lastPairLoginDate'], - "lastTrialPlayDate": userdata['userData']['lastTrialPlayDate'], - "playVsCount": 0, - "playSyncCount": 0, - "winCount": 0, - "helpCount": 0, - "comboCount": 0, - "totalDeluxscore": userdata['userData']['totalDeluxscore'], - "totalBasicDeluxscore": userdata['userData']['totalBasicDeluxscore'], - "totalAdvancedDeluxscore": userdata['userData']['totalAdvancedDeluxscore'], - "totalExpertDeluxscore": userdata['userData']['totalExpertDeluxscore'], - "totalMasterDeluxscore": userdata['userData']['totalMasterDeluxscore'], - "totalReMasterDeluxscore": userdata['userData']['totalReMasterDeluxscore'], - "totalSync": userdata['userData']['totalSync'], - "totalBasicSync": userdata['userData']['totalBasicSync'], - "totalAdvancedSync": userdata['userData']['totalAdvancedSync'], - "totalExpertSync": userdata['userData']['totalExpertSync'], - "totalMasterSync": userdata['userData']['totalMasterSync'], - "totalReMasterSync": userdata['userData']['totalReMasterSync'], - "totalAchievement": userdata['userData']['totalAchievement'], - "totalBasicAchievement": userdata['userData']['totalBasicAchievement'], - "totalAdvancedAchievement": userdata['userData']['totalAdvancedAchievement'], - "totalExpertAchievement": userdata['userData']['totalExpertAchievement'], - "totalMasterAchievement": userdata['userData']['totalMasterAchievement'], - "totalReMasterAchievement": userdata['userData']['totalReMasterAchievement'], - "playerOldRating": userdata['userData']['playerOldRating'], - "playerNewRating": userdata['userData']['playerNewRating'], - "banState": 0, - "dateTime": timestamp - } - ], - "userExtend": [user_extend['userExtend']], - "userOption": [user_option['userOption']], - "userCharacterList": [], - "userGhost": [], - "userMapList": [], - "userLoginBonusList": [], - "userRatingList": [user_rating['userRating']], - "userItemList": [], - "userMusicDetailList": [ - { - "musicId": musicId, - "level": level, - "playCount": playCount, - "achievement": achievement, - "comboStatus": comboStatus, - "syncStatus": syncStatus, - "deluxscoreMax": deluxscoreMax, - "scoreRank": scoreRank, - "extNum1": 0 - } - ], - "userCourseList": [], - "userFriendSeasonRankingList": [], - "userChargeList": user_charge['userChargeList'], - "userFavoriteList": [], - "userActivityList": [user_activity['userActivity']], - "userGamePlaylogList": [ - { - "playlogId": login_id, - "version": "1.41.00", - "playDate": datetime.now(pytz.timezone('Asia/Shanghai')).strftime('%Y-%m-%d %H:%M:%S') + '.0', - "playMode": 0, - "useTicketId": -1, - "playCredit": 1, - "playTrack": 1, - "clientId": clientId, - "isPlayTutorial": False, - "isEventMode": False, - "isNewFree": False, - "playCount": 0, - "playSpecial": CalcRandom(), - "playOtherUserId": 0 - } - ], - "user2pPlaylog": { - "userId1": 0, - "userId2": 0, - "userName1": "", - "userName2": "", - "regionId": 0, - "placeId": 0, - "user2pPlaylogDetailList": [] - }, - "isNewCharacterList": "", - "isNewMapList": "", - "isNewLoginBonusList": "", - "isNewItemList": "", - "isNewMusicDetailList": "0", - "isNewCourseList": "0", - "isNewFavoriteList": "", - "isNewFriendSeasonRankingList": "" + "userId": int(userId), + "playlogId": login_id, + "isEventMode": False, + "isFreePlay": False, + "upsertUserAll": { + "userData": [ + { + "accessCode": int(accessCode), + "userName": userdata['userData']['userName'], + "isNetMember": 1, + "point": userdata['userData']['point'], + "totalPoint": userdata['userData']['totalPoint'], + "iconId": userdata['userData']['iconId'], + "plateId": userdata['userData']['plateId'], + "titleId": userdata['userData']['titleId'], + "partnerId": userdata['userData']['partnerId'], + "frameId": userdata['userData']['frameId'], + "selectMapId": userdata['userData']['selectMapId'], + "totalAwake": userdata['userData']['totalAwake'], + "gradeRating": userdata['userData']['gradeRating'], + "musicRating": userdata['userData']['musicRating'], + "playerRating": userdata['userData']['playerRating'], + "highestRating": userdata['userData']['highestRating'], + "gradeRank": userdata['userData']['gradeRank'], + "classRank": userdata['userData']['classRank'], + "courseRank": userdata['userData']['courseRank'], + "charaSlot": userdata['userData']['charaSlot'], + "charaLockSlot": userdata['userData']['charaLockSlot'], + "contentBit": userdata['userData']['contentBit'], + "playCount": userdata['userData']['playCount'], + "currentPlayCount": userdata['userData']['currentPlayCount'], + "renameCredit": 0, + "mapStock": userdata['userData']['mapStock'], + "eventWatchedDate": userdata['userData']['eventWatchedDate'], + "lastGameId": "SDGA", + "lastRomVersion": userdata['userData']['lastRomVersion'], + "lastDataVersion": userdata['userData']['lastDataVersion'], + "lastLoginDate": login_date, + "lastPlayDate": datetime.now(pytz.timezone('Asia/Shanghai')).strftime('%Y-%m-%d %H:%M:%S') + '.0', + "lastPlayCredit": 1, + "lastPlayMode": 0, + "lastPlaceId": placeId, + "lastPlaceName": placeName, + "lastAllNetId": 0, + "lastRegionId": regionId, + "lastRegionName": regionName, + "lastClientId": clientId, + "lastCountryCode": "CHN", + "lastSelectEMoney": 0, + "lastSelectTicket": 0, + "lastSelectCourse": userdata['userData']['lastSelectCourse'], + "lastCountCourse": 0, + "firstGameId": "SDGA", + "firstRomVersion": userdata['userData']['firstRomVersion'], + "firstDataVersion": userdata['userData']['firstDataVersion'], + "firstPlayDate": userdata['userData']['firstPlayDate'], + "compatibleCmVersion": userdata['userData']['compatibleCmVersion'], + "dailyBonusDate": userdata['userData']['dailyBonusDate'], + "dailyCourseBonusDate": userdata['userData']['dailyCourseBonusDate'], + "lastPairLoginDate": userdata['userData']['lastPairLoginDate'], + "lastTrialPlayDate": userdata['userData']['lastTrialPlayDate'], + "playVsCount": 0, + "playSyncCount": 0, + "winCount": 0, + "helpCount": 0, + "comboCount": 0, + "totalDeluxscore": userdata['userData']['totalDeluxscore'], + "totalBasicDeluxscore": userdata['userData']['totalBasicDeluxscore'], + "totalAdvancedDeluxscore": userdata['userData']['totalAdvancedDeluxscore'], + "totalExpertDeluxscore": userdata['userData']['totalExpertDeluxscore'], + "totalMasterDeluxscore": userdata['userData']['totalMasterDeluxscore'], + "totalReMasterDeluxscore": userdata['userData']['totalReMasterDeluxscore'], + "totalSync": userdata['userData']['totalSync'], + "totalBasicSync": userdata['userData']['totalBasicSync'], + "totalAdvancedSync": userdata['userData']['totalAdvancedSync'], + "totalExpertSync": userdata['userData']['totalExpertSync'], + "totalMasterSync": userdata['userData']['totalMasterSync'], + "totalReMasterSync": userdata['userData']['totalReMasterSync'], + "totalAchievement": userdata['userData']['totalAchievement'], + "totalBasicAchievement": userdata['userData']['totalBasicAchievement'], + "totalAdvancedAchievement": userdata['userData']['totalAdvancedAchievement'], + "totalExpertAchievement": userdata['userData']['totalExpertAchievement'], + "totalMasterAchievement": userdata['userData']['totalMasterAchievement'], + "totalReMasterAchievement": userdata['userData']['totalReMasterAchievement'], + "playerOldRating": userdata['userData']['playerOldRating'], + "playerNewRating": userdata['userData']['playerNewRating'], + "banState": 0, + "friendRegistSkip": 1, + "dateTime": timestamp + } + ], + "userExtend": [user_extend['userExtend']], + "userOption": [user_option['userOption']], + "userCharacterList": [], + "userGhost": [], + "userMapList": [], + "userLoginBonusList": [], + "userRatingList": [user_rating['userRating']], + "userItemList": [], + "userMusicDetailList": music_data, + "userCourseList": [], + "userFriendSeasonRankingList": [], + "userChargeList": user_charge['userChargeList'], + "userFavoriteList": [], + "userActivityList": [user_activity['userActivity']], + "userMissionDataList": [], + "userWeeklyData": { + "lastLoginWeek": "2025-01-20 04:00:00", + "beforeLoginWeek": "2024-09-02 04:00:00", + "friendBonusFlag": True + }, + "userGamePlaylogList": [ + { + "playlogId": login_id, + "version": "1.50.00", + "playDate": datetime.now(pytz.timezone('Asia/Shanghai')).strftime('%Y-%m-%d %H:%M:%S') + '.0', + "playMode": 0, + "useTicketId": -1, + "playCredit": 1, + "playTrack": len(music_data), + "clientId": clientId, + "isPlayTutorial": False, + "isEventMode": False, + "isNewFree": False, + "playCount": 8, + "playSpecial": CalcRandom(), + "playOtherUserId": 0 + } + ], + "user2pPlaylog": { + "userId1": 0, + "userId2": 0, + "userName1": "", + "userName2": "", + "regionId": 0, + "placeId": 0, + "user2pPlaylogDetailList": [] + }, + "userIntimateList": [], + "userShopItemStockList": [], + "userGetPointList": [], + "userTradeItemList": [], + "userFavoritemusicList": [], + "userKaleidxScopeList": [], + "isNewCharacterList": "", + "isNewMapList": "", + "isNewLoginBonusList": "", + "isNewItemList": "", + "isNewMusicDetailList": "0" * len(music_data), + "isNewCourseList": "", + "isNewFavoriteList": "", + "isNewFriendSeasonRankingList": "", + "isNewUserIntimateList": "", + "isNewFavoritemusicList": "", + "isNewKaleidxScopeList": "" } }) @@ -381,12 +383,12 @@ def music(userId, music_data): return data -def music_with_retry(userId, music_data): +def music_with_retry(userId, accessCode, music_data): for i in range(5): try: - music(userId, music_data) - return logout(userId, timestamp) + music(userId, accessCode, music_data) + return logout(userId, accessCode, timestamp) except ValueError as e: - logout(userId, timestamp) + logout(userId, accessCode, timestamp) time.sleep(3) return json.dumps({"status": "500 Internal Server Error"}), 500 diff --git a/process.py b/process.py new file mode 100644 index 0000000..a55f0e4 --- /dev/null +++ b/process.py @@ -0,0 +1,180 @@ +import json +import pytz +import time +from sdgb import sdgb_api, aimedb_api, felica +from datetime import datetime, timedelta + +from settings import regionId, clientId, placeId + +from logout import logout +from login import login + +def find_map(mapId, user_map_data): + for single in user_map_data: + if single["mapId"] == mapId: + return single + else: + continue + +def isNewMapList(mapId, user_map_data): + if ('{"mapId": ' + str(mapId)) in user_map_data: + return 0 + else: + return 1 + +def item(item_data, user_character_list): + item_list = [] + character_list = [] + for single in item_data: + if single['kind'] == 9: + if ('{"characterId": ' + str(single['id'])) in user_character_list: + pass + else: + data = ({ + "characterId":single['id'], + "level":1, + "awakening":0, + "useCount": 0 + }) + character_list.append(data) + else: + data = ({ + "itemKind": single['kind'], + "itemId": single['id'], + "stock": 1, + "isValid": True + }) + item_list.append(data) + return item_list, character_list, item_data[-1]['distance'] + + +def bonus_list_gen(userId): + with open('login_bonus.json') as file: + cache = json.load(file) + bonus_data = [] + for item in cache: + bonus_data.append(item['id']) + cache = [] + data = json.dumps({ + "userId": int(userId), + "nextIndex":0, + "maxCount":2000 + }) + user_bonus = json.loads(sdgb_api(data, "GetUserLoginBonusApi", userId))['userLoginBonusList'] + for item in user_bonus: + cache.append(item['bonusId']) + bonus_list_unexist = list(set(bonus_data) - set(cache)) + bonus_list = [] + for item in user_bonus: + if item['isComplete'] == False: + if item['bonusId'] in [12, 29, 30, 38, 43, 604]: + data = ({ + "bonusId": item['bonusId'], + "point": 4, + "isCurrent": item['isCurrent'], + "isComplete": False + }) + else: + data = ({ + "bonusId": item['bonusId'], + "point": 9, + "isCurrent": item['isCurrent'], + "isComplete": False + }) + bonus_list.append(data) + elif item['bonusId'] == 999: + data = ({ + "bonusId": 999, + "point": item['point'] // 10 * 10 + 9, + "isCurrent": item['isCurrent'], + "isComplete": False + }) + bonus_list.append(data) + else: + pass + for item in bonus_list_unexist: + if item in [12, 29, 30, 38, 43, 604]: + data = ({ + "bonusId": item, + "point": 4, + "isCurrent": False, + "isComplete": False + }) + else: + data = ({ + "bonusId": item, + "point": 9, + "isCurrent": False, + "isComplete": False + }) + bonus_list.append(data) + return bonus_list + + +def aimedb_userId(IDm): + return aimedb_api(felica(IDm)), felica(IDm) + +def map(userId): + data = json.dumps({ + "userId": int(userId), + "nextIndex": 0, + "maxCount": 600 + }) + + map_result = json.loads(sdgb_api(data, "GetUserMapApi", userId)) + + return map_result + +def character(userId): + data = json.dumps({ + "userId": int(userId), + "nextIndex":10000000000, + "maxCount":1000000000 + }) + + character_result = json.loads(sdgb_api(data, "GetUserCharacterApi", userId)) + + return character_result + + +def userdata(userId): + data = json.dumps({ + "userId": int(userId) + }) + + userdata_result = json.loads(sdgb_api(data, "GetUserDataApi", userId)) + + return userdata_result + + +def charge(userId): + data = json.dumps({ + "userId": userId, + }) + + charge_result = json.loads(sdgb_api(data, "GetUserChargeApi", userId)) + + return charge_result + +def get_ticket(userId): + data = json.dumps({ + "userId": userId, + "userCharge": { + "chargeId": 6, + "stock": 1, + "purchaseDate": (datetime.now(pytz.timezone('Asia/Shanghai')) - timedelta(hours=1)).strftime("%Y-%m-%d %H:%M:%S.0"), + "validDate": (datetime.now(pytz.timezone('Asia/Shanghai')) - timedelta(hours=1) + timedelta(days=90)).replace(hour=4, minute=0, second=0).strftime("%Y-%m-%d %H:%M:%S") + }, + "userChargelog": { + "chargeId": 6, + "price": 4, + "purchaseDate": (datetime.now(pytz.timezone('Asia/Shanghai')) - timedelta(hours=1)).strftime("%Y-%m-%d %H:%M:%S.0"), + "placeId": placeId, + "regionId": regionId, + "clientId": clientId + } + }) + + ticket_result = json.loads(sdgb_api(data, "UpsertUserChargelogApi", userId)) + + return ticket_result \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 527563b..ee347e9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -requests +httpx pycryptodome pytz flask diff --git a/sdgb.py b/sdgb.py index 2cb8d01..2fee1c0 100644 --- a/sdgb.py +++ b/sdgb.py @@ -2,7 +2,7 @@ import json import zlib import pytz import hashlib -import requests +import httpx from binascii import unhexlify, hexlify import socket @@ -56,8 +56,7 @@ def sdgb_api(data, useApi, userId): data_def = zlib.compress(data) data_enc = aes.encrypt(data_def) endpoint = "https://mai2exp.sic-rd1.jp:42081/Maimai2Servlet/" - requests.packages.urllib3.disable_warnings() - r = requests.post( + r = httpx.post( endpoint + get_hash_api(useApi), headers = { "User-Agent": "%s#%d"%(get_hash_api(useApi), userId), diff --git a/ticket.py b/ticket.py deleted file mode 100644 index 78a159f..0000000 --- a/ticket.py +++ /dev/null @@ -1,43 +0,0 @@ -import json -import pytz -import time - -from sdgb import sdgb_api -from datetime import datetime, timedelta - -from settings import regionId -from settings import clientId -from settings import placeId - -from logout import logout -from login import login - -def get_ticket(userId): - data = json.dumps({ - "userId": userId, - "userCharge": { - "chargeId": 6, - "stock": 1, - "purchaseDate": (datetime.now(pytz.timezone('Asia/Shanghai')) - timedelta(hours=1)).strftime("%Y-%m-%d %H:%M:%S.0"), - "validDate": (datetime.now(pytz.timezone('Asia/Shanghai')) - timedelta(hours=1) + timedelta(days=90)).replace(hour=4, minute=0, second=0).strftime("%Y-%m-%d %H:%M:%S") - }, - "userChargelog": { - "chargeId": 6, - "price": 4, - "purchaseDate": (datetime.now(pytz.timezone('Asia/Shanghai')) - timedelta(hours=1)).strftime("%Y-%m-%d %H:%M:%S.0"), - "placeId": placeId, - "regionId": regionId, - "clientId": clientId - } - }) - - ticket_result = json.loads(sdgb_api(data, "UpsertUserChargelogApi", userId)) - - return ticket_result - -if __name__ == "__main__": - timestamp = int(time.time()) - print(timestamp) - print(login(timestamp)) - print(get_ticket()) - print(logout(timestamp)) diff --git a/userdata.py b/userdata.py deleted file mode 100644 index 8206a73..0000000 --- a/userdata.py +++ /dev/null @@ -1,12 +0,0 @@ -import json - -from sdgb import sdgb_api - -def userdata(userId): - data = json.dumps({ - "userId": int(userId) - }) - - userdata_result = json.loads(sdgb_api(data, "GetUserDataApi", userId)) - - return userdata_result