mirror of
https://github.com/N1ngYu/SaltBot.git
synced 2025-09-28 08:42:40 +08:00
465 lines
18 KiB
Python
465 lines
18 KiB
Python
import json
|
||
import pytz
|
||
import time
|
||
import random
|
||
|
||
from sdgb import sdgb_api
|
||
from datetime import datetime, timedelta
|
||
|
||
regionId = 1
|
||
regionName = "北京"
|
||
placeId = 1403
|
||
placeName = "插电师电玩北京西单大悦城店"
|
||
clientId = "A63E01C2805"
|
||
|
||
|
||
#from settings import userId
|
||
#from settings import music_data
|
||
#from settings import regionId
|
||
#from settings import regionName
|
||
#from settings import clientId
|
||
#from settings import placeId
|
||
#from settings import placeName
|
||
|
||
from login import login
|
||
from logout import logout
|
||
|
||
def CalcRandom():
|
||
max = 1037933
|
||
num2 = random.randint(1, max) * 2069
|
||
|
||
num2 += 1024 # specialnum
|
||
num3 = 0
|
||
for i in range(0, 32):
|
||
num3 <<= 1
|
||
num3 += num2 % 2
|
||
num2 >>= 1
|
||
|
||
return num3
|
||
|
||
timestamp = int(time.time()) - 60
|
||
|
||
def music():
|
||
music_data = ({
|
||
"musicId": music_Id,
|
||
"level": LevelID,
|
||
"playCount": Play_Count,
|
||
"achievement": Acc,
|
||
"comboStatus": Combo,
|
||
"syncStatus": Sync,
|
||
"deluxscoreMax": DXsc,
|
||
"scoreRank": Rank,
|
||
"extNum1": 0
|
||
})
|
||
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']
|
||
extNum1 = music['extNum1']
|
||
|
||
print(timestamp)
|
||
|
||
# UserLogin
|
||
|
||
login_result = json.loads(login(timestamp))
|
||
print(login_result)
|
||
|
||
login_id = login_result['loginId']
|
||
login_date = login_result['lastLoginDate']
|
||
|
||
|
||
# UserData
|
||
|
||
data = json.dumps({
|
||
"userId": int(userId)
|
||
})
|
||
|
||
userdata = json.loads(sdgb_api(data, "GetUserDataApi", userId))
|
||
|
||
# UserMusic 随机两首
|
||
|
||
data = json.dumps({
|
||
"userId": int(userId),
|
||
"nextIndex":random.randint(11000,11500),
|
||
"maxCount":2
|
||
})
|
||
|
||
music_details = json.loads(sdgb_api(data, "GetUserMusicApi", userId))
|
||
|
||
|
||
# UserLog
|
||
|
||
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": isAccNew,
|
||
"isDeluxscoreNewRecord": isDXCNew,
|
||
"comboStatus": 0,
|
||
"syncStatus": 0,
|
||
"isClear": Clear_Status,
|
||
'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
|
||
}
|
||
})
|
||
|
||
userlog_result = json.loads(sdgb_api(data, "UploadUserPlaylogApi", userId))
|
||
|
||
print(userlog_result)
|
||
|
||
|
||
# 获取 User Extend
|
||
data = json.dumps({
|
||
"userId": int(userId)
|
||
})
|
||
|
||
user_extend = json.loads(sdgb_api(data, "GetUserExtendApi", userId))
|
||
|
||
# 获取 User Option
|
||
data = json.dumps({
|
||
"userId": int(userId)
|
||
})
|
||
|
||
user_option = json.loads(sdgb_api(data, "GetUserOptionApi", userId))
|
||
|
||
|
||
# 获取 User Rating
|
||
data = json.dumps({
|
||
"userId": int(userId)
|
||
})
|
||
|
||
user_rating = json.loads(sdgb_api(data, "GetUserRatingApi", userId))
|
||
|
||
|
||
# 获取 User Activity
|
||
data = json.dumps({
|
||
"userId": int(userId)
|
||
})
|
||
|
||
user_activity = json.loads(sdgb_api(data, "GetUserActivityApi", userId))
|
||
|
||
|
||
# 获取账号功能票
|
||
data = json.dumps({
|
||
"userId": int(userId)
|
||
})
|
||
|
||
user_charge = json.loads(sdgb_api(data, "GetUserChargeApi", userId))
|
||
|
||
|
||
|
||
|
||
# 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": extNum1
|
||
}
|
||
],
|
||
"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": f"{isCover}",
|
||
"isNewCourseList": "0",
|
||
"isNewFavoriteList": "",
|
||
"isNewFriendSeasonRankingList": ""
|
||
}
|
||
})
|
||
|
||
userall_result = json.loads(sdgb_api(data, "UpsertUserAllApi", userId))
|
||
return userall_result
|
||
|
||
def music_with_retry(max_retries=10): # 这里是重试次数
|
||
for i in range(max_retries):
|
||
try:
|
||
print(music())
|
||
return logout(timestamp)
|
||
except ValueError as e:
|
||
print(f"尝试 {i+1} 失败,错误:{e}")
|
||
print(logout(timestamp))
|
||
time.sleep(5) # 等待 5 秒后重试
|
||
return "重试次数超过限制,乐曲上传失败"
|
||
|
||
|
||
#zh_cn ver.
|
||
|
||
if __name__ == "__main__":
|
||
userId = int(input("请输入你的userid: "))
|
||
music_Id = int(input("请输入要发送的乐曲id: "))
|
||
LevelID = int(input("请输入乐曲难度(0:绿 1:黄 2:红 3:紫 4:白): "))
|
||
Play_Count = int(input("请输入游玩次数(如果你不知道这啥,请随便输入一些数字,别太离谱就行 比如 \'11\'): "))
|
||
Acc = int(input("请输入准确率(比如, S:970000 SSS:100000,别用小数点): "))
|
||
Clear_Status = input("请选择是否通关(True 或者 False,大小写敏感): ")
|
||
Rank = int(input("请输入等级(0:D 1:C 2:B 3:BB 4:BBB 5:A 6:AA 7:AAA 8:S 9:S+ 10:SS 11:SS+ 12:SSS 13:SSS+): "))
|
||
Combo = int(input("请输入是否fc/ap(0:None 1:FC 2:FC+ 3:AP 4:AP+): "))
|
||
Sync = int(input("请输入SyncStatus(0:None 1:FS 2:FS+ 3:FDX 4:FDX+ 5:SyncPlay): "))
|
||
DXsc = int(input("请输入DX分(别超过这首歌的总DX分): "))
|
||
isAccNew = input("请选择是否覆盖准确率(True:覆盖 False:不覆盖 大小写敏感): ")
|
||
isDXCNew = input("请选择是否覆盖DX分(True:覆盖 False:不覆盖 大小写敏感): ")
|
||
isCover = input("请选择是否删除乐曲信息(1:不删除*一般情况下请选择此项* 0:删除*若想删除成绩请选择此项*): ")
|
||
WARN = input("最后的警告,如果你检查好了全部数据正确,请按下Enter来确认操作,若没有,请立刻按下Ctrl+C。我不会对任何账号的bs2作出赔偿/道歉。怕别用用别怕封别叫。")
|
||
LASTWARN = input("最后最后的警告,你的数据真的全都对吗?准确率和等级对的上吗?DX分有没有超过这个难度或者歌曲的总值?如果真的真的确认了,请按下Enter继续操作,否则立刻按下Ctrl+C。")
|
||
print(music_with_retry())
|
||
|
||
#en_us ver.
|
||
|
||
#if __name__ == "__main__":
|
||
# userId = int(input("Please Input Your UserID: "))
|
||
# music_Id = int(input("Please Input MusicID: "))
|
||
# LevelID = int(input("Please Input MusicLevel(0BAS 1ADV 2EXP 3MAS 4ReMAS): "))
|
||
# Play_Count = int(input("Please Input Your PlayCount(if u dont know whats this, just use a random number like \'11\'): "))
|
||
# Acc = int(input("Please Input ACC(For example, S:970000 SSS:100000,just use num dont use another things): "))
|
||
# Clear_Status = input("Please Input ClearStatus(True or False,Caps Must): ")
|
||
# Rank = int(input("Please Input Rank(0:D 1:C 2:B 3:BB 4:BBB 5:A 6:AA 7:AAA 8:S 9:S+ 10:SS 11:SS+ 12:SSS 13:SSS+): "))
|
||
# Combo = int(input("Please Input ComboStatus(0:None 1:FC 2:FC+ 3:AP 4:AP+): "))
|
||
# Sync = int(input("Please Input SyncStatus(0:None 1:FS 2:FS+ 3:FDX 4:FDX+ 5:SyncPlay): "))
|
||
# DXsc = int(input("Please Input DXScore(DONT OVER THE SONG!): "))
|
||
# isAccNew = input("Please Input AccNewStatus(True:will overwrite or False:will not overwrite): ")
|
||
# isDXCNew = input("Please Input DXCStatus(True:will overwrite or False:will not overwrite): ")
|
||
# WARN = input("This is the LAST WARN. If your account has banned, DONT come and ask me. I will NOT pay anything for your bannned account. If you confirmed all data is currect, Press Enter. If NOT, Press Ctrl+C right NOW.")
|
||
# print(music_with_retry())
|