内容
# 我不是机器人
*您的AI代理 **是** 机器人。当它点击“我不是机器人”复选框却无法选中时,`i-am-not-a-robot` 会将复选框发送到您的手机 — 您用拇指点击它,代理继续运行。*
将AI浏览器代理的验证码传递给手机上的真实人类。他们用手指解决验证码,代理继续运行。
当您在公交车上时,您的代理正在运行浏览器自动化。它遇到一个reCAPTCHA。今天,这会导致代理停止,直到您回到计算机上,或者您连接一个大批量验证码解决服务,专门用于爬取。`i-am-not-a-robot` 不会这样做。它将实时浏览器页面流式传输到您的手机,将您的点击转发回同一个浏览器会话,并在挑战清除后继续。
**这是有人参与的继电器,而不是解决者。** 它不发送自动解决代码,从不尝试击败验证码。真实的人解决了它。这也是为什么它不会随着谷歌发布新的挑战而失效:没有视觉模型需要保持更新。
它也是 **手机原生** 的。其他有人参与的工具为您提供一个实时查看网址,以驱动整个浏览器在桌面上。`i-am-not-a-robot` 只将验证码发送到您的手机,您用拇指解决,从任何地方。代理的浏览器停留在其自己的机器和IP上,因此它获得的令牌原生有效。
## 工作原理
```
您的代理(浏览器通过CDP)遇到验证码
└─ 调用MCP工具:start_human_relay({ cdpUrl })
├─ 通过CDP(原始协议,无Playwright依赖)连接到浏览器
├─ 仅捕获验证码小部件,并通过WebSocket流式传输到手机页面
├─ 为该页面打开一个快速公共网址(cloudflared,见下文)
└─ 返回relayUrl
└─ 代理在聊天中发布链接:“解决此验证码:<relayUrl>”
└─ 您在手机上打开它,看到实时挑战,点击瓷砖
└─ 每次点击 → Input.dispatchMouseEvent → 真实浏览器
└─ 代理调用await_human_solve(),它会轮询直到令牌出现
└─ 通过:true → 代理继续
```
继电器使用原始CDP协议,这是Playwright、Puppeteer和browser-use都依赖的协议。因此,`i-am-not-a-robot` 只需要您的代理的一个CDP端点。它不关心哪个框架绘制了浏览器。
## 安装
作为MCP服务器,这是使用它的主要方式。对于Claude Code:
```bash
claude mcp add i-am-not-a-robot -- npx -y i-am-not-a-robot
```
对于任何其他MCP客户端,请指向同一命令:
```json
{ "mcpServers": { "i-am-not-a-robot": { "command": "npx", "args": ["-y", "i-am-not-a-robot"] } } }
```
节点>= 18。运行时依赖:`ws` 和 `@modelcontextprotocol/sdk`。
## 两个工具
**`start_human_relay({ cdpUrl, targetUrl? }) -> { relayUrl, relayUrls, pageUrl }`**
连接到代理的浏览器,启动屏幕截图,打开公共网址并返回。代理在聊天中向您发布`relayUrl`。`targetUrl` 是可选的子字符串,用于选择包含验证码的页面。
**`await_human_solve({ timeoutMs? }) -> { passed }`**
轮询直到页面中出现验证码令牌(挑战被接受),或直到超时。代理在您打开链接后调用它。
您的代理根据其工具描述决定何时调用这些工具。诸如“如果您遇到无法解决的验证码,请使用`i-am-not-a-robot`询问我”的提示就足够了。
## 自带浏览器
`i-am-not-a-robot` 通过CDP附加,因此您的浏览器在您想要的任何地方运行:笔记本电脑,VPS,容器。公开CDP端点并传递其网址。
```js
// Playwright:启动带有CDP端口的Chromium,然后将网址交给`i-am-not-a-robot`
const browser = await chromium.launch({ args: ['--remote-debugging-port=9222'] });
// cdpUrl = "http://localhost:9222"
```
Puppeteer和browser-use公开了同类型的端点。任何支持CDP的工具都可以使用。仅限截图的计算机使用代理,没有CDP附加点,不在此范围内。
## 跨网络,零设置
这个工具的重点是您不在计算机旁的时候,因此手机和代理通常在不同的网络上。`i-am-not-a-robot` 自己处理。在`start_human_relay`上,它打开一个公共HTTPS网址。默认情况下,它使用 [cloudflared](https://github.com/cloudflare/cloudflared) 快速隧道(自动下载一次,然后缓存):附近的Cloudflare边缘保持往返时间低(测试中约50毫秒,与单个服务器ssh隧道约180毫秒),并且它干净地流式传输WebSocket。如果cloudflared不可用,它会回退到零二进制`ssh`隧道(localhost.run,然后pinggy)。当中继停止时,隧道关闭。
如果您的机器和手机在同一个网络上(同一个wifi,或同一个Tailscale tailnet),`relayUrls`也列出LAN和tailnet网址,它们是直接且最快的。高级用户可以传递他们自己的 `{ host }` 以完全跳过隧道。
公共隧道默认值依赖于免费的第三方主机以方便使用。该项目不托管任何内容,您可以随时将其指向您自己的主机。
## 支持的挑战
`i-am-not-a-robot` 将流截图到验证码小部件(复选框及其图像挑战),因此您只看到您操作的內容,而不是代理正在填充的整个页面。检测涵盖reCAPTCHA v2/v3/Enterprise,hCaptcha和Cloudflare Turnstile;未识别的小部件会回退到流式传输整个页面。自动通过检测(响应令牌)已针对这些相同的部件连接。
## 安全性和预期用途
- 中继网址在其路径中带有96位随机令牌。没有该令牌的请求会得到404。
- 默认情况下,这是您自己的机器上的浏览器。在中继打开时,其流量通过隧道主机路由;除此之外,您的机器上没有任何内容离开。
- 请将其用于您有权运行的自动化任务,在您自己的帐户和任务上。它将人类纳入循环中,按设计为单用户运行。它不适用于批量使用或代表他人大规模解决验证码。
## 还包括:用于非验证码步骤的手机推送门
该软件包还附带 `humanGate(page, { ... })`,一个用于简单情况的零依赖帮助程序,其中答案是文本或是/否:OTP代码,2FA提示,“批准此购买”。它截图页面,通过 [ntfy](https://ntfy.sh) 将链接推送到您的手机,并在您回复后继续。参见 `examples/otp-demo.js`。
## 状态
- MCP服务器(`start_human_relay` + `await_human_solve`):工作,在真实手机上端到端验证(真实reCAPTCHA图像挑战,真实令牌)。
- WebSocket传输,仅限验证码截图,cloudflared快速隧道和ssh回退:工作。
- `humanGate()` 手机推送库,用于文本/批准(OTP,2FA,确认):工作。
## 许可证
MIT © Nicole Leung
如果`i-am-not-a-robot`为您节省了返回键盘的路程,请给其他人一个星星帮助他们找到它。