# 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`。
- 每個簽章的有效期限為 60 秒，從 `created` 到 `expires`。
- `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)
