# Dvina 的浏览器代理

> 网站所有者如何识别、验证、允许或屏蔽 Dvina 为用户执行任务时使用的浏览器。

当用户请求 Dvina 执行需要使用真实浏览器的任务时，Dvina 的浏览器会为该用户访问网站，一次只服务一人。本页面向网站所有者，介绍这个浏览器的工作方式、如何识别它的请求，以及如何允许或屏蔽它。

## 它是什么

Dvina 是一款个人助手。当已登录 Dvina 的用户请求执行需要使用网站的任务，例如比较优惠方案或按其要求填写表单时，Dvina 可以在该用户的 Dvina 电脑上，使用自己的浏览器完成任务。这是一个带有窗口的桌面版 Chromium，而不是无头浏览器。用户可以实时查看操作，并随时接管。

- **它只为一位用户执行任务。** 每个浏览器都属于一位已登录的 Dvina 用户，并按该用户的请求执行任务。
- **它不是爬虫。** 它没有会自行访问的网站列表，而是根据任务需要逐步打开页面：加载页面、阅读内容，然后进行操作，就像人一样。
- **内容绝不用于训练模型。** Dvina 的浏览器在你的网站上读取的内容，仅用于处理它所服务用户的请求，绝不用于训练 AI 模型。
- **需要用户自己做的决定，仍由用户做出。** 它不会输入密码或银行卡信息。当页面需要用户登录或付款时，Dvina 会停止操作，请用户接管。涉及个人信息、发送、付款和删除的操作，都要等待用户同意。
- **它不会完成真人验证。** 遇到用于确认浏览者是真人的验证，例如 Cloudflare 的验证、Turnstile、reCAPTCHA 或 hCaptcha 时，它不会点击、破解或重新加载验证。如果验证会自动通过，Dvina 就会等待。如果验证持续存在，任务就会停止，由用户接管浏览器，完成验证后再交回给 Dvina。

## 识别它的请求

Dvina 的浏览器会使用 Ed25519 密钥，通过 [Web Bot Auth](https://datatracker.ietf.org/wg/webbotauth/about/) 的 HTTP 消息签名（[RFC 9421](https://www.rfc-editor.org/rfc/rfc9421)），为它发出的每个 http 和 https 请求签名。每个请求都包含三个标头：

```http
Signature-Agent: "https://api.dvina.ai"
Signature-Input: sig1=("@authority" "signature-agent");created=<unix time>;expires=<created + 60>;keyid="<key id>";alg="ed25519";nonce="<random>";tag="web-bot-auth"
Signature: sig1=:<Ed25519 signature>:
```

- `Signature-Agent` 标识 Dvina，即发布其密钥的源站。
- `Signature-Input` 涵盖请求的 `@authority`（你的主机）和 `Signature-Agent` 标头。`tag` 的值为 `web-bot-auth`。
- 每个签名从 `created` 到 `expires` 的有效期为 60 秒。
- `keyid` 是密钥的 JWK 指纹（[RFC 7638](https://www.rfc-editor.org/rfc/rfc7638)）。

该浏览器发送 Chromium 自身的用户代理字符串，与 Linux 上的其他 Chromium 浏览器相同，例如：

```text
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36
```

它的 Chrome 版本会随 Chromium 的更新而变化，用户代理字符串中不包含任何 Dvina 信息。请通过签名识别 Dvina，而不是通过用户代理字符串。

> [!NOTE]
> 使用桌面 App 时，用户也可以让 Dvina 使用自己电脑上的浏览器。该浏览器不会为请求签名，看起来与用户自己浏览网页没有区别。

## 验证签名

Dvina 在其密钥目录中发布公钥：

```text
https://api.dvina.ai/.well-known/http-message-signatures-directory
```

该目录的响应包含 `Content-Type: application/http-message-signatures-directory+json`，以及包含 Dvina 的 Ed25519 公钥的 JSON Web Key Set。响应使用同一密钥签名，并带有 `tag="http-message-signatures-directory"`。

如果你的网站使用 Cloudflare，Cloudflare 会为你验证已签名的代理。要自行验证请求，请按以下步骤操作：

1. Check that `Signature-Agent` is `"https://api.dvina.ai"` and that `Signature-Input` has `tag="web-bot-auth"`.
2. Check that the time now is between `created` and `expires`.
3. Get the key directory and pick the key whose JWK thumbprint matches `keyid`.
4. Build the signature base from `@authority`, `signature-agent` and the signature parameters, as RFC 9421 describes, and verify the `Signature` with that Ed25519 key.

任何人都可以发送这些标头。只有使用 Dvina 密钥目录中的密钥验证签名通过后，才能将请求视为来自 Dvina。

## 允许或屏蔽它

Dvina 的浏览器会实时为单个用户执行操作，这类流量属于 Cloudflare 的 **Agent** 预设所涵盖的范围。如果你的网站使用 Cloudflare：

- **AI 机器人策略：** 在 **安全设置** 中，选择 **配置 AI 机器人策略**。对于 **Agent**，选择 **允许（不阻止）**、**在含广告的页面上阻止** 或 **阻止（所有页面）**。
- **WAF 自定义规则：** 来自已验证机器人和已签名代理的请求，其 `cf.client.bot`（使用 Bot Management 时为 `cf.bot_management.verified_bot`）会设为 true。在自定义规则中使用该字段，即可跳过、质询或阻止这些请求。
- **已验证机器人目录：** 在 [Cloudflare Radar](https://radar.cloudflare.com/verified-bots) 中查看 Cloudflare 已验证的代理。

Anywhere else, verify the signature as described above, then allow or block requests whose verified `Signature-Agent` is `"https://api.dvina.ai"`.

## 联系我们

对 Dvina 的浏览器在你网站上的活动有疑问，或遇到了行为与本页描述不符的请求？请发送邮件至 [support@dvina.ai](mailto:support@dvina.ai)，提供你的网站地址，以及请求的时间和 `keyid`（如果有）。

## 相关内容

- [计算机操作](/docs/use-dvina/features/computer-use)
- [隐私与数据](/docs/help/privacy-and-data)
