這份手冊把「蝦皮廣告自動化」專案裡實戰驗證過的做法整理給 James—— 重點是三件事:怎麼開瀏覽器視窗並綁定登入 cookie、怎麼同時開多個實例登入不同蝦皮賣場、 怎麼在蝦皮頁面上活下來(彈窗、延遲、排錯)。 這些概念可以直接搬去做智慧客服的側錄與 AI 模擬學習。
一句話:每天自動幫多個蝦皮賣場跑完「下載報表 → 爬資料 → 上傳 Google Sheets → 調整廣告預算 → LINE 通知」整條流水線, 全程不用人碰。技術底座是 Python + Playwright(瀏覽器自動化,不是打 API——蝦皮沒有開放這些功能的 API,所以一切都靠「操作真實網頁」完成)。
流水線外面包了一層網頁管理介面(webapp):FastAPI + SQLite 的本機服務, 提供多帳號管理、一鍵執行、排程(每天/每週/每小時)、執行歷史、即時 log、 暫停/中斷、跨帳號的通知總覽。引擎(流水線本體)與管理層(webapp)是分開的兩層—— 管理層不改引擎程式,而是把每個帳號的設定「注入環境變數」後啟動子程序,這是多帳號做法的關鍵(第 3 節細講)。
以下是管理介面的真實畫面(用隔離測試實例+假資料「測試賣場A/B」擷取,不含任何真實帳號資訊)。
蝦皮頁面隨時會冒視窗擋住你要點的東西,這是自動化最大死因。實戰遇到三類:
| 類型 | 長相與時機 | 對策 |
|---|---|---|
| 不定期促銷 modal最陰險 | 不定時彈出(例:宅配開通邀請),含「拒絕/接受」+右上 X。可能在操作中途冒出來,剛好蓋住要點的按鈕,程式就一直捲動找不到目標。 | 統一的 close_all_popups():在可見 modal 內依序試「右上 X → 安全文字鈕(我知道了/稍後/關閉/取消)→ 拒絕」。
關鍵是有一份 AVOID 清單:絕不點「接受/同意/開通/確定/前往」這類會替使用者做決定的按鈕。每個關鍵動作(捲動前、點匯出前)都再呼叫一次,把「剛剛才彈出來」的也清掉。 |
| 密碼重驗 modalsession 過期 | session 過期時蝦皮不跳轉登入頁,而是在當前頁面蓋一個要求重輸密碼的 modal,整頁被遮住。 | 寫一個「檢查並處理」函式(短超時、沒彈窗時零成本),在每個長操作前都呼叫一次:每個步驟開始前、進頁面後、切換條件後、點匯出前。當保險絲用,寧可多查。 |
| 業務流程彈窗預期內 | 特定操作觸發的確認窗(例:調預算時的「關鍵學習階段」提醒)。 | 偵測 → 點取消 → 該筆標「跳過」(不是失敗、不重試、不中斷後續)。關閉後一定驗證彈窗真的消失了再繼續,不能點完就當關掉了。 |
另外每次偵測到彈窗都自動截圖存檔,管理介面直接顯示縮圖——事後排錯時能看到「當時畫面長怎樣」,價值極高。
蝦皮部分元件(Vue popover)會驗 isTrusted,JavaScript 的 element.click() 根本不觸發。
實測有效的固定招式(專案內代號「方法 6」):
mouse.move(x, y) → 等 200ms → mouse.down() → 等 100ms → mouse.up()
用 Playwright 的低階滑鼠事件模擬完整的「移過去、按下、放開」節奏。200ms/100ms 的時序是 probe 實測出來的,不要亂改。 客服系統要在聊天頁點任何「假按鈕」(div 做的)時,優先試這招。
element.__vueParentComponent),這種只有探勘挖得出來。另一個省大量時間的原則:跨來源比對用穩定 ID,不用顯示名稱。蝦皮的名稱有全形空格、會被改名; 所有字串先過統一的清洗函式(全形空格、多空白正規化),比對一律用商品 ID。客服側錄比對「哪個買家、哪筆訂單」時同理。
每次執行都開一顆獨立的 Chrome(獨立 context、獨立 cookie、獨立下載資料夾)。要同時跑多個,靠三層規則管秩序:
| 層級 | 規則 | 為什麼 |
|---|---|---|
| 佇列 | 以「帳號+功能」為單位各開一條佇列+一個工人。不同帳號、或同帳號不同功能→真並行;同帳號同功能→排隊。 | 同功能同時跑兩次會互搶自己的下載檔和 cookie;不同帳號本來就毫無關係,不該互等。 |
| 寫入互鎖 | 會「改到蝦皮上的錢」的功能(調預算、復原)同帳號一次只准一個在跑(per 帳號的鎖);唯讀功能不拿鎖、完全並行。 | 「調整」和「復原」同時跑會對同一筆預算互相打架,這是財務風險,必須硬擋。 |
| 全域上限 | 同時最多 N 顆瀏覽器(semaphore,預設 2,可設定)。超過的維持排隊,輪到才開。 | 實測同時開太多 Chrome 會把機器塞爆:頁面載入逾時、元素等不到,全部的 run 一起變慢變炸。上限 2 反而整體最快。 |
搬到客服場景:2~3 個模擬器各綁一個賣場=「不同帳號」層級,天生可以並行; 但「同一個賣場的自動回覆」屬於會寫入的動作,要像 writer 鎖一樣同帳號序列化,避免對同一個買家重複回兩句。 全域上限依機器規格抓(先從 2 開始實測往上調)。
開 2~3 個瀏覽器實例(「模擬器」),各自綁定不同賣場的登入 cookie,同時進到各賣場的蝦皮聊聊(客服訊息)頁面: ①智慧側錄——持續讀取買家訊息與客服人員的真實回覆,結構化存下來當訓練資料; ②模擬學習——讓 AI 讀側錄資料學回覆風格,先做「建議回覆」給人工採用,成熟後再逐步自動化。
| 客服系統需求 | 直接沿用的做法(本專案已實戰驗證) |
|---|---|
| 開視窗並綁定登入 cookie免每次掃碼/OTP | 3.1 的 cookie 快取流程:首次人工登入留 120 秒窗口 → 存 cookies.json → 之後 add_cookies 還原身分 → 用「頁面上有沒有登入後元素」驗證 → 每次跑完回寫最新 cookie。 |
| 兩三個模擬器登不同賣場 | 3.2 的帳號隔離:一個賣場一個資料夾(cookie/資料/log 全隔離)+設定用環境變數注入;配 3.3 轉換賣場處理「一個登入管多賣場」。一個實例一份 cookie 檔,絕不共用。 |
| 同時跑不互撞 | 5 的三層並行模型:帳號間真並行、會寫入的動作同帳號互鎖、全域瀏覽器數上限。 |
| 頁面隨時被彈窗打斷 | 4.1 的 close_all_popups 模式+AVOID 清單(絕不點「接受/開通」)+每個關鍵動作前重查+彈窗自動截圖。聊聊頁一樣會被促銷 modal 蓋住。 |
| 側錄訊息、拿到穩定資料 | 4.4 的探勘方法論:先 probe 聊天列表與訊息 DOM;顯示層拿不到的欄位(買家 ID、訂單編號)從 Vue 元件內部撈(__vueParentComponent);跨來源比對用 ID 不用暱稱;字串統一清洗。 |
| 模擬人類操作(點擊、輸入) | 4.2 的方法 6 滑鼠時序繞 isTrusted;操作間留自然延遲。 |
| 登入態突然失效 | 4.1 的密碼重驗 modal 偵測:每個長操作前檢查、失效時處理或通知人工補登入,而不是整條線悄悄死掉。 |
| 長時間掛著不出事 | 4.3 的重試哲學(每項獨立、暫時性錯誤遞增等待、strict 不將就)+「讓程式有聲」的 log 紀律+管理介面的排程/暫停/中斷/通知總覽(第 2 節畫面)。 |