Skip to content

實戰演示:對 AI 說話,一步生成完整腳本

本章將完整演示從「用自然語言說需求」到「拿到可運行腳本」的全過程,細化到每一步的操作。


演示場景

業務背景:您有 20 個 Amazon 賣家帳號,每天需要檢查每個帳號下「Pending(待處理)」的訂單數量,並匯總成一份 Excel 報表發給團隊。

傳統方法:手動一個個登錄帳號,記錄訂單數,填寫 Excel。耗時約 2 小時。

使用 AI + 候鳥:描述需求,AI 生成腳本,腳本幫您幹活。耗時約 15 分鐘(含配置時間)。


第一步:準備工作 (5 分鐘)

NOTE

假設您已經完成了前幾章的配置:

  • ✅ 已安裝 Cursor 或 Antigravity。
  • ✅ 已將候鳥 Rules 知識包導入 Cursor。
  • ✅ 已開啟候鳥 ApiServer (http://127.0.0.1:8186)。
  • ✅ 您的 Amazon 帳號已經在候鳥環境中登錄過(Cookie 已保存)。

準備 sessions.txt 文件

在您的項目文件夾下,創建 sessions.txt,填入您要操作的所有環境 ID:

a1b2c3d4e5f6789012345678901234ab
b2c3d4e5f67890123456789012345bcd
c3d4e5f678901234567890123456cde
... (每行一個 Session_ID,共 20 行)

第二步:在 Cursor 中輸入需求 (30 秒)

按下 Ctrl + L 打開 Cursor Chat,輸入以下內容:

我有一個候鳥 sessions.txt 文件,裡面存放了 20 個帳號的 Session_ID,每行一個。
這些帳號已經在候鳥環境中登錄過 Amazon 了。

請幫我生成一個 Python 腳本,實現以下功能:
1. 讀取 sessions.txt 中的所有 Session_ID。
2. 批量開啟所有環境 (併發數量控制在 10 個)。
3. 在每個環境被 Playwright 接管後:
   a. 等待頁面加載 (環境通常會停留在上次關閉時的頁面)。
   b. 跳轉到 https://www.amazon.com/gp/orders-v2/list (Amazon 賣家訂單頁面)。
   c. 等待 .a-row.shipment 元素出現 (代表訂單列表加載完成)。
   d. 統計頁面中 .shipment-status-buyerPending 元素的數量 (這些是 Pending 訂單)。
   e. 將 Session_ID 前 8 位 + Pending 訂單數量記錄下來。
4. 所有操作完成後,關閉所有環境。
5. 將結果保存為 amazon_orders_[當天日期].xlsx,
   包含列:環境 ID (前 8 位)、Pending 訂單數、檢查時間、狀態。

如果發生異常,截圖保存到 errors/ 文件夾,並在結果表中記錄「檢查失敗」。

第三步:AI 生成代碼 (約 30 秒)

收到需求後,Cursor 的 AI 會開始生成全量代碼。生成的結果應該如下所示:

python
"""
候鳥瀏覽器 + Amazon 訂單檢查腳本
自動檢查各環境下的 Pending 訂單數量
"""
import threading
import datetime
from pathlib import Path
from concurrent.futures import ThreadPoolExecutor, as_completed
import requests
import openpyxl
from playwright.sync_api import sync_playwright, TimeoutError as PWTimeout

# ==============================
# 配置項 (根據實際情況修改)
# ==============================
APISERVER   = "http://127.0.0.1:8186"
SESSIONS_FILE = "sessions.txt"
MAX_WORKERS  = 10   # 最大併發數
ERRORS_DIR   = Path("errors")
ERRORS_DIR.mkdir(exist_ok=True)

results_lock = threading.Lock()
results = []

# ==============================
# APIServer 封裝
# ==============================
def start_env(session_id: str) -> dict | None:
    try:
        resp = requests.post(
            f"{APISERVER}/api/v1/browser/start",
            json={"Session_ID": [session_id], "isHeadless": False},
            timeout=30
        )
        data = resp.json()
        if data["code"] == 0:
            return data["data"]["listid"][0]
    except Exception as e:
        print(f"[{session_id[:8]}] APIServer 報錯: {e}")
    return None

def stop_env(session_id: str):
    try:
        requests.post(
            f"{APISERVER}/api/v1/browser/stop",
            json={"Session_ID": session_id},
            timeout=10
        )
    except Exception:
        pass

# ==============================
# 單個帳號任務
# ==============================
def check_orders(session_id: str):
    now = datetime.datetime.now().strftime("%H:%M:%S")
    env_short = session_id[:8]
    
    env_data = start_env(session_id)
    if not env_data:
        with results_lock:
            results.append({
                "env_id": env_short,
                "pending_orders": "N/A",
                "check_time": now,
                "status": "開啟環境失敗"
            })
        return
    
    port = env_data.get("browser_CDP_Port")
    ws   = f"ws://127.0.0.1:{port}/json/version"
    
    pw = sync_playwright().start()
    try:
        browser = pw.chromium.connect_over_cdp(ws)
        context = browser.contexts[0]
        page    = context.pages[0] if context.pages else context.new_page()
        
        # 訪問 Amazon 訂單頁
        page.goto(
            "https://www.amazon.com/gp/orders-v2/list",
            wait_until="domcontentloaded",
            timeout=20000
        )
        
        # 等待訂單列表加載
        page.wait_for_selector(".a-row.shipment", timeout=15000)
        
        # 統計 Pending 訂單
        pending = page.locator(".shipment-status-buyerPending").count()
        print(f"[{env_short}] ✅ 檢查完成,Pending 數: {pending}")
        
        with results_lock:
            results.append({
                "env_id": env_short,
                "pending_orders": pending,
                "check_time": now,
                "status": "成功"
            })
        
        browser.close()
        
    except PWTimeout:
        page.screenshot(path=str(ERRORS_DIR / f"{env_short}_timeout.png"))
        with results_lock:
            results.append({
                "env_id": env_short,
                "pending_orders": "N/A",
                "check_time": now,
                "status": "頁面加載超時"
            })
    except Exception as e:
        try:
            page.screenshot(path=str(ERRORS_DIR / f"{env_short}_error.png"))
        except Exception:
            pass
        with results_lock:
            results.append({
                "env_id": env_short,
                "pending_orders": "N/A",
                "check_time": now,
                "status": f"異常: {str(e)[:50]}"
            })
    finally:
        try:
            pw.stop()
        except Exception:
            pass
        stop_env(session_id)

# ==============================
# 主代碼
# ==============================
def main():
    # 讀取 Session_ID 列表
    session_ids = [
        line.strip()
        for line in Path(SESSIONS_FILE).read_text().splitlines()
        if line.strip()
    ]
    print(f"📋 共 {len(session_ids)} 個帳號,併發數 {MAX_WORKERS}")
    
    # 併發執行
    with ThreadPoolExecutor(max_workers=MAX_WORKERS) as pool:
        futures = {pool.submit(check_orders, sid): sid for sid in session_ids}
        for future in as_completed(futures):
            sid = futures[future]
            try:
                future.result()
            except Exception as e:
                print(f"[{sid[:8]}] 未捕獲異常: {e}")
    
    # 保存 Excel 表
    today = datetime.date.today().strftime("%Y%m%d")
    filename = f"amazon_orders_{today}.xlsx"
    
    wb = openpyxl.Workbook()
    ws = wb.active
    ws.title = "訂單檢查結果"
    ws.append(["環境 ID (前 8)", "Pending 訂單數", "檢查時間", "狀態"])
    for r in results:
        ws.append([r["env_id"], r["pending_orders"], r["check_time"], r["status"]])
    
    wb.save(filename)
    
    # 打印匯總
    success = sum(1 for r in results if r["status"] == "成功")
    print(f"\n{'='*40}")
    print(f"✅ 檢查完畢: 成功 {success} / 總額 {len(results)}")
    print(f"📄 報表已保存至: {filename}")
    print(f"❌ 錯誤截圖在: errors/ 文件夾")

if __name__ == "__main__":
    main()

第四步:安裝依賴並運行 (2 分鐘)

生成代碼後,AI 通常會告訴用戶需要安裝哪些依賴包:

bash
pip install playwright requests openpyxl

然後直接運行:

bash
python check_amazon_orders.py

預期運行效果

📋 共 20 個帳號,併發數 10
[a1b2c3d4] ✅ 檢查完成,Pending 數: 3
[b2c3d4e5] ✅ 檢查完成,Pending 數: 0
[c3d4e5f6] ✅ 檢查完成,Pending 數: 7
... 
========================================
✅ 檢查完畢: 成功 18 / 總額 20
📄 報表已保存至: amazon_orders_20260226.xlsx
❌ 錯誤截圖在: errors/ 文件夾

常見問題與 AI 修復技巧

「腳本能跑,但找不到訂單元素」

選中相關代碼,按 Ctrl + K 輸入:

Amazon 頁面的選取器變了,現在訂單行選取器是 .order-info,Pending 狀態選取器是 .order-status-pending,請更新代碼。

「增加功能:順便採集訂單詳情」

在 Chat 中繼續對話:

基於上面的代碼,在採集訂單數量後,請順便採集頁面中每個 Pending 訂單的 訂單號 (.a-fixed-right-grid-col .a-link-normal) 和 預期發貨日期 (.expected-ship-date),並記錄到 Excel 中。

「併發太快導致崩潰,需要限流」

基於 ThreadPoolExecutor 併發,請在每次開啟新任務前增加 3 秒的隨機等待週期,避免同時開啟太多環境導致內存不足。

總結:AI 寫腳本的最佳實踐

[ 準備階段 ]
1. Rules 知識包已導入 -> AI 聽懂候鳥所有接口。
2. 確認 ApiServer 已啟動。

[ 需求描述 ]
越具體越好:
  ✅ 「訪問 https://xxx,等待 #main-content 元素,點擊 .order-btn,等待成功彈窗」
  ❌ 「幫我管一下訂單」

[ 生成階段 ]
通常 80% 可直接用。微調細節通過追問解決。

[ 迭代優化 ]
「基於這個再加個 xx 功能」 -> AI 會在不重寫的情況下追加修改。

IMPORTANT

重要提醒:AI 生成的代碼雖然強大,但偶爾會有小瑕疵。在大規模運行前,請務必先在 1-2 個測試環境上跑通,確認無誤後再應用到全量環境。


TIP

🎉 恭喜您!您現在已經掌握了利用 AI 模型為候鳥瀏覽器一步生成自動化腳本的全套方法。

遇到問題?請參考對應章節: