Open Computer Use 代码优先玩法:ocu js 与 cua 异步 API 自动化脚本编写完整教程
【免费下载链接】open-codex-computer-use👾 Open Computer Use – Open-Source Alternative to Codex Computer Use项目地址: https://gitcode.com/gh_mirrors/op/open-codex-computer-use
Open Computer Use 是一个开源的 Computer Use 桌面自动化服务,支持 macOS、Linux 和 Windows。除了把它接入 AI 客户端当 MCP 服务器用,它还有一个更"极客"的玩法:通过 npm 命令ocu js直接在命令行里跑 JavaScript 自动化脚本,配合内置的cua 异步 API,几行代码就能完成"读取界面 → 点击 → 输入 → 校验"的完整桌面操作流程。本文就是 ocu js 与 cua API 的完整教程,从零开始带你写出第一个桌面自动化脚本。
为什么选"代码优先":一条 JS 调用顶十次工具调用
传统的 MCP 工具调用方式下,每做一步操作(查状态、点击、输入……)都要和模型或宿主之间往返一次,流程长、速度慢、中间状态反复序列化。而 Open Computer Use 官方提供的**代码优先(code-first)**玩法,让你在一段 JavaScript 里把"检查 → 操作 → 再检查 → 分支 → 重试 → 校验"全部本地编排完成,一次js调用就把整段流程跑完。
这套设计对齐了官方 Computer Use 的代码优先工作流,完整背景可以读参考文档:docs/references/js-repl.md。
核心架构分四层:
- 持久化 Node.js REPL—— 持有顶层变量绑定和顶层
await; - 异步的
cuaAPI—— 把 JavaScript 调用翻译成原生 MCP 请求; - 原生运行时(Swift / Go / Python)—— 负责应用发现、截图、无障碍树和输入模拟;
- Worker 边界—— 超时时可以安全终止 CPU 占满的脚本并重建内核。
一键安装:3 步完成环境准备 🚀
第 1 步:全局安装 npm 包
npm i -g open-computer-use安装后会自动注册短命令ocu,两个名字可以互换使用。npm 启动器要求 Node.js 18 或更高版本;macOS 运行时要求 macOS 14.0 及以上。
第 2 步:授予权限(仅 macOS)
首次运行一次ocu,按提示授予Accessibility(辅助功能)和Screen Recording(屏幕录制)权限即可。Windows 与 Linux 无需此步骤。
第 3 步:运行环境体检
写脚本前先做一次能力检查,确认 Node、REPL 适配器、JS 内核和原生运行时都可用:
ocu capabilities # 想要结构化的 JSON 报告: ocu capabilities --json命令会逐项报告组件可用性;即使某个组件缺失,js/repl命令依然会显示在帮助里,并标注缺失原因,方便排查。能力检测逻辑位于 scripts/node-repl/open-computer-use-cli.mjs,REPL 适配器实现在 scripts/node-repl/open-computer-use-repl.mjs。
ocu js 的三种用法:命令行、管道与文件
ocu js用于执行一段 JavaScript 求值,支持顶层await和已初始化的cuaAPI,执行完即关闭 Worker 和原生 MCP 子进程。它接受三种输入来源,按需选择:
| 用法 | 命令示例 | 适用场景 |
|---|---|---|
| 命令行参数 | ocu js 'nodeRepl.write(6 * 7)' | 快速验证一行表达式 |
标准输入(-) | printf '%s' 'nodeRepl.write(6*7)' \| ocu js - | 从管道注入代码 |
| 脚本文件 | ocu js --file ./automation.mjs | 正式的自动化脚本 |
常用参数:
--timeout <毫秒>:执行超时,默认 30000ms,上限 300000ms;--json:以 JSON 形式输出求值结果,方便被其他脚本消费。
最小示例:列出当前系统里的应用,但不把结果"发射"给模型输出,只写到本地:
var apps = await cua.listApps({ emit: false }); nodeRepl.write(apps)listApps()返回规范化的应用数组,每项包含{ id, displayName, lastUsedDate?, useCount?, isRunning? },是脚本里做应用筛选的第一站。
认识 cua 异步 API:桌面操作的"瑞士军刀" 🧰
cua API 是一组异步的、与应用绑定的方法。绑定一个应用后,后续操作都挂在这个应用对象上,天然避免了"点错窗口":
var app = await cua.getApp("TextEdit"); // 绑定应用,并自动输出初始无障碍状态 await app.click(12); // 点击元素索引 12 await app.typeText("Hello"); // 输入文本 await app.getAXState(); // 读取最新的界面状态cua.getApp(...)接受应用名或 Bundle ID,与原生运行时一致。应用对象上暴露的完整方法清单如下:
| 方法 | 说明 |
|---|---|
getAXState(options?) | 读取无障碍树(文本快照) |
getScreenshot(options?) | 截取应用画面 |
getAXStateAndScreenshot(options?) | 一次拿状态加截图 |
click(elementIndexOrPoint, options?) | 点击元素索引或坐标 |
drag([fromX, fromY], [toX, toY]) | 拖拽 |
pressKey(key) | 按键 |
scroll(elementIndex, direction, pages?) | 滚动 |
setValue(elementIndex, value) | 设置输入框值 |
typeText(text) | 逐字输入 |
performSecondaryAction(elementIndex, action) | 触发元素次级操作 |
全局层面还有两个发现类方法:await cua.getState()(返回{ apps })和await cua.listApps()。所有观察类方法默认会"发射"结果,如果代码只需要值、不想刷屏,就传{ emit: false }。额外输出用nodeRepl.write(value)写文本、await nodeRepl.emitImage(image)发图片(支持 data URL 或字节)。
完整示例:给 TextEdit 写一段自动化脚本
下面是一个可直接运行的脚本骨架,演示"绑定 → 操作 → 校验"的标准三步曲。把它保存为automation.mjs,用ocu js --file ./automation.mjs执行:
// 1. 绑定 TextEdit,初始状态会自动打印出来 var app = await cua.getApp("TextEdit"); // 2. 一批确定性的操作,顺序执行即可 await app.click(2); // 从刚打印的状态里找到目标元素的索引 await app.typeText("由脚本写入的自动化文本"); await app.pressKey("Return"); // 3. 同一个 js 调用里读回最终状态,一次往返完成校验 await app.getAXState();这个例子体现了代码优先模式最重要的两个习惯:
- 把确定性操作批量放在一次调用里,最后用一次
getAXState()读取结果,而不是每一步都单独往返; - 界面发生导航或布局变化后,重新从新状态里推导元素索引——旧索引在界面刷新后会失效。
如果你想看更贴近真实回归场景的批量调用编排,可以参考仓库里的示例序列文件 examples/textedit-overlay-seq.json,它演示了get_app_state、set_value、click交替执行的多步序列。
性能技巧:关闭"动作后自动回读" ⚡
原生动作工具默认在每次操作后等待约 150ms 并回传一张新快照。但在脚本批量操作时,这种"每步回读"是纯浪费。Open Computer Use 的 JS 适配器会以OPEN_COMPUTER_USE_ACTION_READ_BACK=0启动原生运行时:动作只返回简短状态,不做等待、不带快照,整批操作结束后由你显式调用一次getAXState()读取最终结果。
官方给出的实测数据:macOS 上连续 10 次点击,从原来的"数秒"降到约"一次状态读取"的时间。这也是为什么 API 指南反复强调"在同一个 js 调用里完成动作 + 回读"。
交互调试:用 ocu repl 边写边试
写脚本卡住了?ocu repl开启一个持久化的交互式 JavaScript 会话,顶层变量和cua应用绑定都会跨命令保留,非常适合逐行调试:
ocu repl会话内常用点命令:
.help—— 查看帮助;.editor/.end—— 进入多行编辑模式,写多行脚本片段;.reset—— 丢弃所有 JS 绑定并重建内核(注意:不会关闭已打开的应用);.exit(或 Ctrl-D)—— 退出并关闭内核。
绑定一旦建立就持久存在,直到.reset或退出;js_reset工具则用于 MCP 侧的会话重置。
安全须知:脚本能做什么,就要对什么负责 🔐
请务必了解这个边界:js是本地 Node.js 代码执行,不是受限表达式语言。它拥有启动进程的完整权限,可以访问本地文件系统、环境变量、模块和网络。官方文档给出的建议是:只在你信任代码执行策略的主机上启用 REPL 表面。
好消息是底层安全门依然有效——原生 Computer Use 调用保留着密码管理器黑名单和全局指针操作的显式授权门槛,这些与 JS 层无关、始终生效。如果你所在的宿主不接受任意 JavaScript 边界,可以改用ocu mcp保留的原生 9 工具兼容面(list_apps、get_app_state、click、scroll、drag、type_text、press_key、set_value、perform_secondary_action)。
写在最后:三种入口怎么选 🎯
| 入口 | 生命周期 | 适合谁 |
|---|---|---|
ocu js | 单次求值,执行完即退出 | 正式脚本、CI 自动化 |
ocu repl | 当前终端会话 | 探索 API、调试 |
ocu mcp | 当前 MCP 连接 | 接入 AI 客户端(Codex、Claude、Gemini CLI 等) |
macOS 上这些短命的 CLI 层会把自动化请求代理给隐藏的权限代理应用,它可能常驻以复用同一套权限身份——这是正常现象,与 JS Worker 和 MCP 子进程相互独立。
从npm i -g open-computer-use到ocu js --file ./automation.mjs,你现在已经掌握了完整的链路。建议的路径是:先在ocu repl里熟悉cua.getApp和状态回读,再把稳定下来的逻辑沉淀成.mjs脚本文件。更多细节(读回机制、进程生命周期、安全边界)都可以查阅 docs/references/js-repl.md 与 skills/open-computer-use/references/usage.md。
【免费下载链接】open-codex-computer-use👾 Open Computer Use – Open-Source Alternative to Codex Computer Use项目地址: https://gitcode.com/gh_mirrors/op/open-codex-computer-use
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考