Skip to content

feat(CloudWeb): 添加 Windows 网页版支持及测试子模块 - #6746

Closed
SENyiAi wants to merge 2 commits into
MaaEnd:v2from
SENyiAi:feat/windows-cloud-webview
Closed

SENyiAi wants to merge 2 commits into
MaaEnd:v2from
SENyiAi:feat/windows-cloud-webview

Conversation

@SENyiAi

@SENyiAi SENyiAi commented Oct 23, 2026 •

Copy link
Copy Markdown

为 Windows 增加实验性的云终末地网页版控制器,复用现有 PC 任务流程。用户在官网自行选择扫码、手机号、密码或验证码登录;同一预任务检查登录状态、启动游戏并等待视频就绪,任务队列结束后由配套 GUI 关闭对应宿主窗口。

实现包括:

  • 独立 C++/WebView2 宿主、命名管道与 SharedBuffer 视频帧。游戏阶段从现有视频取得 RGBA 帧,经配套控制器编码为 MaaFramework 截图;官网阶段使用页面截图。关闭画质增强不改变游戏帧来源。
  • CDP 后台输入与固定 1280×720 坐标。保持按键/鼠标按下释放、相对移动及持续时间语义,处理 DPI 缩放、最小化视口和失焦悬停隔离,避免激活窗口或移动桌面鼠标。
  • 云网页专用资源覆盖官网启动、会话处理中、连接失败、菜单遮挡及串流按钮颜色差异;复用 PC 游戏业务流程,不修改公共送货决策。自动采集、滑索导入等入口保留,导入使用独立的普通 WebView。
  • Windows 构建与安装接入、五种界面语言、中英文开发文档和云截图识别用例。Android 继续使用已有云客户端实现。

关联:#6483 。测试素材:MaaEnd/MaaEndTestset#20 (子模块仍使用上游地址,已确认可从上游拉取对应 PR 提交)。

验证:

  • 基于上游 4ce7d7b6,正式候选 pnpm test 1759 jobs、pnpm check 通过;已有 3 项 ADB 缺图跳过单独保留,未将其计为通过。
  • 页面与视频策略 14 项 Node 测试通过;C++ 宿主和 Agent 的 Windows Release 构建通过;改动的 C++ 文件 clang-format 检查、中英文 markdownlint 检查通过。
  • 配套 MXU 前端构建、8 项现有 Node 测试、4 项 Windows 管道测试和 3 项任务回调跟踪测试通过。
  • 本机复用现有登录会话,以 GUI 开始按钮启动真实日常。官网“上次游戏数据处理中”弹窗已自动确认并重新进入游戏;最大化、最小化、窗口缩放时任务继续,其他窗口输入与鼠标悬停未抢焦点;Win+Shift+S 截图取消后仍有后续任务推进。

当前保持 Draft:

  • 主仓单独合入尚不能在官方 GUI 使用此控制器,需先与配套 GUI 维护者协调通用控制器发现和生命周期契约;本地 MXU 适配仍有 Win32-CloudWeb 名称及项目宿主路径的专属约定,尚未纳入本 PR。
  • 本轮 GUI 日常已结束:10 项中 9 项成功,委托转交失败。点击快速转交后画面已是奖励页,原流程仍等确认页,20 秒后报失败;原因尚未证实,未修改上游公共业务逻辑绕过。队列结束后云窗口自动关闭,GUI 正确显示失败并断开控制器。
  • 使用正式候选新编译宿主及 Agent 补测自动采集 CommonRoute1 共三轮:首轮在岩壁旁动态恢复超时;第二轮不主动切换云窗口,成功;第三轮寻路期间最大化、两次最小化、还原及窗口缩放,成功。第三轮六次窗口操作的焦点始终保留在 GUI,任务结束自动关闭云窗口。保留首轮失败,不据后续成功宣称问题已修复,也不据此认定控制器或上游路线的责任。
  • 自动抢委托送货与协议空间本轮未重复执行,是因为账号当日已完成;功能支持仍保留。QQ/微信截图、多显示器及全部采集路线尚未在本轮覆盖。

未提交桌面其它窗口截图、浏览器登录目录或账号数据。

@coderabbitai

coderabbitai Bot commented Oct 23, 2026

Copy link
Copy Markdown
Contributor

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@SENyiAi SENyiAi changed the title feat(CloudWeb): 添加 Windows 云终末地网页版支持 feat(CloudWeb): 添加 Windows 网页版支持及测试子模块 Oct 23, 2026
@yuhuan-zhen

Copy link
Copy Markdown
Contributor

看到这套实现了,Windows 侧我不再重复做(#6702 已关:C# 宿主 + Python 控制器,不符合「agent 只用 Go/C++」这条)。

我这边是 Linux(无桌面服务器)那一路,实测数据在手上:

  • 全量日常 9/9,12 分 24 秒(另一次 8/9、8 分 11 秒,AutoStockpile 时序抖动已用 post_delay=800 修掉)
  • 覆盖层 31 个节点(14 新增 + 17 覆盖),0 冗余字段
  • 模板:MapOverviewEnter 必须套 green_mask(0.645 → 0.992);PhotoIcon 0.623 → 0.991 / 1.000 / 0.901

想在维护者提的「启动器抽象」下认领 Linux 那条腿。契约提案放在 #6483 了:
#6483 (comment)

想先和你确认三点(提案里都写了):

  1. 消息形状沿用你的 cloud_protocol(长度前缀 JSON),还是套 CDP 的 JSON-RPC 外形?
  2. 无头模式没有窗口句柄,window_handle 在契约里是否可选?
  3. 帧统一走 querySelector('video') → canvas 1280×720 —— 你的 video_frame_policy.h 和我的 cdp_controller.py 已经是同一套 JS,差的只是承载(SharedBuffer vs CDP)。按这个思路,你的 C++ core 只需要多一个 Transport 实现,Linux 侧不用重写帧逻辑。

如果方向可以,我按你的目录和命名来写 Linux 启动器,不另起一套。

yuhuan-zhen added a commit to yuhuan-zhen/MaaEnd that referenced this pull request Oct 23, 2026
从 MaaEnd#6746(agent/cpp-algo/cloud-webview)移植两块页面侧逻辑,语言约束内
(本文件只是被 Linux launcher 复用的 JS 字符串与 Python 胶水,不进 agent)。

1) page_js.py —— 两段 JS,逐字对齐上游
   - PAGE_STATE_JS(← kPageState):一次求值返回 page/account/video_ready/
     start_target/session_busy_confirm_target/document_epoch 等,决策留给调用方
   - INPUT_POLICY_JS(← kInputPolicy):禁 webgl2 的 getContext(否则站点画质增强
     把 <video> 换成 OffscreenCanvas,取帧和键盘门控失效)、keydown 补 mouseenter、
     中键防自动滚屏、相对移动锚点改写、废 window.focus 与 requestPointerLock、
     记录启动资源失败

2) page_state.py —— prepare() 把页面推到 video_ready:ended / startup_error /
   login(用户操作不计时)/ session_busy(点知道了)/ landing(点开始游戏)/
   queue / starting / stream 八个分支

3) cdp_controller.py —— connect() 里安装策略(addScriptToEvaluateOnNewDocument +
   当前文档立即执行);新增 page_state() / prepare_page() / relative_move()

4) run_daily_linux.py —— 启动优先走状态机,失败回退 pipeline 启动链;
   新增 --no-state-machine

测试:
- web/linux/tests/page_state.test.mjs  17 例(假 DOM,从 py 里正则抽 JS)
- web/linux/tests/input_policy.test.mjs 13 例
- web/linux/tests/test_page_state.py 6 例(prepare 的分支与点击)
- tests/fake_cloud_page.html 假云页面,配合 e2e 脚本跑真浏览器

验证:node --test 30/30;unittest 6/6;ruff All checks passed;
真浏览器(Edge headless + canvas.captureStream 假视频)端到端:
  landing → 点击开始 → stream + video_ready + signed_in;
  webgl2 被禁 / 2d 可用 / focus 空函数 / movementX/Y = 17,-9 全部成立。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants