Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions app/models/config/script.py
Original file line number Diff line number Diff line change
Expand Up @@ -2670,12 +2670,23 @@


class M9AUserConfig(MaaFWUserConfig):
"""M9A 账号配置:与 MaaFW 账号配置同形。
"""M9A 账号配置,含 B 服登录后的 UID 核对。

Check warning on line 2673 in app/models/config/script.py

View workflow job for this annotation

GitHub Actions / 检查是否删掉了他人近期合入的代码

可能回退了 #1836 的改动

这里删掉了 #1836(1w1w11w1,2026-11-05 11:28 UTC 合入)加入的 1 行(原第 2673 行)。如果不是有意修改,多半是同步分支时带回了旧版本的文件。

``Info.Account`` 在这里不只是备注:脚本资源为官服且账号非空时,运行前会自动插入
「切换账号」任务(见 ``app/task/M9A/flavor.py``)。
"""

class InfoFields(MaaFWUserConfig.InfoFields):
GameUID: str = Field(
default_factory=lambda: "",
pattern=r"^[0-9]*$",
description="游戏内数字 UID,用于 MAS 登录 B 服后核对账号",
)

Info: InfoFields = Field( # pyright: ignore[reportIncompatibleVariableOverride]
default_factory=InfoFields
)


class M9AConfig(MaaFWConfig):
"""M9A 托管配置:MaaFW 的特调类型。
Expand Down Expand Up @@ -2708,7 +2719,7 @@
default_factory=lambda: "Project",
description="B 服登录方式。Project:由 M9A 项目的启动任务自己登录(上游「切换账号」仍只声明官服);"
"Mas:由 MAS 完成 B 服登录——拉起 B 服客户端后处理隐私政策提示、在登录记录里选择已保存的账号,"
"回到标题页后再交给 M9A 的启动任务进游戏并照常运行。Mas 需要 ADB controller 并在「游戏包名」里"
"进入游戏并核对账号配置中的 UID 后再交给 M9A 运行。Mas 需要 ADB controller 并在「游戏包名」里"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

此处的设计是否意味着,账号切换需要与M9A功能完成,即mas侧ocr做了一半,再丢给m9a做一部分,再返还给mas继续做,代码不内聚,建议把整个启动流程的操作都收敛到mas里后在交付给m9a

"填写 B 服包名(com.shenlan.m.reverse1999.bilibili),账号填登录记录里显示的完整昵称,"
"且不再向 M9A 下发「切换账号」。自动同意隐私提示复用全局「同意哔哩哔哩用户协议」开关(默认关闭),"
"未开启时登录会停下并提示手动处理。",
Expand Down
16 changes: 9 additions & 7 deletions app/task/M9A/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
任一命中即认领——导入完成后引擎据此把托管类型定成 `M9AConfig`(不命中的项目导进 M9A 脚本会变回
`MaaFWConfig`,类型由项目决定、双向自动、uid 不变)。
2. `decorate_selection(...)`:运行前先把勾选列表里三类受管任务**全部剔掉**(连同它们的选项),再按
固定顺序补:`StartUp` 放队首;脚本资源支持切号且有账号时 `SwitchAccount` 紧跟启动、账号填进它
固定顺序补:项目登录时 `StartUp` 放队首(MAS 登录 B 服时由登录钩子完成启动);脚本资源支持切号且有账号时 `SwitchAccount` 紧跟启动、账号填进它
第一个 input 选项;`Close1999` 放队尾。用户排的顺序不影响这三项。账号取 `Info.Account`,但队列里
恰好残留一个有效切号时取它(与启动整理的结果一致)。支持切号且有效切号 ≥ 2 时写账号日志并抛
`M9ASplitRequiredError`——引擎把它当成运行计划构建失败,该账号记「异常」、发错误通知、不跑,其它
Expand Down Expand Up @@ -67,15 +67,17 @@
- `login.py`:`Run.LoginMode == "Mas"` 时的 B 服原生登录(`ensure_logged_in` 钩子)。MAS 启动模拟器
(连带拉起游戏)之后、第一个任务之前,用 `adb` 截图 + `app.tools.common.ocr` 识别哔哩哔哩登录面板:
点「隐私政策提示」里唯一的「同意」,在「登录记录」里按 `Info.Account`(登录记录里显示的完整昵称)
精确匹配、唯一命中后选中并点「登录」,等面板消失、连续两帧认出标题页后才返回;进游戏与跑任务交给
M9A 的 `StartUp` 与用户队列。标题页的正向信号有四种:OCR 到「START」(或漏首字母的 TART)、
标题 logo 下的完整「REVERSE」或实机常读到的残词 `ERSE`、或登录成功后顶栏的「<昵称> 欢迎回来」横幅。
游戏已登录停在标题页(任一信号)时,
含汉字的昵称提取汉字后完整匹配,无汉字的昵称按 OCR 原文精确匹配,唯一命中才选中并点「登录」。
登录面板退出后由 MAS 在标题页点 START,连续两帧识别到的 UID 与 `Info.GameUID` 一致才投递任务。
如果一开始就在主页,UID 一致直接继续,确认不符时经设置 → 账号 → 退出 → 返回登录,然后重新选号。
主页退出导航及 `login_assets/` 的两个模板来自 MAA1999/M9A(AGPL-3.0,原始提交
[e03c1c6](https://github.com/MAA1999/M9A/tree/e03c1c60e51bff35c909aad96c58fde58a117946/resource/base/image/SwitchAccount))。
游戏已登录停在标题页时,
MAS 不知道当前是哪个号,为保证切到目标账号,先点标题页右下角退出图标 → 唯一的「确认」→ 等「登录记录」
出现再选号。`adb` 子进程走 `app/utils/common/process/runner.py` 的受管入口:任务被停止时命令随作用域
回收,截图分支保留 PNG 原始 bytes(不能按文本解码)。
**边界**:自动同意只复用全局 `Config.setting.Function.IfAgreeBilibili`(默认关),关着时不点、
提示手动处理并停止;既认不出登录记录也认不出标题页(例如停在别的账号的主界面)时明确停止,
提示手动处理并停止;既认不出登录记录也认不出标题页且无法识别主页 UID(例如加载中)时明确停止,
不把"没认出登录页"当成功;这段等待的预算取 `Game.WaitTime`(冷启动加载画面同样认不出,不能按
固定 60 秒截断慢启动的客户端),总时长仍受登录主循环 240 秒约束;所有循环先查总时限,
`adb input tap` 失败直接抛错。
Expand All @@ -86,7 +88,7 @@
没填时按这个包名拉起)。脚本资源不是「B 服」或实际要启动的包名不是 B 服包时直接报错,
不拿错客户端去走哔哩哔哩登录面板。`Run.LoginMode` 默认 `Project`(M9A 项目自己登录),只在 M9A 脚本有。
这是**临时补位**:上游 M9A 的 interface 已声明 B 服资源(任务运行可用),但「切换账号」仍只声明
官服、没有按 B 站昵称选号的入口;上游补齐等价入口后删除本模块的选号逻辑(立项时未单独向上游提
官服、没有按 B 站昵称选号的入口;上游补齐等价入口后移除这里的 B 服退出、选号及启动补位(立项时未单独向上游提
PR:本实现属于 MAS 侧运行前编排,上游入口补齐前无法复用)。
- `migration.py`:旧版 M9A 专项配置(`Run.IfPsychubeDailyOnce`、`Task.Queue`、`Data.LastPsychubeDate`…)
→ MaaFW 形状的一次性迁移,以及「通用 MaaFW 脚本指向 M9A 项目 → 换类型标签」。在
Expand Down
21 changes: 13 additions & 8 deletions app/task/M9A/flavor.py
Original file line number Diff line number Diff line change
Expand Up @@ -244,14 +244,16 @@ def log(message: str) -> None:
return ids, options

added: list[str] = []
startup = task_name_for_entry(interface_model, STARTUP_ENTRY)
if startup is None:
log(
f"[M9A] interface 里没有 entry 为 {STARTUP_ENTRY} 的任务,未自动加入启动游戏"
)
else:
ids.insert(0, startup)
added.append(startup)
startup = None
if not self.manages_game_startup(script_config):
startup = task_name_for_entry(interface_model, STARTUP_ENTRY)
if startup is None:
log(
f"[M9A] interface 里没有 entry 为 {STARTUP_ENTRY} 的任务,未自动加入启动游戏"
)
else:
ids.insert(0, startup)
added.append(startup)

# 队列里恰好一个有效切号时以它为准,与启动整理的结果一致(整理会把它收进「账号」)
account = (
Expand Down Expand Up @@ -361,6 +363,9 @@ async def ensure_logged_in(
host_adb=host_adb,
)

def manages_game_startup(self, script_config: Any) -> bool:
return _login_mode(script_config) == LOGIN_MODE_MAS

async def ensure_game_updated(
self,
*,
Expand Down
Loading
Loading