阅读时间 6 分钟

Hermes Agent 浏览器工具的用户登录实现方案

Hermes Agent 的浏览器工具将身份验证统一纳入常规的页面交互流程,并配合不同后端的状态持久化能力来完成登录态的保持。本文基于 NousResearch/hermes-agent 源码的直接分析,梳理其在处理“需要登录才能访问的网站”时的五种具体操作方案。

注:以下分析基于仓库中的 tools/browser_tool.pytools/browser_camofox.pytools/browser_camofox_state.py 等核心文件。

一、交互式自动化登录(通用方案)

这是最基础的方案,适用于所有后端。Agent 通过标准的浏览器操作链模拟人类登录:

  1. browser_navigate(url) — 打开登录页
  2. browser_type(ref, text) — 在用户名/密码输入框中填写内容
  3. browser_click(ref)browser_press("Enter") — 点击登录按钮或提交表单
  4. browser_snapshot() — 确认登录是否成功(页面跳转、出现个人中心等)

tools/browser_tool.py 的实现中,browser_type 底层调用的是 fill 命令,会先清空输入框再键入文本,避免残留旧内容。这种方式零配置、通用性强,但面对 CAPTCHA、2FA、二维码或强反 bot 检测时容易失败。

对于需要反复访问的登录网站,Hermes 提供了跨任务保留登录态的能力,核心载体是 Camofox 后端

Camofox 的 Managed Persistence

当环境变量 CAMOFOX_URL 指向本地 Camofox 服务器,并在 config.yaml 中启用持久化:

browser:
  camofox:
    managed_persistence: true

tools/browser_camofox_state.py 会根据当前 Hermes profile 生成一个确定性的 userId,并映射到固定本地目录(~/.hermes/browser_auth/camofox/)。Camofox 服务器收到相同 userId 时会复用同一浏览器 profile,因此 cookies、localStorage、IndexedDB 等登录状态可以跨任务保留。

tools/browser_tool.py 的清理逻辑中,当 managed persistence 启用时,Agent 会执行 soft cleanup——仅释放本地内存跟踪,不销毁服务端的浏览器上下文,从而确保 session cookies 得以保留。

三、JavaScript 注入(程序化身份验证)

Hermes 的 browser_console 工具支持传入 expression 参数,在页面上下文中执行任意 JavaScript(相当于 DevTools Console)。这允许 Agent 直接:

  • 读取/设置 Cookie:document.cookie = "session_id=xxx"
  • 操作 localStorage:localStorage.setItem('token', 'xxx')
  • 注入 JWT 或 API Token

该能力在 tools/browser_tool.py_browser_eval 中实现,Camofox 后端也提供了对应的 /tabs/{tabId}/eval REST 端点。适用于开发者已拥有用户 session token、需要跳过登录表单的场景。

四、人机协作登录

当遇到强反 bot、CAPTCHA、二维码登录或 SSO 时,Hermes 提供了两种人机协作路径,但二者的交互形态差异很大。

4.1 Camofox + VNC:实时可操作浏览器窗口

这是代码中唯一为人类用户提供了可直接点击、输入、扫码的浏览器界面的方案。

tools/browser_camofox.py 中,初始化时会探测 Camofox 服务器的 /health 端点。如果服务器返回 vncPort,Hermes 会将其缓存为 _vnc_url,并在每次 camofox_navigate() 调用后把该地址写入返回结果:

{
  "vnc_url": "http://<host>:<vncPort>",
  "vnc_hint": "Browser is visible via VNC. Share this link with the user so they can watch the browser live."
}

人类用户看到的界面:在自己的浏览器中打开 vnc_url,通常是一个 noVNC Web 客户端,显示远程桌面级别的浏览器窗口。用户可以直接点击按钮、填写表单、扫描二维码、拖动滑块完成 CAPTCHA,也可以观看 Agent 的自动化操作并随时接管。

协作流程:Agent 检测到登录或验证受阻后,会将 vnc_url 发送给用户,随后停止发送浏览器操作指令,等待用户反馈“已完成登录/验证”,再继续后续自动化。如果同时启用了 managed_persistence,用户通过 VNC 登录一次后,后续任务可直接复用该登录态。

4.2 browser_vision:截图回传的静态辅助

这是所有后端都可使用的通用方案,但它是单向的。Agent 调用 browser_vision 后,会将当前页面截图保存到本地,并通过 MEDIA:<path> 以图片附件形式发到聊天对话中。

用户只能看、不能点。典型 workflow 是:

  1. Agent 操作到验证页,发现被拦截
  2. Agent 截图并回传,用户看到例如短信验证码输入框
  3. Agent 通过对话询问用户验证码
  4. 用户回复数字,Agent 继续用 browser_type 填入

该方案对需要人类直接操作网页元素的场景(如点击“我不是机器人”复选框、拖动拼图、扫码登录)基本无效。

五、连接已登录的现有浏览器(CDP Override)

Hermes 支持通过 BROWSER_CDP_URL 环境变量连接到一个现有的 Chrome DevTools Protocol (CDP) 端点。用户可以:

  1. 在本地启动一个普通 Chrome(带 --remote-debugging-port
  2. 手动登录目标网站
  3. 将 Chrome 的 CDP websocket 地址交给 Hermes
  4. Agent 直接在该已登录的浏览器实例中执行操作

tools/browser_tool.py 中,_get_cdp_override() 会读取该环境变量,_get_session_info() 则会创建对应的 CDP session,完全绕过本地启动和云 provider。

六、安全与防护

browser_navigate 的实现中,有一道针对凭据外泄的安全检查。Agent 会解码 URL 并扫描其中是否包含 API key 或 token 前缀,一旦发现即阻断导航:

url_decoded = urllib.parse.unquote(url)
if _PREFIX_RE.search(url) or _PREFIX_RE.search(url_decoded):
    return {
        "success": False,
        "error": "Blocked: URL contains what appears to be an API key or token."
    }

这防止了 prompt injection 攻击通过导航链接将用户的敏感凭证外泄。

总结

方案 实现方式 最佳适用场景
自动化表单登录 navigatetypeclick/press 普通用户名密码登录,无强反 bot
持久化 Profile/Cookie Camofox managed_persistence 需要长期、反复访问同一网站
JS 注入 Token/Cookie browser_console(expression=...) 已有 session token,需快速跳过登录
人机协作(VNC 实时) Camofox 后端 + vnc_url CAPTCHA、二维码、SSO 等复杂验证
人机协作(截图辅助) browser_vision + 对话回传 验证码回传等轻协作
连接已登录浏览器 BROWSER_CDP_URL 用户已有登录环境,Agent 仅做后续操作

整体而言,Hermes 的登录策略 = 交互式表单填写 + 后端状态保持 + 人机协作兜底。在默认的本地 agent-browser CLI 后端和云端 Browserbase / Browser Use 后端中,代码层面并未为人类预留可直接操作的浏览器界面;若需真正的实时人机协作,Camofox + VNC 是目前代码中最完整的实现路径。