update to 1.53
This commit is contained in:
66
sdgb/PowerOn.py
Normal file
66
sdgb/PowerOn.py
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
import httpx
|
||||||
|
from Crypto.Cipher import AES
|
||||||
|
from Crypto.Util.Padding import pad
|
||||||
|
from urllib.parse import unquote
|
||||||
|
|
||||||
|
def enc(key, iv, data):
|
||||||
|
cipher = AES.new(key, AES.MODE_CBC, iv)
|
||||||
|
encrypted = cipher.encrypt(data)
|
||||||
|
return encrypted
|
||||||
|
|
||||||
|
def dec(key, iv, data):
|
||||||
|
de_cipher = AES.new(key, AES.MODE_CBC, iv)
|
||||||
|
decrypted = de_cipher.decrypt(data)
|
||||||
|
return decrypted
|
||||||
|
|
||||||
|
def hello():
|
||||||
|
key = bytes([ 47, 63, 106, 111, 43, 34, 76, 38, 92, 67, 114, 57, 40, 61, 107, 71 ])
|
||||||
|
#key = bytes([ 45, 97, 53, 55, 85, 88, 52, 121, 57, 47, 104, 40, 73, 109, 65, 81 ])
|
||||||
|
iv = bytes.fromhex('00000000000000000000000000000000')
|
||||||
|
ua = 'SDGB;Windows/Lite'
|
||||||
|
#ua = 'SDHJ;Windows/Lite'
|
||||||
|
|
||||||
|
# 构建 payload
|
||||||
|
content = bytes([0] * 16) + b'title_id=SDGB&title_ver=1.52&client_id=A63E01E6149'
|
||||||
|
print(f"Content: {content}")
|
||||||
|
|
||||||
|
header = bytes.fromhex('00000000000000000000000000000000')
|
||||||
|
bytes_data = pad(header + content, 16)
|
||||||
|
encrypted = enc(key, iv, bytes_data)
|
||||||
|
|
||||||
|
# --- HTTPX 修改部分 ---
|
||||||
|
headers = {
|
||||||
|
'User-Agent': ua,
|
||||||
|
'Pragma': 'DFI'
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
# 发送 POST 请求
|
||||||
|
# urllib3 的 body 参数在 httpx 中对应 content (用于二进制数据)
|
||||||
|
r = httpx.post(
|
||||||
|
'http://at.sys-allnet.cn/net/initialize',
|
||||||
|
content=encrypted,
|
||||||
|
headers=headers
|
||||||
|
)
|
||||||
|
|
||||||
|
# 检查响应状态码 (可选,但在 httpx 中推荐)
|
||||||
|
# r.raise_for_status()
|
||||||
|
|
||||||
|
# urllib3 的 r.data 在 httpx 中对应 r.content
|
||||||
|
resp_data = r.content
|
||||||
|
|
||||||
|
# 解密逻辑保持不变
|
||||||
|
# 注意:这里逻辑是用响应的前16字节作为IV,同时解密整个数据,然后丢弃前16字节
|
||||||
|
if len(resp_data) >= 16:
|
||||||
|
decrypted = dec(key, resp_data[:16], resp_data)
|
||||||
|
decrypted_bytes = decrypted[16:]
|
||||||
|
decrypted_str = unquote(decrypted_bytes.decode('UTF-8'), 'utf-8')
|
||||||
|
print(f"Decrypted: {decrypted_str}")
|
||||||
|
else:
|
||||||
|
print("Response data too short.")
|
||||||
|
|
||||||
|
except httpx.RequestError as e:
|
||||||
|
print(f"An error occurred while requesting: {e}")
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
hello()
|
||||||
68
sdgb/UpsertMusic.py
Normal file
68
sdgb/UpsertMusic.py
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
import json
|
||||||
|
import asyncio
|
||||||
|
import httpx
|
||||||
|
import time
|
||||||
|
import logging
|
||||||
|
from sdgb import MaimaiClient
|
||||||
|
|
||||||
|
from settings import userId, musicData
|
||||||
|
from chime import *
|
||||||
|
from payload import *
|
||||||
|
|
||||||
|
maimai = MaimaiClient()
|
||||||
|
|
||||||
|
|
||||||
|
logging.basicConfig(
|
||||||
|
level=logging.INFO,
|
||||||
|
format='%(asctime)s - %(levelname)s - %(message)s'
|
||||||
|
)
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
async def run_workflow(self):
|
||||||
|
|
||||||
|
async with httpx.AsyncClient(verify=False) as client:
|
||||||
|
|
||||||
|
# Preview 探测
|
||||||
|
|
||||||
|
PreviewResponse = json.loads(await self.call_api(client, "GetUserPreviewApi", requestData_UserPreview, userId))
|
||||||
|
if PreviewResponse["isLogin"] == True:
|
||||||
|
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)
|
||||||
|
|
||||||
|
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))
|
||||||
153
sdgb/payload.py
153
sdgb/payload.py
@@ -4,8 +4,14 @@ import json
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from encrypt import CalcRandom
|
from encrypt import CalcRandom
|
||||||
from settings import *
|
from settings import *
|
||||||
|
from chime import *
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
|
||||||
|
userId = qr_api(qrCode)['userID']
|
||||||
|
token = qr_api(qrCode)['token']
|
||||||
|
|
||||||
|
|
||||||
logging.basicConfig(
|
logging.basicConfig(
|
||||||
level=logging.INFO,
|
level=logging.INFO,
|
||||||
format='%(asctime)s - %(levelname)s - %(message)s'
|
format='%(asctime)s - %(levelname)s - %(message)s'
|
||||||
@@ -17,7 +23,9 @@ TimeStamp = int(time.time())
|
|||||||
|
|
||||||
requestData_UserPreview = {
|
requestData_UserPreview = {
|
||||||
"userId": userId,
|
"userId": userId,
|
||||||
"segaIdAuthKey":""
|
"segaIdAuthKey":"",
|
||||||
|
"token": token,
|
||||||
|
"clientId": clientId
|
||||||
}
|
}
|
||||||
|
|
||||||
requestData_UserLogin = {
|
requestData_UserLogin = {
|
||||||
@@ -26,9 +34,11 @@ requestData_UserLogin = {
|
|||||||
"regionId": regionId,
|
"regionId": regionId,
|
||||||
"placeId": placeId,
|
"placeId": placeId,
|
||||||
"clientId": clientId,
|
"clientId": clientId,
|
||||||
"dateTime": 1767000000,
|
"dateTime": TimeStamp - 600,
|
||||||
|
"loginDateTime": TimeStamp,
|
||||||
"isContinue": False,
|
"isContinue": False,
|
||||||
"genericFlag":0
|
"genericFlag": 0,
|
||||||
|
"token": token
|
||||||
}
|
}
|
||||||
|
|
||||||
requestData_UserData = {
|
requestData_UserData = {
|
||||||
@@ -41,22 +51,32 @@ requestData_UserLogout = {
|
|||||||
"regionId": regionId,
|
"regionId": regionId,
|
||||||
"placeId": placeId,
|
"placeId": placeId,
|
||||||
"clientId": clientId,
|
"clientId": clientId,
|
||||||
"dateTime": 1767000000,
|
"loginDateTime": TimeStamp,
|
||||||
"type": 1
|
"type": 1
|
||||||
}
|
}
|
||||||
|
|
||||||
def UserPlaylog_payload(loginId: int, musicData: dict, userData: str):
|
def UserAll_payload(loginId: int, loginDate: str, musicData: dict, GeneralUserInfo: list):
|
||||||
|
|
||||||
userData = json.loads(userData)
|
userData = json.loads(GeneralUserInfo[0])
|
||||||
|
userExtend = json.loads(GeneralUserInfo[1])
|
||||||
|
userOption = json.loads(GeneralUserInfo[2])
|
||||||
|
userRating = json.loads(GeneralUserInfo[3])
|
||||||
|
userChargeList = json.loads(GeneralUserInfo[4])
|
||||||
|
userActivity = json.loads(GeneralUserInfo[5])
|
||||||
|
userMissionDataList = json.loads(GeneralUserInfo[6])
|
||||||
|
|
||||||
requestData_UserPlaylog = {
|
requestData_UserAll = {
|
||||||
"userId": userId,
|
"userId": userId,
|
||||||
|
"playlogId": loginId,
|
||||||
|
"isEventMode": False,
|
||||||
|
"isFreePlay": False,
|
||||||
|
"loginDateTime": TimeStamp,
|
||||||
"userPlaylogList": [
|
"userPlaylogList": [
|
||||||
{
|
{
|
||||||
"userId": 0,
|
"userId": 0,
|
||||||
"orderId": 0,
|
"orderId": 0,
|
||||||
"playlogId": loginId,
|
"playlogId": loginId,
|
||||||
"version": 1052000,
|
"version": 1053000,
|
||||||
"placeId": placeId,
|
"placeId": placeId,
|
||||||
"placeName": placeName,
|
"placeName": placeName,
|
||||||
"loginDate": TimeStamp,
|
"loginDate": TimeStamp,
|
||||||
@@ -102,34 +122,34 @@ def UserPlaylog_payload(loginId: int, musicData: dict, userData: str):
|
|||||||
"deluxscore": musicData['deluxscoreMax'],
|
"deluxscore": musicData['deluxscoreMax'],
|
||||||
"scoreRank": musicData['scoreRank'],
|
"scoreRank": musicData['scoreRank'],
|
||||||
"maxCombo": 0,
|
"maxCombo": 0,
|
||||||
"totalCombo": 987,
|
"totalCombo": 128,
|
||||||
"maxSync": 0,
|
"maxSync": 0,
|
||||||
"totalSync": 0,
|
"totalSync": 0,
|
||||||
"tapCriticalPerfect": 0,
|
"tapCriticalPerfect": 101,
|
||||||
"tapPerfect": 0,
|
"tapPerfect": 0,
|
||||||
"tapGreat": 0,
|
"tapGreat": 0,
|
||||||
"tapGood": 0,
|
"tapGood": 0,
|
||||||
"tapMiss": 590,
|
"tapMiss": 0,
|
||||||
"holdCriticalPerfect": 0,
|
"holdCriticalPerfect": 9,
|
||||||
"holdPerfect": 0,
|
"holdPerfect": 0,
|
||||||
"holdGreat": 0,
|
"holdGreat": 0,
|
||||||
"holdGood": 0,
|
"holdGood": 0,
|
||||||
"holdMiss": 21,
|
"holdMiss": 0,
|
||||||
"slideCriticalPerfect": 0,
|
"slideCriticalPerfect": 4,
|
||||||
"slidePerfect": 0,
|
"slidePerfect": 0,
|
||||||
"slideGreat": 0,
|
"slideGreat": 0,
|
||||||
"slideGood": 0,
|
"slideGood": 0,
|
||||||
"slideMiss": 176,
|
"slideMiss": 0,
|
||||||
"touchCriticalPerfect": 0,
|
"touchCriticalPerfect": 0,
|
||||||
"touchPerfect": 0,
|
"touchPerfect": 0,
|
||||||
"touchGreat": 0,
|
"touchGreat": 0,
|
||||||
"touchGood": 0,
|
"touchGood": 0,
|
||||||
"touchMiss": 0,
|
"touchMiss": 0,
|
||||||
"breakCriticalPerfect": 0,
|
"breakCriticalPerfect": 1,
|
||||||
"breakPerfect": 0,
|
"breakPerfect": 0,
|
||||||
"breakGreat": 0,
|
"breakGreat": 0,
|
||||||
"breakGood": 0,
|
"breakGood": 0,
|
||||||
"breakMiss": 200,
|
"breakMiss": 0,
|
||||||
"isTap": True,
|
"isTap": True,
|
||||||
"isHold": True,
|
"isHold": True,
|
||||||
"isSlide": True,
|
"isSlide": True,
|
||||||
@@ -159,29 +179,11 @@ def UserPlaylog_payload(loginId: int, musicData: dict, userData: str):
|
|||||||
"trialPlayAchievement": -1,
|
"trialPlayAchievement": -1,
|
||||||
"extNum1": 0,
|
"extNum1": 0,
|
||||||
"extNum2": 0,
|
"extNum2": 0,
|
||||||
"extNum4": 3020,
|
"extNum4": 101,
|
||||||
"extBool1": False,
|
"extBool1": False,
|
||||||
"extBool2": False
|
"extBool2": False
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
}
|
|
||||||
return requestData_UserPlaylog
|
|
||||||
|
|
||||||
def UserAll_payload(loginId: int, loginDate: str, musicData: dict, GeneralUserInfo: list):
|
|
||||||
|
|
||||||
userData = json.loads(GeneralUserInfo[0])
|
|
||||||
userExtend = json.loads(GeneralUserInfo[1])
|
|
||||||
userOption = json.loads(GeneralUserInfo[2])
|
|
||||||
userRating = json.loads(GeneralUserInfo[3])
|
|
||||||
userChargeList = json.loads(GeneralUserInfo[4])
|
|
||||||
userActivity = json.loads(GeneralUserInfo[5])
|
|
||||||
userMissionDataList = json.loads(GeneralUserInfo[6])
|
|
||||||
|
|
||||||
requestData_UserAll = {
|
|
||||||
"userId": userId,
|
|
||||||
"playlogId": loginId,
|
|
||||||
"isEventMode": False,
|
|
||||||
"isFreePlay": False,
|
|
||||||
"upsertUserAll": {
|
"upsertUserAll": {
|
||||||
"userData": [
|
"userData": [
|
||||||
{
|
{
|
||||||
@@ -207,8 +209,8 @@ def UserAll_payload(loginId: int, loginDate: str, musicData: dict, GeneralUserIn
|
|||||||
"charaSlot": userData['userData']['charaSlot'],
|
"charaSlot": userData['userData']['charaSlot'],
|
||||||
"charaLockSlot": userData['userData']['charaLockSlot'],
|
"charaLockSlot": userData['userData']['charaLockSlot'],
|
||||||
"contentBit": userData['userData']['contentBit'],
|
"contentBit": userData['userData']['contentBit'],
|
||||||
"playCount": userData['userData']['playCount'],
|
"playCount": userData['userData']['playCount'] + 1,
|
||||||
"currentPlayCount": userData['userData']['currentPlayCount'],
|
"currentPlayCount": userData['userData']['currentPlayCount'] + 1,
|
||||||
"renameCredit": userData['userData']['renameCredit'],
|
"renameCredit": userData['userData']['renameCredit'],
|
||||||
"mapStock": userData['userData']['mapStock'],
|
"mapStock": userData['userData']['mapStock'],
|
||||||
"eventWatchedDate": userData['userData']['eventWatchedDate'],
|
"eventWatchedDate": userData['userData']['eventWatchedDate'],
|
||||||
@@ -281,10 +283,75 @@ def UserAll_payload(loginId: int, loginDate: str, musicData: dict, GeneralUserIn
|
|||||||
"userCourseList": [],
|
"userCourseList": [],
|
||||||
"userFriendSeasonRankingList": [],
|
"userFriendSeasonRankingList": [],
|
||||||
"userChargeList": userChargeList['userChargeList'],
|
"userChargeList": userChargeList['userChargeList'],
|
||||||
"userFavoriteList": [],
|
"userFavoriteList": [
|
||||||
|
{"itemKind": 3,"itemIdList": []},
|
||||||
|
{"itemKind": 1,"itemIdList": []},
|
||||||
|
{"itemKind": 2,"itemIdList": []},
|
||||||
|
{"itemKind": 10,"itemIdList": []},
|
||||||
|
{"itemKind": 11,"itemIdList": []}
|
||||||
|
],
|
||||||
"userActivityList": [userActivity['userActivity']],
|
"userActivityList": [userActivity['userActivity']],
|
||||||
"userMissionDataList": userMissionDataList['userMissionDataList'],
|
"userMissionDataList": [
|
||||||
"userWeeklyData": userMissionDataList['userWeeklyData'],
|
{
|
||||||
|
"type": userMissionDataList['userMissionDataList'][0]['type'],
|
||||||
|
"difficulty": userMissionDataList['userMissionDataList'][0]['difficulty'],
|
||||||
|
"targetGenreId": userMissionDataList['userMissionDataList'][0]['targetGenreId'],
|
||||||
|
"targetGenreTableId": userMissionDataList['userMissionDataList'][0]['targetGenreTableId'],
|
||||||
|
"conditionGenreId": userMissionDataList['userMissionDataList'][0]['conditionGenreId'],
|
||||||
|
"conditionGenreTableId": userMissionDataList['userMissionDataList'][0]['conditionGenreTableId'],
|
||||||
|
"clearFlag": userMissionDataList['userMissionDataList'][0]['clearFlag']
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": userMissionDataList['userMissionDataList'][1]['type'],
|
||||||
|
"difficulty": userMissionDataList['userMissionDataList'][1]['difficulty'],
|
||||||
|
"targetGenreId": userMissionDataList['userMissionDataList'][1]['targetGenreId'],
|
||||||
|
"targetGenreTableId": userMissionDataList['userMissionDataList'][1]['targetGenreTableId'],
|
||||||
|
"conditionGenreId": userMissionDataList['userMissionDataList'][1]['conditionGenreId'],
|
||||||
|
"conditionGenreTableId": userMissionDataList['userMissionDataList'][1]['conditionGenreTableId'],
|
||||||
|
"clearFlag": userMissionDataList['userMissionDataList'][1]['clearFlag']
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": userMissionDataList['userMissionDataList'][2]['type'],
|
||||||
|
"difficulty": userMissionDataList['userMissionDataList'][2]['difficulty'],
|
||||||
|
"targetGenreId": userMissionDataList['userMissionDataList'][2]['targetGenreId'],
|
||||||
|
"targetGenreTableId": userMissionDataList['userMissionDataList'][2]['targetGenreTableId'],
|
||||||
|
"conditionGenreId": userMissionDataList['userMissionDataList'][2]['conditionGenreId'],
|
||||||
|
"conditionGenreTableId": userMissionDataList['userMissionDataList'][2]['conditionGenreTableId'],
|
||||||
|
"clearFlag": userMissionDataList['userMissionDataList'][2]['clearFlag']
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": userMissionDataList['userMissionDataList'][3]['type'],
|
||||||
|
"difficulty": userMissionDataList['userMissionDataList'][3]['difficulty'],
|
||||||
|
"targetGenreId": userMissionDataList['userMissionDataList'][3]['targetGenreId'],
|
||||||
|
"targetGenreTableId": userMissionDataList['userMissionDataList'][3]['targetGenreTableId'],
|
||||||
|
"conditionGenreId": userMissionDataList['userMissionDataList'][3]['conditionGenreId'],
|
||||||
|
"conditionGenreTableId": userMissionDataList['userMissionDataList'][3]['conditionGenreTableId'],
|
||||||
|
"clearFlag": userMissionDataList['userMissionDataList'][3]['clearFlag']
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": userMissionDataList['userMissionDataList'][4]['type'],
|
||||||
|
"difficulty": userMissionDataList['userMissionDataList'][4]['difficulty'],
|
||||||
|
"targetGenreId": userMissionDataList['userMissionDataList'][4]['targetGenreId'],
|
||||||
|
"targetGenreTableId": userMissionDataList['userMissionDataList'][4]['targetGenreTableId'],
|
||||||
|
"conditionGenreId": userMissionDataList['userMissionDataList'][4]['conditionGenreId'],
|
||||||
|
"conditionGenreTableId": userMissionDataList['userMissionDataList'][4]['conditionGenreTableId'],
|
||||||
|
"clearFlag": userMissionDataList['userMissionDataList'][4]['clearFlag']
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": userMissionDataList['userMissionDataList'][5]['type'],
|
||||||
|
"difficulty": userMissionDataList['userMissionDataList'][5]['difficulty'],
|
||||||
|
"targetGenreId": userMissionDataList['userMissionDataList'][5]['targetGenreId'],
|
||||||
|
"targetGenreTableId": userMissionDataList['userMissionDataList'][5]['targetGenreTableId'],
|
||||||
|
"conditionGenreId": userMissionDataList['userMissionDataList'][5]['conditionGenreId'],
|
||||||
|
"conditionGenreTableId": userMissionDataList['userMissionDataList'][5]['conditionGenreTableId'],
|
||||||
|
"clearFlag": userMissionDataList['userMissionDataList'][5]['clearFlag']
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"userWeeklyData": {
|
||||||
|
"lastLoginWeek": userMissionDataList['userWeeklyData']['lastLoginWeek'],
|
||||||
|
"beforeLoginWeek": userMissionDataList['userWeeklyData']['beforeLoginWeek'],
|
||||||
|
"friendBonusFlag": userMissionDataList['userWeeklyData']['friendBonusFlag']
|
||||||
|
},
|
||||||
"userGamePlaylogList": [
|
"userGamePlaylogList": [
|
||||||
{
|
{
|
||||||
"playlogId": loginId,
|
"playlogId": loginId,
|
||||||
@@ -324,7 +391,7 @@ def UserAll_payload(loginId: int, loginDate: str, musicData: dict, GeneralUserIn
|
|||||||
"isNewItemList": "",
|
"isNewItemList": "",
|
||||||
"isNewMusicDetailList": "0",
|
"isNewMusicDetailList": "0",
|
||||||
"isNewCourseList": "",
|
"isNewCourseList": "",
|
||||||
"isNewFavoriteList": "",
|
"isNewFavoriteList": "11111",
|
||||||
"isNewFriendSeasonRankingList": "",
|
"isNewFriendSeasonRankingList": "",
|
||||||
"isNewUserIntimateList": "",
|
"isNewUserIntimateList": "",
|
||||||
"isNewFavoritemusicList": "",
|
"isNewFavoritemusicList": "",
|
||||||
|
|||||||
Reference in New Issue
Block a user