BrowserTool 是一款基於 Go 語言構建的高效能、雲原生無頭瀏覽器沙箱服務。它允許您通過標準的 Chrome DevTools Protocol (CDP) over WebSocket,遠端控制一個運行在雲端隔離容器中的無頭瀏覽器執行個體,並原生相容 Puppeteer、Playwright 等主流自動化架構。
主要用途:
-
AI Agent 整合:作為大模型的“眼睛”和“手”,賦予其執行網頁瀏覽、資訊提取、線上操作等複雜任務的能力。
-
自動化測試:在雲端按需運行端到端(E2E)測試和視覺迴歸測試,無需維護本地測試環境。
-
資料擷取:穩定、高效地進行網頁抓取,輕鬆應對動態載入和反爬蟲挑戰。
-
內容產生:將動態網頁或資料看板自動化產生為 PDF 或截圖,用於製作報告和歸檔。
核心價值:
-
免營運:您無需在自己的伺服器或本地機器上安裝、配置和維護 Chrome 瀏覽器及其複雜的依賴。
-
Serverless 架構:服務按實際使用量計費,具備優秀的Auto Scaling能力,有效控製成本。
-
原生相容:通常無需修改您現有的 Puppeteer/Playwright 指令碼即可平滑遷移。
快速入門
本指南將引導您完成從建立服務到成功運行第一個自動化指令碼的全過程。
第一步:建立BrowserTool服務
-
登入 AgentRun 控制台。
-
首次使用時,系統會提示您為阿里雲帳號授予 AgentRun 的服務關聯角色(
AliyunServiceRoleForAgentRun)。請根據頁面指導完成授權,這是服務正常運行所必需。 -
在運行時與沙箱頁簽下選擇Sandbox沙箱,建立沙箱模板選擇瀏覽器,立即创建BrowserTool服務。
您也可以通過 OpenAPI 或 SDK 進行建立:
-
OpenAPI 文檔:CreateBrowser API
-
多語言 SDK:AgentRun SDK 中心
第二步:擷取串連端點 (Endpoint)
-
服務建立成功後,在控制台服務列表中找到您的 BrowserTool 服務,單擊進入详情頁。
-
在詳情頁的VNC調試標籤頁下建立沙箱。
-
建立成功後,您將獲得一個用於自動化串連的 WebSocket 端點 (CDP Endpoint),您可以直接從控制台複製使用。其格式樣本如下:
wss://1234567890.agentrun-data.ap-southeast-1.aliyuncs.com/sandboxes/br-abcdef123456/ws/automation?tenantId=1234567890
第三步:串連並執行自動化指令碼
將上一步擷取的完整串連端點 URL 傳入您熟悉的自動化架構指令碼中,即可串連到 BrowserTool 並執行任務。
Puppeteer 串連樣本
const puppeteer = require('puppeteer-core');
// 從BrowserTool服務詳情頁擷取此端點
const BROWSERTOOL_CDP_ENDPOINT = 'wss://{accountID}.agentrun-data.ap-southeast-1.aliyuncs.com/sandboxes/{sandboxID}/ws/automation?tenantId={accountID}';
async function main() {
const browser = await puppeteer.connect({
browserWSEndpoint: BROWSERTOOL_CDP_ENDPOINT,
});
const page = await browser.newPage();
await page.goto('https://example.com');
await page.screenshot({ path: 'example.png' });
console.log('Screenshot taken!');
await browser.close();
}
main();
Playwright 串連樣本
const { chromium } = require('playwright-core');
// 從BrowserTool 服務詳情頁擷取此端點
const BROWSERTOOL_CDP_ENDPOINT = 'wss://{accountID}.agentrun-data.ap-southeast-1.aliyuncs.com/sandboxes/{sandboxId}/ws/automation?tenantId={accountID}';
async function main() {
const browser = await chromium.connectOverCDP({
endpointURL: BROWSERTOOL_CDP_ENDPOINT,
});
const page = await browser.newPage();
await page.goto('https://example.com');
await page.screenshot({ path: 'example.png' });
console.log('Screenshot taken!');
await browser.close();
}
main();
功能指南
WebSocket自動化端點
BrowserTool 提供了兩個主要的 WebSocket 端點,用於不同的自動化情境。
-
CDP 自動化端點 (/ws/automation)
用於瀏覽器自動化,與Puppeteer和Playwright相容。端點格式如下:
wss://{accountID}.agentrun-data.ap-southeast-1.aliyuncs.com/sandboxes/{sandboxId}/ws/automation?tenantId={accountID}可使用
wscat工具直接與 CDP 端點互動,發送原始 CDP 命令進行調試。# 安裝wscat npm install -g wscat # 串連到CDP代理 wscat -c "wss://{accountID}.agentrun-data.ap-southeast-1.aliyuncs.com/sandboxes/{sandboxID}/ws/automation/?tenantId={accountID}" # 發送CDP命令 {"id":1,"method":"Runtime.evaluate","params":{"expression":"navigator.userAgent"}} -
VNC即時資料流端點(/ws/livestream)
用於即時查看瀏覽器案頭環境的WebSocket端點,支援通過NoVNC用戶端查看,詳細參考即時查看瀏覽器介面(VNC調試)。端點格式如下:
wss://{accountID}.agentrun-data.ap-southeast-1.aliyuncs.com/sandboxes/{sandboxID}/ws/livestream?tenantId={accountID}
即時查看瀏覽器介面(VNC調試)
BrowserTool 支援通過 VNC 即時查看遠程瀏覽器的案頭環境,方便在開發和調試階段監控自動化任務的執行情況。
推薦方案:使用線上 noVNC 用戶端
-
訪問 noVNC 官方提供的線上用戶端:https://novnc.com/noVNC/vnc.html
-
在串連設定中,中填入以下串連資訊
-
主機:
{accountID}.agentrun-data.ap-southeast-1.aliyuncs.com -
連接埠:
443 -
路徑:
sandboxes/{sandboxID}/ws/livestream?tenantId={accountID}
-
-
點擊串連,即可看到瀏覽器介面。
如果想要自訂前端整合,允許完全控制 VNC 視圖的展現形式和互動邏輯。需要引入 noVNC 的核心 JS 庫,並在前端代碼中進行初始化。樣本地址:https://github.com/novnc/noVNC/blob/master/vnc_lite.html
備選方案:使用Docker鏡像
如果您需要在本地或離線環境中使用,可以運行我們預置的 noVNC Docker 鏡像。
-
在本地終端運行 Docker 命令啟動 noVNC 用戶端容器:
docker run -p 8184:80 -d --rm registry.cn-shanghai.aliyuncs.com/fc-demo2/custom-container-repository:browsertool-sandbox-vnc-client_v0.3.1 -
開啟瀏覽器訪問
http://localhost:8184。 -
在串連設定中,中填入以下串連資訊:
-
主機:
{accountID}.agentrun-data.ap-southeast-1.aliyuncs.com -
連接埠:
80 -
路徑:
sandboxes/{sandboxID}/ws/livestream?tenantId={accountID}
點擊串連,即可看到瀏覽器介面。
-
串連成功後,初始介面可能為黑屏或灰屏。這是正常現象,因為瀏覽器正在等待指令。當您的自動化指令碼執行 page.goto() 等操作後,介面才會顯示相應內容。
框架組成樣本
BrowserTool 可以與多種程式設計語言的 AI Agent 架構或自動化庫輕鬆整合。
-
BrowserUse 操作樣本:
from browser_use import Agent, BrowserSession from browser_use.llm import ChatDeepSeek from browser_use.browser import BrowserProfile from dotenv import load_dotenv import os import asyncio load_dotenv() async def main(): # 填入CDP URL browser_session_wss_url = "wss://{accountID}.agentrun-data.ap-southeast-1.aliyuncs.com/sandboxes/{sandboxID}/ws/automation?tenantId={accountID}" browser_session = BrowserSession( cdp_url=browser_session_wss_url, browser_profile=BrowserProfile( headless=False, user_agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.X.X Safari/537.36", timeout=3000000, keep_alive=True, ) ) # 需要填入DeepSeek的api_key,如果使用其他模型,請自行修改 llm = ChatDeepSeek(api_key="sk-your-deepseek-sk") agent = Agent( task="請訪問 https://www.aliyun.com/product/list 並分析一下阿里雲目前都提供了哪些產品", llm=llm, browser_session=browser_session, use_vision=True ) result = await agent.run() print(result) if __name__ == "__main__": asyncio.run(main()) -
Puppeteer 串連樣本
const puppeteer = require('puppeteer-core'); const browser = await puppeteer.connect({ browserWSEndpoint: 'wss://{accountID}.agentrun-data.ap-southeast-1.aliyuncs.com/sandboxes/{sandboxID}/ws/automation?tenantId={accountID}' }); const page = await browser.newPage(); await page.goto('https://example.com'); await page.screenshot({ path: 'screenshot.png' }); await browser.close();
動作記錄
1、列出所有錄製檔案
擷取系統中所有 VNC 錄製檔案的列表,支援分頁查詢。
基本資料
-
端點:
GET /recordings/ -
功能: 返回 VNC 錄製檔案清單
-
標籤: 錄製管理
請求參數
|
參數名 |
位置 |
類型 |
必填 |
預設值 |
說明 |
|
|
query |
integer |
否 |
1 |
頁碼(從 1 開始) |
|
|
query |
integer |
否 |
20 |
每頁數量(最大 100,最小 1) |
功能特性
-
支援分頁查詢
-
自動識別錄製狀態(正在錄製/已完成)
-
按建立時間降序排列(最新的在前)
-
返迴文件詳細資料(檔案名稱、大小、建立時間等)
響應格式
成功響應(200 OK)
{
"recordings": [
{
"filename": "vnc_global_20251116_103022_seg000.mkv",
"sessionId": "vnc_global_20251116_103022",
"segment": 0,
"size": 15728640,
"createdAt": "2025-11-16T10:30:22+08:00",
"format": "mkv",
"downloadUrl": "/recordings/vnc_global_20251116_103022_seg000.mkv",
"recordingType": "vnc",
"status": "completed"
}
],
"total": 1,
"page": 1,
"pageSize": 20
}
響應欄位說明
|
欄位名 |
類型 |
說明 |
|
|
array |
錄製檔案清單(按建立時間降序排列) |
|
|
string |
檔案名稱 |
|
|
string |
會話 ID |
|
|
integer |
段索引(從 0 開始,分段錄製時使用) |
|
|
integer |
檔案大小(位元組) |
|
|
string |
檔案建立時間(ISO 8601 格式) |
|
|
string |
檔案格式(固定為 |
|
|
string |
下載 URL(MKV 支援流式寫入,所有檔案都可以下載) |
|
|
string |
錄製類型(固定為 |
|
|
string |
錄製狀態(MKV 支援流式寫入,所有檔案狀態為 |
|
|
integer |
錄製檔案總數(不考慮分頁) |
|
|
integer |
當前頁碼(僅在分頁查詢時返回) |
|
|
integer |
每頁數量(僅在分頁查詢時返回) |
錯誤響應
-
400 Bad Request: 無效請求(參數錯誤)
-
500 Internal Server Error: 內部伺服器錯誤
請求樣本
# 擷取第一頁,每頁 20 條記錄(預設)
curl -X GET "http://localhost:3000/recordings/"
# 擷取第二頁,每頁 10 條記錄
curl -X GET "http://localhost:3000/recordings/?page=2&page_size=10"
# 擷取所有錄製檔案(設定較大的 page_size)
curl -X GET "http://localhost:3000/recordings/?page_size=100"
2、下載錄製檔案
下載指定的 VNC 錄製檔案。
基本資料
-
端點:
GET /recordings/{filename} -
功能: 下載指定的錄製檔案
-
標籤: 錄製管理
請求參數
|
參數名 |
位置 |
類型 |
必填 |
說明 |
|
|
path |
string |
是 |
錄製檔案名稱(必須是 .mkv 檔案) |
功能特性
-
MKV 格式支援流式寫入
-
檔案可以在錄製過程中下載和播放
-
只允許下載
.mkv檔案 -
自動化佈建正確的 Content-Type (
video/x-matroska)
響應格式
成功響應 (200 OK)
-
Content-Type:
video/x-matroska -
Body: 二進位視頻資料
錯誤響應
-
400 Bad Request: 無效請求
{ "error": "Invalid filename" }-
檔案名稱無效
-
不是MKV檔案
-
-
404 Not Found: 檔案未找到
-
500 Internal Server Error: 內部伺服器錯誤
請求樣本
# 下載錄製檔案
curl -X GET "http://localhost:3000/recordings/vnc_global_20251116_103022_seg000.mkv" \
-o vnc_global_20251116_103022_seg000.mkv
# 在瀏覽器中直接存取
http://localhost:3000/recordings/vnc_global_20251116_103022_seg000.mkv
注意事項
-
檔案格式限制: 只允許下載
.mkv檔案 -
流式支援: MKV 格式支援流式寫入,可以在錄製過程中下載
-
播放器相容: MKV 檔案可以使用 VLC、Chrome、Firefox 等主流播放器播放
3、刪除錄製檔案
刪除指定的 VNC 錄製檔案。
基本資料
-
端點:
DELETE /recordings/{filename} -
功能: 刪除指定的錄製檔案
-
標籤: 錄製管理
請求參數
|
參數名 |
位置 |
類型 |
必填 |
說明 |
|
|
path |
string |
是 |
錄製檔案名稱(必須是 .mkv 檔案) |
功能特性
-
支援刪除
.mkv檔案 -
MKV 支援流式寫入,檔案可以在錄製過程中刪除
-
在 VNC 目錄中尋找檔案
-
刪除正在錄製的檔案時需謹慎,確保錄製已停止
響應格式
成功響應 (200 OK)
{
"message": "Recording file deleted successfully",
"filename": "vnc_global_20251116_103022_seg000.mkv"
}
響應欄位說明
|
欄位名 |
類型 |
說明 |
|
|
string |
操作結果訊息 |
|
|
string |
被刪除的檔案名稱 |
錯誤響應
-
400 Bad Request: 無效請求
-
檔案名稱無效
-
不是支援的檔案類型
-
-
404 Not Found: 檔案未找到
-
500 Internal Server Error: 內部伺服器錯誤
請求樣本
# 刪除指定的錄製檔案
curl -X DELETE "http://localhost:3000/recordings/vnc_global_20251116_103022_seg000.mkv"
# 使用 jq 格式化輸出
curl -X DELETE "http://localhost:3000/recordings/vnc_global_20251116_103022_seg000.mkv" | jq
注意事項
-
不可恢複: 刪除操作不可恢複,請謹慎操作
-
錄製中的檔案: 刪除正在錄製的檔案時需確保錄製已停止
-
檔案格式限制: 只支援刪除
.mkv檔案
資料模型
RecordingInfo
錄製檔案資訊對象
interface RecordingInfo {
filename: string; // 檔案名稱
sessionId: string; // 會話 ID
segment: number; // 段索引(從 0 開始,分段錄製時使用)
size: number; // 檔案大小(位元組)
createdAt: string; // 檔案建立時間(ISO 8601 格式)
format: "mkv"; // 檔案格式(固定為 mkv)
downloadUrl: string; // 下載 URL
recordingType: "vnc"; // 錄製類型(固定為 vnc)
status: "completed"; // 錄製狀態(固定為 completed)
}
RecordingListResponse
錄製檔案清單響應對象
interface RecordingListResponse {
recordings: RecordingInfo[]; // 錄製檔案清單(按建立時間降序排列)
total: number; // 錄製檔案總數(不考慮分頁)
page?: number; // 當前頁碼(僅在分頁查詢時返回)
pageSize?: number; // 每頁數量(僅在分頁查詢時返回)
}
RecordingDeleteResponse
錄製檔案刪除響應對象
interface RecordingDeleteResponse {
message: string; // 操作結果訊息
filename: string; // 被刪除的檔案名稱
}
服務說明
使用限制
-
會話生命週期:單個沙箱會話的預設最長生命週期為 6 小時。到期後會自動銷毀。
-
淺休眠(原閑置)逾時:您可以在建立服務時通過
sandboxIdleTimeoutSeconds參數設定會話的淺休眠(原閑置)逾時時間長度。若會話在此期間無任何操作,將被提前終止以節約成本。 -
瀏覽器支援:目前服務內建並支援 Chromium/Chrome 瀏覽器。未來計劃支援 Firefox 及 Edge。
安全記事
-
環境隔離:每個瀏覽器沙箱執行個體都運行在獨立的容器環境中,確保了任務之間、使用者之間的檔案系統和進程空間完全隔離,保障任務安全性。
-
許可權管理:遵循最小許可權原則,通過服務關聯角色 (
AliyunServiceRoleForAgentRun) 確保服務僅能訪問必要的雲資源 -
傳輸加密:所有資料面訪問端點(CDP 和 VNC)均使用 WSS (WebSocket Secure) 協議,確保您的指令和瀏覽器返回的資料在傳輸過程中全程加密。
錯誤處理
通用錯誤響應格式
{
"code": 1001,
"error": "invalid request"
}
常見錯誤碼
|
HTTP 狀態代碼 |
錯誤情境 |
處理建議 |
|
400 |
參數錯誤、檔案格式不支援 |
檢查請求參數和檔案名稱 |
|
404 |
檔案未找到 |
確認檔案是否存在 |
|
500 |
伺服器內部錯誤 |
檢查伺服器日誌,聯絡支援人員 |
計費說明
BrowserTool 採用 Serverless 計費模式,按需使用,隨用隨付。主要根據沙箱執行個體的運行時間長度進行計費,沒有執行個體運行時不產生費用。
詳細的計費規則和價格,請參考Function Compute計費概述。
技術架構
BrowserTool 採用分層架構,確保了系統的高效能、高穩定性和易於擴充。
整體架構圖
核心組件
-
協議代理層 (Go)
-
CDP WebSocket 代理:作為用戶端與瀏覽器沙箱之間的橋樑,它負責安全地轉寄來自 Puppeteer/Playwright 的 CDP 命令,並處理鑒權和會話管理。核心服務基於 Go 語言和 goroutine 構建,相比傳統的 Node.js 實現,最佳化了記憶體佔用和並發串連處理能力。
-
VNC WebSocket 代理:將
TigerVNC產生的原生 VNC 流即時轉碼為 WebSocket 流,從而允許 noVNC 等標準 Web用戶端直接在網頁上渲染遠端桌面,提供即時視圖。
-
-
瀏覽器運行時
-
容器化方案:利用 Docker 多階段構建技術產生輕量級運行鏡像,加快部署與啟動速度。鏡像中已預裝所有必要依賴和瀏覽器驅動。
-
VNC 遠端桌面服務:在容器內,通過組合
Xvfb(虛擬螢幕)、Openbox(極簡視窗管理器) 和TigerVNC(VNC服務),為無頭瀏覽器提供了一個可被遠程查看的圖形化介面。
-