---
name: cloudflare-browser-collaboration
description: 通过 browser.easyws.click 的协同码建立浏览器长期协同关系，复用已确认的授权执行网页读取、点击、输入、截图、任意页面脚本及 Playwright 任务。用于这个独立扩展，不适用于原 Browser One 或 VinkClaw 平台接口。
---

# 浏览器协同

配套服务是 `https://browser.easyws.click`。协同码只用于建立关系；浏览器持有者确认后，授权由扩展长期保存，直到其在扩展中结束协同。Relay 不保存授权名单。任务结束、任务连接断开及浏览器重启不会解除这段关系。每次任务由调用程序自动创建和结束，不逐页面申请授权，也没有网站白名单。

`<技能目录>` 指本文件所在目录。首次使用在该目录运行 `npm ci`；调用方需要 Node.js 22.18 以上，不需要另外启动本地浏览器。

先只读检查现有授权，不要每次重新领取协同码：

```sh
node '<技能目录>/scripts/browser-collaboration.mjs' auth status
```

返回 `USE_EXISTING_AUTH` 时直接操作。只有没有有效关系且用户提供了协同码时才接入：

```sh
node '<技能目录>/scripts/browser-collaboration.mjs' setup --code '<协同码>' --name '协作方名字' --purpose '本次协同用途'
```

等待用户在扩展中允许连接。持有协同码不等于已有控制权，不要代替用户点击允许。CLI 把长期凭据保存在用户私有目录，输出只包含状态。不要读取、展示或复制状态文件里的凭据，也不要把它放进共享项目或代码仓库。Cookie、密码和长期 Token 只由程序内部使用，不打印到模型或普通日志；需要这类响应时写入私有文件，由后续脚本内部使用。

常用动作：

```sh
node '<技能目录>/scripts/browser-collaboration.mjs' tabs
node '<技能目录>/scripts/browser-collaboration.mjs' open 'https://example.com'
node '<技能目录>/scripts/browser-collaboration.mjs' info --target '<targetId>'
node '<技能目录>/scripts/browser-collaboration.mjs' extract --target '<targetId>' --out page.json
node '<技能目录>/scripts/browser-collaboration.mjs' js --target '<targetId>' --expression 'document.title'
node '<技能目录>/scripts/browser-collaboration.mjs' screenshot --target '<targetId>' --out page.png
```

这些命令自动开始一个短任务，完成后释放执行权并保留页面。正文和截图优先写文件，避免把大段 HTML、图片 base64 或大响应放进模型上下文。默认在后台打开页面；标签组可选，不自动切换用户前台。

任务可以操作现有页面，也可以打开新页面。不同任务可并行；同一页面被其他任务占用时会返回 `TARGET_BUSY`。选择其他页面或结束明确属于当前任务的操作，不替用户停止其他协作方的任务。

多步骤操作优先使用一次 Playwright 任务：

```sh
node '<技能目录>/scripts/browser-collaboration.mjs' run --task '检查商品信息' --file task.mjs
```

`task.mjs` 导出 `default async ({ browser, context, signal }) => { ... }`。CLI 负责创建任务、连接 CDP、续租与结束，不把授权凭据传给任务脚本。任意 `Runtime.evaluate` 脚本可用，不限定点击或页面域名。停止后不会重放旧命令。

- 写 Playwright 脚本或查看兼容范围时，读 [references/playwright.md](references/playwright.md)。
- 使用原始 CDP、对接其他语言或排查授权错误时，读 [references/api.md](references/api.md)。

浏览器离线时保留已有授权，等待重连，不自动索要新的协同码。长期关系只能由浏览器持有者在扩展中结束；任务的 `finish` 只结束当次任务。
