# Dvina 的瀏覽器代理

> 網站擁有人如何識別、驗證、允許或封鎖 Dvina 為使用者執行任務時所用的瀏覽器。

當有人請 Dvina 執行需要用到真正瀏覽器的任務時，Dvina 的瀏覽器便會為該使用者瀏覽網站，每次只為一人服務。本頁供網站擁有人參考，說明瀏覽器的運作方式、如何識別其請求，以及如何允許或封鎖它。

## 這是甚麼

Dvina 是個人助理。當已登入 Dvina 的使用者要求執行需要用到網站的任務，例如比較優惠或填寫指定表格，Dvina 可以在該使用者的 Dvina 電腦上，透過自己的瀏覽器完成任務。這是設有視窗的桌面版 Chromium，而非無頭瀏覽器；使用者可以即時觀看，並隨時接手操作。

- **只為一人執行任務。** 每個瀏覽器都屬於一位已登入的 Dvina 使用者，並按照該使用者的要求工作。
- **不是網絡爬蟲。** 它沒有自行瀏覽的網站清單，只會逐步開啟任務所需的頁面：載入頁面、閱讀內容，再進行操作，就像人一樣。
- **絕不用於訓練模型。** Dvina 的瀏覽器在你的網站上讀取的內容，只會用於處理其服務對象的請求，絕不會用來訓練 AI 模型。
- **由使用者自行作出決定。** 它不會輸入密碼或付款卡資料。當頁面需要使用者登入或付款時，Dvina 會停下來，請使用者接手。涉及個人資料、傳送、付款及刪除的操作，都會先等待使用者同意。
- **不會代為通過真人驗證。** 遇到用來確認是否由真人瀏覽的驗證，例如 Cloudflare 的驗證、Turnstile、reCAPTCHA 或 hCaptcha，它不會點擊、解答或重新載入。如果驗證會自行完成，Dvina 便會等待。如果驗證一直未能完成，任務便會暫停，由使用者接手瀏覽器、通過驗證，再交回 Dvina。

## 識別其請求

Dvina 的瀏覽器會透過 [Web Bot Auth](https://datatracker.ietf.org/wg/webbotauth/about/)，使用 Ed25519 金鑰為每個送出的 http 和 https 請求加上 HTTP 訊息簽章（[RFC 9421](https://www.rfc-editor.org/rfc/rfc9421)）。每個請求都帶有三個標頭：

```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]
> 使用桌面應用程式時，使用者也可以讓 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 機械人政策：** 在 **Security Settings** 中，選擇 **Configure AI bot policies**。在 **Agent** 下，選擇 **Allow (do not block)**、**Block on pages with ads** 或 **Block (on all pages)**。
- **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)
