# maipulse 舞萌 DX 国服(SDGB)的本地发包台。Flask + 单页前端,安卓壳用 Chaquopy 把 Python 打进 APK。 所有机台身份(标题服务器地址、AES 密钥与 IV、混淆盐)和店铺信息都已经抹掉, 字段留空,运行时从配置文件读。想用的话自己填——见下面的「配置」。 ## 目录 ``` maipulse/ Python 后端 + 前端单页 app.py Flask 入口,所有 HTTP 接口 core/ 业务模块(session / b50 / unlock / items / settle ...) html/index.html 整个界面(CSS/JS 全内联) data/master/ 曲库与道具索引(公开数据) tools/ 打包、更新合并、脱敏脚本 astral/ SDGB 协议实现(脱敏副本,config.py 需要自己生成) android/ Android 壳工程(Gradle + MainActivity) ``` ## 配置 `astral/config.py` 和 `astral/api/MaimaiNet.py` 里的关键字段全部为空: | 字段 | 说明 | | --- | --- | | `CLIENT_ID` | 11 位机台 ID | | `PLACE_ID` / `REGION_ID` | 店铺 / 区域 ID | | `PLACE_NAME` | 店铺名,只用于界面显示 | | `BASE_URL` | 标题服务器地址 | | `AES_KEY` / `AES_IV` | 32 / 16 字节 | | `OBFUSCATE_PARAM` | 8 位混淆盐 | 填完在设置页点「导入配置」加载 JSON,或者直接改这两个文件后重启。 仓库根目录有一份空白模板 `maipulse-config.json`(`maipulse/` 下也放了一份),所有字段都是空的, 照着填就行。文件要存成 UTF-8 无 BOM,否则 JSON 解析会失败。 ## 跑起来 先把配置模板复制一份,否则 import 会缺 config: ```bash cd astral && cp config.py.example config.py ``` ```bash python app.py # http://127.0.0.1:8787 ``` 依赖:`flask`、`requests`、`pycryptodome`。 ## 打包 APK ```powershell powershell -NoProfile -ExecutionPolicy Bypass -File maipulse\tools\build_apk.ps1 ``` 脚本会:清空旧产物 → 同步资源 → 脱敏 → 编译 → `zipalign -P 16`(16KB 页对齐,Android 15+ 要求)→ 重签 → 放到桌面。 需要自己准备一个 debug keystore 放在 `android/` 下,并在 `android/app/build.gradle` 里改路径。 **keystore 不进仓库**,它带着私钥。 ## 数据更新 官方更新包(`SDGB_A0xx_*`)到手后: ```bash python maipulse/tools/apply_update.py "路径/包目录" --dry # 先看差异 python maipulse/tools/apply_update.py "路径/包目录" # 真正写入 ``` 只做增量合并,写盘前自动备份到 `data/_backup/`。 ## 脱敏说明 `maipulse/tools/blank_secrets.py` 是打包时自动跑的那一步:从主仓读出真实值, 在副本里全部替换成占位符,然后自己复核一遍,有残留就 return 2 让打包失败。 这个仓库里跑过同样的流程,30 处替换,复核无残留。