Skip to content

fix(m9a): 修复 B 服选号并在代理前核对 UID - #1978

Open
Douya36 wants to merge 2 commits into
AUTO-MAS-Project:devfrom
Douya36:fix/m9a-bili-login-uid
Open

Douya36 wants to merge 2 commits into
AUTO-MAS-Project:devfrom
Douya36:fix/m9a-bili-login-uid

Conversation

@Douya36

@Douya36 Douya36 commented Nov 13, 2026

Copy link
Copy Markdown

摘要

  • 兼容 B 服昵称中的「ゞ」被 OCR 识别为「>」的情况。仅在唯一匹配时选号,并复核登录按钮与所选昵称。
  • 在 M9A 账号设置中新增游戏 UID。MAS 登录 B 服时先运行 StartUp,连续两帧识别到预期 UID 后才执行剩余任务。缺填 UID、识别超时或 UID 不一致时停止本轮。
  • 调整登录面板退出、标题页和登出确认的识别,补充特殊昵称、UID 核对及后续任务拦截的回归用例。

验证

  • 本地 M9A 登录模式和登录流程回归测试共 43 项通过,涵盖特殊昵称、UID 匹配及不匹配时的任务执行。
  • Vue 应用类型检查通过。真实 B 服账号和模拟器流程待验证。

@github-actions github-actions Bot added 专项: M9A 类型: 修复 按更新日志碎片自动设置 labels Nov 13, 2026

Copy link
Copy Markdown
Contributor

总体结论:修改后合并

宝宝,先核对 UID 再放行日常任务,这层保护有接上喵。不过拆成两次 worker 执行后,原来的任务编号和 ADB 路径没有一起传过去,会让原本能继续的流程中断,下面两处先补好。

[逻辑 · P2] 拆段后,普通任务被当成了整轮首任务

位置:runner_task.py:2130–2144。

以原计划 [StartUp, A, B, Close1999] 为例:UID 核对后另起 worker 执行 [A, B, Close1999],runner 从 0 重新编号,A 就变成首任务了。现有单任务超时和原地打转处理对 index 0 会直接结束整轮;原来 A 是 index 1,停止成功后会记失败并继续 B。现在即使 B 与 A 无关,也跑不到。

同一编号变化还会弄错历史:宿主按完整计划预建记录,第二段事件却从 0 开始;记录器按编号和名称匹配,于是追加新的 A/B/Close1999,原条目仍是“跳过”。拼接 completedTasks 不会修复事件记录。

请让分段执行保留完整计划的位置和首任务语义,事件也使用一致编号,不要直接删掉引擎原有的首任务保护。补一个 A 超时后 B 仍执行、历史每项只有一条正确状态的场景就很有针对性啦;当前新增测试替换了整个 _run_maafw_worker,没经过这些分支。

[逻辑 · P2] UID 检查没有拿到登录时发现的 ADB 路径

位置:runner_task.py:2133–2137。

未手填 ADB 路径、宿主也无法从模拟器配置推导时,现有登录钩子会用 Toolkit 按地址发现路径,但只更新局部变量;device_config.adbPath 仍是空值。StartUp 的 worker 能自行发现 ADB,不过它在子进程里,不会把路径写回宿主。

接着 UID 核验收到空路径,截图设备便退回运行 adb。例如依赖 Toolkit 找到 HD-Adb.exe、PATH 又没有 adb 的环境,选号和 StartUp 都可能成功,到了这里却报找不到 ADB,后续任务全部被挡住。手填路径或使用宿主 ADB 通道的情况不受影响。

这里复用登录阶段已解析的路径就好喵,让登录、StartUp 和 UID 检查拿到同一个结果;把已有 Toolkit 路径测试延伸到 UID 检查,别让它在交接时丢掉。

以上是源码静态推演,未运行项目测试或真实 B 服流程。

—— 盯着任务交接不放的 dot酱敬上 🐾

@AthenaHibou AthenaHibou left a comment

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.

功能实现我没侧,但是看代码逻辑这两个部分有较为明显的问题,建议处理一下

Comment thread app/task/M9A/login.py
Comment on lines +165 to +170
def _account_matches(text: str, account: str) -> bool:
"""兼容实机 OCR 将昵称中的「ゞ」读成「>」;仍需唯一匹配并核对游戏 UID。"""

return text.replace("ゞ", ">") == account.replace("ゞ", ">")


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.

这一部分的代码怎么感觉像面向结果的开发,不具有泛用性,且会直接影响本机测试的结果,属于对本机测试的特调型代码,建议去掉

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

@qiyinxi

qiyinxi commented Nov 13, 2026

Copy link
Copy Markdown
Member

几处要改:

  1. UID 不一致时重试无效:_ensure_logged_in 成功后 _login_checked 已经是 True,_run_maafw 里核对 UID 失败后按普通失败重试,重试会跳过登录,每轮都在同一个号上重跑 StartUp 再失败。建议 UID 不一致时复位 _login_checked,让重试重新选号;或者把这个失败定为不可重试。

  2. 通用引擎改动没走契约:account_verification_entry / verify_game_account 是用 getattr 找的,没写进 tools/embedded/flavor.py 的钩子契约,也没在 app/task/MaaFW/AGENTS.md 里说明。拆成两次 worker 运行后:

    • agent 和资源要重新加载;
    • 运行记录的「环境」段会出现两次;
    • _attempt_native_errors 被第二段清空;
    • 结果只合了 completedTasks。

    麻烦补上契约,并把这些写清楚。

  3. 实机验证过的锚点被改了:_EXIT_POINT、_EXPAND_POINT 原注释写着 2560×1440 实机验证过,这次改了坐标,还删了「欢迎回来」信号。新加的 START 坐标和 UID 区域按 16:9 写死。合并前要有 B 服实机证据。

  4. 已有 Mas 登录账号升级后会直接失败(没填 UID)。碎片里加一句「需在账号配置中补填 UID」。

小问题:

  • UID 位数填错时,提示是「未能确认」,不是「不一致」。
  • 前端 UID 输入框没有数字校验,填了非数字会被后端拒掉,用户看不到原因。

另外格式检查是红的,跑一下 ruff format 就行。

@Douya36

Douya36 commented Nov 13, 2026

Copy link
Copy Markdown
Author

本轮审查意见已处理,修订在 dd6b9a3。

  • MAS 在 B 服登录流程内完成选号、进入主页和 UID 核对。UID 不一致会在登录标记置位前报错,重试会重新走登录流程。已在主页时先核对 UID,确认不符才退出重选。
  • 含汉字的昵称按提取后的完整汉字匹配,无汉字的昵称按 OCR 原文精确匹配,只接受唯一候选。ADB 地址和宿主解析到的路径由登录和 worker 共用。
  • 任务计划和历史记录共用同一份队列,只启动一次 worker。补齐了特调启动钩子的契约,回归覆盖首项日常任务超时后下一项继续执行、历史条目无重复。
  • 恢复原有退出、展开坐标和「欢迎回来」信号。更新日志已提示已有 MAS 登录账号补填 UID,前端会提示并拦截非数字输入。能稳定读出实际 UID 时,位数不同也会报 UID 不一致。

本地 60 项回归测试通过,Ruff 格式、Vue 类型和多语言检查通过。B 服实机验证了本次涉及的核心功能,测试提前结束,后续任务没有完整跑完。

Copy link
Copy Markdown
Contributor

总体结论:修改后合并

宝宝,单 worker、统一 ADB 路径和首项任务的超时处理都补好了,上一轮两处 P2 可以划掉啦。不过把进入游戏也移到登录阶段后,还漏了 START 到可核验主页这一段。

[逻辑 · P2] 点击 START 后只等 UID,正常加载和启动弹窗会被判成登录失败

login.py:595–601 点击 START 就返回,随后立即核验 UID。这段核验固定只等 20 秒,而且只截图读 UID,不会关闭签到、公告等启动弹窗。

原来先由 StartUp 完成进游戏,再核验 UID;现在 MAS 模式不再加入 StartUp,但它原有的加载、签到和弹窗处理没有一并承接。上游 StartGame 的后续节点明确覆盖这些情况,B 服资源也沿用该流程。

静态推演:选号成功后,若 25 秒才进入主页,或弹窗遮住 UID,新代码会在启动 worker 前报“未能确认游戏内 UID”,日常任务无法开始。外层 240 秒和 Game.WaitTime 没有传入这段核验;后续任务的返回主页逻辑也还没机会执行。你补充的实机结果还没有说明这两条分支,合并前把它们也补上吧喵。

请在 M9A 登录流程中补齐“进入可核验主页”的阶段,复用适用的上游启动能力或明确处理对应画面,再做连续两帧 UID 校验;只加长 UID 轮询还解决不了弹窗。补上 START 后延迟 25 秒才出现正确 UID、以及签到/公告关闭后再核验的回归场景,错误 UID 仍须阻止任务执行。以上未运行项目测试或实机复现。

—— 还在等主页真正就绪的 dot酱敬上 🐾

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

专项: M9A 类型: 修复 按更新日志碎片自动设置

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants