你是否曾滿懷希望地設定好一個 AI 瀏覽器自動化腳本,讓它幫你填寫表格、爬取資料或預約服務,結果跑一跑卻因為網頁元素稍微改變、載入慢了一秒,或是彈出一個意想不到的視窗,就整個卡住或做出錯誤動作?這種不確定性,正是目前許多 RPA(機器人流程自動化)或 AI 驅動自動化工具的痛點。

今天,我們要介紹一個在 Hacker News 上獲得高度討論(61 分,21 則評論)的新工具——Libretto。它的核心主張正是「讓 AI 瀏覽器自動化變得確定性(Deterministic)」。簡單來說,就是讓自動化腳本每次執行都像瑞士鐘錶一樣精準可靠,不會因為網路波動或網頁的微小變化而失敗。對於香港和台灣的中小企業主、行銷人員、資料分析師,或是任何需要與網頁重複互動的上班族來說,這代表著你可以真正信賴自動化,將繁瑣工作安心交出,大幅提升生產力。

本文將以零基礎的視角,帶你從頭認識 Libretto,並透過一個具體的「自動化商品價格監控」案例,一步步教你如何建立一個堅固可靠的自動化流程。

為什麼你需要「確定性」的自動化?

在深入教學前,我們先理解問題所在。傳統或一些初階的 AI 自動化工具,其運作邏輯常是「尋找這個按鈕上的文字」或「點擊這個 CSS 選擇器」。然而,現實中的網頁是動態的:按鈕文字可能從「加入購物車」變成「立即購買」;CSS 類別可能因網站改版而全部更換;一個彈出的會員登入視窗可能徹底打亂腳本步驟。

這導致了自動化腳本極其脆弱,需要不斷維護,所謂的「省時」最後可能變成「花更多時間除錯」。Libretto 的解決方案,是引入更強的容錯機制、狀態判斷與智慧等待策略,確保即使在非預期情況下,腳本也能做出正確決策,完成任務,或至少優雅地失敗並提供明確錯誤報告,而非直接卡死。

第一步:認識與設定 Libretto 環境

Libretto 目前是一個開源專案,你可以在 GitHub 上找到它。它的使用方式並非一個有華麗介面的軟體,而是透過程式碼(主要是 Python)來定義你的自動化流程。別擔心,即使你不是專業工程師,跟著以下步驟也能上手。

首先,你需要準備好基礎的程式環境:

  1. 安裝 Python:確保你的電腦已安裝 Python 3.8 或以上版本。你可以到官方網站下載。
  2. 安裝 Libretto:打開你的終端機(Terminal 或 Command Prompt),輸入以下指令來安裝 Libretto 套件:
    pip install libretto-automation
  3. 安裝瀏覽器驅動:Libretto 通常基於 Playwright 或 Selenium 這類瀏覽器控制工具。以 Playwright 為例,安裝後可能需要執行一個指令來安裝瀏覽器核心:
    playwright install

環境設定完成後,你就可以開始撰寫你的第一個「確定性」自動化腳本了。

第二步:實戰教學 – 建立商品價格監控機器人

假設你是一個電商營運者,需要每天監測競爭對手在 PChome 或 HKTVmall 上某項商品的價格。我們來設計一個腳本,它會:1) 打開目標商品頁面,2) 等待價格元素完全載入,3) 提取價格數字,4) 記錄下來並與昨日比較。

以下是簡化的程式碼範例與逐步解說:

import asyncio
from libretto import Browser, deterministic_step

async def monitor_price(url, product_name):
    # 初始化瀏覽器,設定為「可見」模式以便除錯
    async with Browser(viewport={'width': 1280, 'height': 800}, headless=False) as browser:
        
        # 步驟1:導航至商品頁面
        await deterministic_step(
            name="navigate_to_product",
            action=lambda: browser.goto(url),
            # 設定成功條件:網址包含關鍵字且頁面主要標題載入
            success_condition=lambda: url in browser.url and browser.is_visible('h1'),
            # 設定重試策略:最多重試3次,每次失敗等待2秒
            retry_strategy={'max_attempts': 3, 'delay': 2}
        )
        
        # 步驟2:定位並提取價格元素
        price_element = await deterministic_step(
            name="locate_price",
            action=lambda: browser.query_selector('[data-testid="price"]'), # 使用更穩定的資料屬性
            success_condition=lambda elem: elem is not None and elem.inner_text().strip() != '',
            fallback_selectors=['.price', '.amount', 'span:has-text("$")'] # 備用選擇器,增加容錯
        )
        
        current_price = price_element.inner_text().strip()
        print(f"[{product_name}] 當前價格: {current_price}")
        
        # 步驟3:這裡可以加入邏輯,將 current_price 存入資料庫或與昨日比對
        # ...

        return current_price

# 執行腳本
asyncio.run(monitor_price("https://example.com/product/123", "藍牙耳機"))

關鍵技巧解說:

  • deterministic_step:這是 Libretto 的核心。它將每個步驟包裝起來,並允許你定義 success_condition(成功條件)。只有當條件滿足,腳本才會繼續下一步,否則會根據 retry_strategy 重試。
  • fallback_selectors:這是實現「確定性」的精髓之一。當主要選擇器 [data-testid="price"] 找不到元素時,腳本會依序嘗試後備的清單 ['.price', '.amount', ...],大大提升在不同網站結構下的適應能力。
  • 智慧等待:內建的 success_conditionretry_strategy 避免了使用固定的 time.sleep(10) 這種低效且不可靠的等待方式,而是動態地等待「必要條件」成立。

第三步:進階應用與錯誤處理

一個真正可靠的腳本必須能處理異常。Libretto 鼓勵你定義清晰的錯誤處理路徑。例如,在價格監控中,如果商品缺貨,頁面可能顯示「暫無存貨」而非價格。你可以這樣擴充:

        try:
            price_element = await deterministic_step(...) # 同上
        except Exception as e:
            # 如果抓不到價格元素,嘗試檢查是否有缺貨標示
            out_of_stock = await browser.is_visible('text="缺貨"')
            if out_of_stock:
                print(f"[{product_name}] 商品目前缺貨。")
                return "Out of Stock"
            else:
                # 若非缺貨,則可能是其他錯誤,記錄並拋出
                print(f"[{product_name}] 無法取得價格,原因: {e}")
                raise

你可以將這個腳本設定在雲端伺服器(如 AWS Lambda, Google Cloud Functions)或你的個人電腦上定時執行(使用 cron 或工作排程器),它就能成為你 24 小時不間斷的市場情報員。

總結:擁抱可靠的自動化,釋放你的時間

透過 Libretto,我們看到了下一代 AI 輔助自動化的方向:不僅是「能自動執行」,更是「能可靠地自動執行」。這對於講求效率與精準的香港與台灣職場至關重要。無論是自動化填報政府表格、監測社交媒體聲量、彙整多個新聞來源,或是處理內部系統的日常作業,一個確定性的框架能大幅降低維護成本與心理負擔。

從今天開始,別再忍受動不動就失敗的自動化腳本。嘗試用 Libretto 的思維重新設計你的流程:為每個步驟定義清晰的成功條件、設計備用方案、規劃優雅的錯誤處理。當自動化變得可信賴,你才能真正抽身,將寶貴的精力投入到更需要人類創意與策略思考的工作上。

常見問題

Q: 我需要很強的程式背景才能使用 Libretto 嗎? A: 基礎的 Python 知識是必要的,例如了解變數、函式與迴圈。但 Libretto 的 deterministic_step 框架實際上簡化了許多複雜的錯誤處理邏輯,讓初學者更容易寫出穩健的腳本。網路上也有大量 Python 入門資源可供學習。

Q: Libretto 與市面上的無代碼自動化工具(如 Zapier、Make)有何不同? A: Zapier 等工具擅長連接不同的雲端服務 API,在預定義的觸發與動作間運作,非常適合一般商務流程。Libretto 則專注於「網頁瀏覽器」內的自動化,能處理那些沒有提供 API、或操作非常依賴網頁介面的任務,例如從老舊的內部系統抓取報表。它提供更底層、更彈性且可程式化的控制。

Q: 使用這類自動化腳本爬取網站資料,是否會有法律風險? A: 這是非常重要的考量。你必須遵守目標網站的 robots.txt 規則,並尊重其服務條款。對於公開價格資訊的監測,通常若頻率不高(例如每小時一次而非每秒一次),且用於個人或內部市場分析,風險較低。但若用於大量爬取、商業競爭或侵犯隱私,則可能觸法。建議在進行前評估風險,並考慮使用網站官方提供的 API 為優先方案。

Q: Libretto 能處理需要登入的網站嗎? A: 可以。你可以將登入流程也編寫成多個 deterministic_step,例如輸入帳密、點擊登入鈕、等待登入成功轉跳。密碼等敏感資訊務必透過環境變數或加密檔案來儲存,不要直接寫死在程式碼中。

Q: 如果網站是動態載入內容(Single Page Application),Libretto 能應付嗎? A: 可以,這正是 Libretto 的強項。Playwright 這類現代瀏覽器自動化工具能完美執行 JavaScript 並等待網路請求完成。在 Libretto 中,你可以將 success_condition 設定為「等待某個動態生成的元素出現」,腳本會智慧地等待直到條件滿足,不受前端框架影響。