v0 plus附加功能
- 新增 unlockmusic.py:解锁(解禁)歌曲 + 解禁 Master / Re:Master 难度,整个流程复用 upsert.py 的 run() - 买票前置闸门 api/ChargeGuard.py:必须先跑过 GetUserCharge,且同进程只允许买一次 - buy_ticket.py 票源改为 GetUserCharge,不再调用 GetGameCharge - UpsertUserAll 与买票的冷却统一为 15 秒 - api/ 文件名统一 PascalCase(文件名 = 函数名) - 项目改名 Astral,README 加 Logo、鸣谢与开发者说明 - 自检 284 项
This commit is contained in:
+111
-78
@@ -20,59 +20,60 @@ api 包 —— 统一导出
|
||||
目录结构(一个 api 一个脚本)
|
||||
--------------------------------------------------------------------------------
|
||||
基础设施
|
||||
log_setup.py 统一日志(INFO / DEBUG 双模式)
|
||||
maimai_net.py 网络核心(AES / deflate / URL 混淆 / Cookie)
|
||||
user_getter_common.py 取数脚本公共底座(请求 VO / _get / 翻页)
|
||||
LogSetup.py 统一日志(INFO / DEBUG 双模式)
|
||||
MaimaiNet.py 网络核心(AES / deflate / URL 混淆 / Cookie)
|
||||
UserGetterCommon.py 取数脚本公共底座(请求 VO / _get / 翻页)
|
||||
ChargeGuard.py ★ 买票前置闸门:买票前必须先跑过 GetUserCharge
|
||||
|
||||
会话链路
|
||||
chime.py 扫码登录 -> userId + token
|
||||
get_game_settings.py GetGameSettingApi(游戏设置)
|
||||
ping.py 心跳探活
|
||||
get_user_preview.py GetUserPreviewApi(用户预览)
|
||||
userlogin.py UserLoginApi(正式登录 -> loginId + loginDateTime)
|
||||
userlogout.py UserLogoutApi(登出)
|
||||
Chime.py 扫码登录 -> userId + token
|
||||
GetGameSettings.py GetGameSettingApi(游戏设置)
|
||||
Ping.py 心跳探活
|
||||
GetUserPreview.py GetUserPreviewApi(用户预览)
|
||||
UserLogin.py UserLoginApi(正式登录 -> loginId + loginDateTime)
|
||||
UserLogout.py UserLogoutApi(登出)
|
||||
|
||||
上传 / 结算(有副作用的接口)
|
||||
upsert_user_all.py ★ UpsertUserAllApi(上传成绩)
|
||||
upsert_user_chargelog.py UpsertUserChargelogApi(购买功能票)
|
||||
get_need_user_data.py ★ 结算快照编排(统一调用下面的取数脚本),
|
||||
UpsertUserAll.py ★ UpsertUserAllApi(上传成绩 + 解锁歌曲/解禁难度)
|
||||
UpsertUserChargelog.py UpsertUserChargelogApi(购买功能票)
|
||||
GetNeedUserData.py ★ 结算快照编排(统一调用下面的取数脚本),
|
||||
并把结果落盘到 <工程根>/data/<userId>.json
|
||||
|
||||
★ 命名约定:服务端 API 名里带 Get 的,**脚本名与函数名一律带 get / Get**
|
||||
(不要模棱两可)。所以下面这些文件全是 get_ 开头。
|
||||
|
||||
取数 —— GetUser*(一个接口一个脚本)
|
||||
get_user_data.py GetUserDataApi
|
||||
get_user_extend.py GetUserExtendApi
|
||||
get_user_option.py GetUserOptionApi
|
||||
get_user_character.py GetUserCharacterApi
|
||||
get_user_ghost.py GetUserGhostApi
|
||||
get_user_map.py GetUserMapApi
|
||||
get_user_login_bonus.py GetUserLoginBonusApi
|
||||
get_user_rating.py GetUserRatingApi
|
||||
get_user_item.py GetUserItemApi
|
||||
get_user_music.py GetUserMusicApi
|
||||
get_user_course.py GetUserCourseApi
|
||||
get_user_charge.py GetUserChargeApi
|
||||
get_user_favorite.py GetUserFavoriteApi
|
||||
get_user_activity.py GetUserActivityApi
|
||||
get_user_mission.py GetUserMissionDataApi
|
||||
get_user_intimate.py GetUserIntimateApi
|
||||
get_user_shop_stock.py GetUserShopStockApi
|
||||
get_user_favorite_item.py GetUserFavoriteItemApi
|
||||
get_user_rival.py GetUserRivalDataApi / GetUserRivalMusicApi
|
||||
get_user_friend_bonus.py GetUserFriendBonusApi
|
||||
get_user_kaleidx_scope.py GetUserKaleidxScopeApi / GetGameKaleidxScopeApi
|
||||
get_user_region.py GetUserRegionApi
|
||||
get_user_recommend_music.py GetUserRecommendRateMusicApi / GetUserRecommendSelectMusicApi
|
||||
get_user_new_item.py GetUserNewItemListApi
|
||||
GetUserData.py GetUserDataApi
|
||||
GetUserExtend.py GetUserExtendApi
|
||||
GetUserOption.py GetUserOptionApi
|
||||
GetUserCharacter.py GetUserCharacterApi
|
||||
GetUserGhost.py GetUserGhostApi
|
||||
GetUserMap.py GetUserMapApi
|
||||
GetUserLoginBonus.py GetUserLoginBonusApi
|
||||
GetUserRating.py GetUserRatingApi
|
||||
GetUserItem.py GetUserItemApi
|
||||
GetUserMusic.py GetUserMusicApi
|
||||
GetUserCourse.py GetUserCourseApi
|
||||
GetUserCharge.py GetUserChargeApi
|
||||
GetUserFavorite.py GetUserFavoriteApi
|
||||
GetUserActivity.py GetUserActivityApi
|
||||
GetUserMission.py GetUserMissionDataApi
|
||||
GetUserIntimate.py GetUserIntimateApi
|
||||
GetUserShopStock.py GetUserShopStockApi
|
||||
GetUserFavoriteItem.py GetUserFavoriteItemApi
|
||||
GetUserRival.py GetUserRivalDataApi / GetUserRivalMusicApi
|
||||
GetUserFriendBonus.py GetUserFriendBonusApi
|
||||
GetUserKaleidxScope.py GetUserKaleidxScopeApi / GetGameKaleidxScopeApi
|
||||
GetUserRegion.py GetUserRegionApi
|
||||
GetUserRecommendMusic.py GetUserRecommendRateMusicApi / GetUserRecommendSelectMusicApi
|
||||
GetUserNewItem.py GetUserNewItemListApi
|
||||
|
||||
取数 —— GetGame*
|
||||
get_game_settings.py GetGameSettingApi
|
||||
get_game_charge.py GetGameChargeApi
|
||||
GetGameSettings.py GetGameSettingApi
|
||||
GetGameCharge.py GetGameChargeApi
|
||||
"""
|
||||
|
||||
from .log_setup import (
|
||||
from .LogSetup import (
|
||||
# 会话
|
||||
setup_logging,
|
||||
teardown_logging,
|
||||
@@ -107,8 +108,8 @@ from .log_setup import (
|
||||
# 1) 网络核心
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
from .maimai_net import (
|
||||
# 协议常量(原在 config.py,已下沉到 maimai_net.py)
|
||||
from .MaimaiNet import (
|
||||
# 协议常量(原在 config.py,已下沉到 MaimaiNet.py)
|
||||
BASE_URL,
|
||||
AES_KEY,
|
||||
AES_IV,
|
||||
@@ -141,9 +142,9 @@ from .maimai_net import (
|
||||
# 2) 会话链路
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
from .chime import (
|
||||
from .Chime import (
|
||||
ParseQRCode,
|
||||
# aimedb / QR 常量(原在 config.py,已下沉到 chime.py)
|
||||
# aimedb / QR 常量(原在 config.py,已下沉到 Chime.py)
|
||||
AIMEDB_HOST,
|
||||
AIMEDB_PORT,
|
||||
AIMEDB_PATH,
|
||||
@@ -153,7 +154,7 @@ from .chime import (
|
||||
QR_USER_AGENT,
|
||||
)
|
||||
|
||||
from .get_game_settings import (
|
||||
from .GetGameSettings import (
|
||||
GetGameSettings,
|
||||
GameSetting,
|
||||
GameSettingRequestVO,
|
||||
@@ -162,21 +163,21 @@ from .get_game_settings import (
|
||||
is_ping_disabled,
|
||||
)
|
||||
|
||||
from .ping import Ping
|
||||
from .Ping import Ping
|
||||
|
||||
from .get_user_preview import (
|
||||
from .GetUserPreview import (
|
||||
GetUserPreview,
|
||||
UserPreviewRequestVO,
|
||||
UserPreviewResponseVO,
|
||||
)
|
||||
|
||||
from .userlogin import (
|
||||
from .UserLogin import (
|
||||
UserLogin,
|
||||
UserLoginRequestVO,
|
||||
UserLoginResponseVO,
|
||||
)
|
||||
|
||||
from .userlogout import (
|
||||
from .UserLogout import (
|
||||
UserLogout,
|
||||
LogoutType,
|
||||
DelayLog,
|
||||
@@ -193,7 +194,7 @@ from .userlogout import (
|
||||
# 3) 上传成绩
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
from .upsert_user_all import (
|
||||
from .UpsertUserAll import (
|
||||
UpsertUserAll,
|
||||
PlayData,
|
||||
build_play_from_config,
|
||||
@@ -236,6 +237,13 @@ from .upsert_user_all import (
|
||||
load_extra_data,
|
||||
merge_extra_data,
|
||||
verify_upsert_landing,
|
||||
# ★ 歌曲解锁(解禁):写进 userItemList 的 itemKind 5/6/7
|
||||
build_unlock_items,
|
||||
ITEM_KIND_MUSIC_UNLOCK,
|
||||
ITEM_KIND_MUSIC_UNLOCK_MASTER,
|
||||
ITEM_KIND_MUSIC_UNLOCK_REMASTER,
|
||||
ITEM_KIND_MUSIC_UNLOCK_STRONG,
|
||||
UNLOCK_MASTER_MIN_MUSIC_ID,
|
||||
default_user_weekly_data,
|
||||
default_user_2p_playlog,
|
||||
calc_play_special,
|
||||
@@ -255,7 +263,7 @@ from .upsert_user_all import (
|
||||
USER_MISSION_DROP_KEYS,
|
||||
)
|
||||
|
||||
from .get_need_user_data import (
|
||||
from .GetNeedUserData import (
|
||||
GetNeedUserData,
|
||||
save_snapshot,
|
||||
load_snapshot,
|
||||
@@ -270,8 +278,24 @@ from .get_need_user_data import (
|
||||
list_saved_user_ids,
|
||||
)
|
||||
|
||||
from .upsert_user_chargelog import (
|
||||
# 票券主数据(原在 config.py,已下沉到 upsert_user_chargelog.py)
|
||||
# ---------------------------------------------------------------------------
|
||||
# ★ 买票前置闸门:GetUserCharge 必须先跑过(见 api/ChargeGuard.py)
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
from .ChargeGuard import (
|
||||
CHARGE_READ_FRESH_SEC,
|
||||
has_fresh_read,
|
||||
held_charges,
|
||||
last_charge_list,
|
||||
last_read_age,
|
||||
note_charge_purchase,
|
||||
note_user_charge_read,
|
||||
purchased_charge_ids,
|
||||
reset as reset_charge_guard,
|
||||
)
|
||||
|
||||
from .UpsertUserChargelog import (
|
||||
# 票券主数据(原在 config.py,已下沉到 UpsertUserChargelog.py)
|
||||
TICKET_CREDIT_NUM,
|
||||
TICKET_NAMES,
|
||||
PAID_TICKET_IDS,
|
||||
@@ -294,7 +318,7 @@ from .upsert_user_chargelog import (
|
||||
# 4) 取数公共底座
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
from .user_getter_common import (
|
||||
from .UserGetterCommon import (
|
||||
EmptyRequestVO as GetterEmptyRequestVO,
|
||||
UserIdRequestVO as GetterUserIdRequestVO,
|
||||
UserIdPageRequestVO,
|
||||
@@ -318,37 +342,37 @@ from .user_getter_common import (
|
||||
# 5) 取数脚本(一个接口一个脚本)
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
from .get_user_data import GetUserData
|
||||
from .get_user_extend import GetUserExtend
|
||||
from .get_user_option import GetUserOption
|
||||
from .get_user_character import GetUserCharacter
|
||||
from .get_user_ghost import GetUserGhost
|
||||
from .get_user_map import GetUserMap, GetUserMapAll
|
||||
from .get_user_login_bonus import GetUserLoginBonus, GetUserLoginBonusAll
|
||||
from .get_user_rating import GetUserRating
|
||||
from .get_user_item import GetUserItem, GetUserItemAll
|
||||
from .get_user_music import GetUserMusicDetail, GetUserMusicDetailAll
|
||||
from .get_user_course import GetUserCourse, GetUserCourseAll
|
||||
from .get_user_charge import GetUserCharge
|
||||
from .get_user_favorite import GetUserFavorite, GetUserFavoriteAll
|
||||
from .get_user_activity import GetUserActivity
|
||||
from .get_user_mission import GetUserMissionData
|
||||
from .get_user_intimate import GetUserIntimate
|
||||
from .get_user_shop_stock import GetUserShopStock
|
||||
from .get_user_favorite_item import (
|
||||
from .GetUserData import GetUserData
|
||||
from .GetUserExtend import GetUserExtend
|
||||
from .GetUserOption import GetUserOption
|
||||
from .GetUserCharacter import GetUserCharacter
|
||||
from .GetUserGhost import GetUserGhost
|
||||
from .GetUserMap import GetUserMap, GetUserMapAll
|
||||
from .GetUserLoginBonus import GetUserLoginBonus, GetUserLoginBonusAll
|
||||
from .GetUserRating import GetUserRating
|
||||
from .GetUserItem import GetUserItem, GetUserItemAll
|
||||
from .GetUserMusic import GetUserMusicDetail, GetUserMusicDetailAll
|
||||
from .GetUserCourse import GetUserCourse, GetUserCourseAll
|
||||
from .GetUserCharge import GetUserCharge
|
||||
from .GetUserFavorite import GetUserFavorite, GetUserFavoriteAll
|
||||
from .GetUserActivity import GetUserActivity
|
||||
from .GetUserMission import GetUserMissionData
|
||||
from .GetUserIntimate import GetUserIntimate
|
||||
from .GetUserShopStock import GetUserShopStock
|
||||
from .GetUserFavoriteItem import (
|
||||
GetUserFavoriteItem,
|
||||
GetUserFavoriteItemAll,
|
||||
FAVORITE_ITEM_KIND_MUSIC,
|
||||
FAVORITE_ITEM_KIND_RIVAL,
|
||||
)
|
||||
from .get_user_rival import GetUserRivalData, GetUserRivalMusic, GetUserRivalMusicAll
|
||||
from .get_user_friend_bonus import GetUserFriendBonus, extract_gift_points
|
||||
from .get_user_kaleidx_scope import GetUserKaleidxScope, GetGameKaleidxScope
|
||||
from .get_user_region import GetUserRegion
|
||||
from .get_user_recommend_music import GetUserRecommendRateMusic, GetUserRecommendSelectMusic
|
||||
from .get_user_new_item import GetUserNewItemList, UserNewItemListRequestVO
|
||||
from .GetUserRival import GetUserRivalData, GetUserRivalMusic, GetUserRivalMusicAll
|
||||
from .GetUserFriendBonus import GetUserFriendBonus, extract_gift_points
|
||||
from .GetUserKaleidxScope import GetUserKaleidxScope, GetGameKaleidxScope
|
||||
from .GetUserRegion import GetUserRegion
|
||||
from .GetUserRecommendMusic import GetUserRecommendRateMusic, GetUserRecommendSelectMusic
|
||||
from .GetUserNewItem import GetUserNewItemList, UserNewItemListRequestVO
|
||||
|
||||
from .get_game_charge import GetGameCharge, GameChargeRequestVO
|
||||
from .GetGameCharge import GetGameCharge, GameChargeRequestVO
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# 6) 需要日志跟踪的 api 函数(新增 api 时把函数名加到这里)
|
||||
@@ -369,6 +393,7 @@ _API_FUNCS = (
|
||||
"merge_extra_data",
|
||||
"verify_upsert_landing",
|
||||
"build_user_all",
|
||||
"build_unlock_items",
|
||||
# --- 购买功能票 ---
|
||||
"UpsertUserChargelog",
|
||||
"ticket_name",
|
||||
@@ -471,8 +496,16 @@ __all__ = [
|
||||
# ---- 上传成绩 ----
|
||||
"UpsertUserAll", "PlayData", "build_play_from_config", "derive_play_characters",
|
||||
"load_extra_data", "merge_extra_data", "verify_upsert_landing",
|
||||
# ---- 歌曲解锁(解禁)----
|
||||
"build_unlock_items", "UNLOCK_MASTER_MIN_MUSIC_ID",
|
||||
"ITEM_KIND_MUSIC_UNLOCK", "ITEM_KIND_MUSIC_UNLOCK_MASTER",
|
||||
"ITEM_KIND_MUSIC_UNLOCK_REMASTER", "ITEM_KIND_MUSIC_UNLOCK_STRONG",
|
||||
# ---- 购买功能票 ----
|
||||
"UpsertUserChargelog", "ChargelogConfirmError", "ChargelogGuardError",
|
||||
# ---- 买票前置闸门(GetUserCharge 必须先跑过)----
|
||||
"CHARGE_READ_FRESH_SEC", "has_fresh_read", "held_charges", "last_charge_list",
|
||||
"last_read_age", "note_charge_purchase", "note_user_charge_read",
|
||||
"purchased_charge_ids", "reset_charge_guard",
|
||||
"UserChargeVO", "UserChargelogVO", "UserChargelogRequestVO",
|
||||
"ticket_name", "ticket_price", "calc_valid_date", "parse_wall_time", "now_cst",
|
||||
"UserAllRequestVO", "UpsertResponseVO",
|
||||
|
||||
Reference in New Issue
Block a user