跳到主要內容跳到頁尾
作品
  • 省時

約 978 頁的客戶登錄資料,改成每天自動一次取回對帳

每天一次取回平台上全部客戶登錄資料,驗證後整批更新試算表;對平台只讀不寫,登入仍需人工完成。

2026/08
約 9,777 筆資料、約 978 頁
案例閱讀約 2 分鐘
背景與使用技術(4 項)

對帳需要第三方平台後台的客戶登錄資料,但後台只能匯入、不能匯出,而且每頁只顯示 10 筆,要點 978 頁才看得完。改成每天自動執行一次:不逐頁翻,直接呼叫頁面本身的清單請求,約 2 秒取回全部約 9,777 筆,寫進每天更新的試算表。工具只讀不寫,資料有異常寧可當天不更新。

PythonPlaywrightGoogle 試算表排程

誰在用

負責核對平台客戶資料的財務與對帳人員

原本怎麼做

對帳要比的是「平台上登錄的客戶資料」和「公司認知的客戶資料」是否一致,但平台那一側沒辦法整體看到:後台一頁 10 筆、共約 978 頁,沒有匯出、也沒有公開 API;登入還有圖形驗證碼,一定要真人參與。結果是任何形式的整體比對實務上都做不到。

前後對比

取得全部資料改造前後台一頁 10 筆,共約 978 頁改造後一次請求取得全部,約 2 秒、9,777 筆實測
更新頻率改造前無法整體比對改造後每日 09:00 排程,失敗時 12:00、15:00、18:00 重試規格
寫入前檢查改造前資料只能一頁一頁看,沒有地方可以檢查改造後4 項檢查任一不過就不覆寫並發告警規格

量測:實測=有計時或有紀錄;估計=喜特先生推估;客戶自述=客戶回報;規格=設計上的固定條件;待補=尚未取得數字。

流程一眼看懂

改造前
  1. 後台清單(一頁 10 筆)

  2. 逐頁查看

  3. 無法整體比對

改造後
  1. 人工登入一次

  2. 沿用瀏覽器登入狀態

  3. 一次取回全部

  4. 四項檢查

  5. 更新試算表並回報 Slack

流程示意:依本案既有做法整理,非客戶實際畫面。

做了什麼

  1. 不模仿翻頁:直接要求全部資料,一次回應就是完整結果。
  2. 寫入前先把關:結果非空、欄位結構一致、統一編號無重複、無個資遮罩殘留,任一不過就不覆寫,改發告警。
  3. 只讀:程式裡沒有寫回平台的路徑,唯一會改動的是那張試算表。
  4. 每次執行都回報:成功、跳過或驗證失敗,結束時都發一則 Slack 報告。

程式碼與實作細節收在頁面下方,需要時再展開。

你的情況像這樣嗎?

  • 你要核對的資料在別人的後台,沒有匯出,也沒有 API。
  • 一頁一頁翻才看得到全貌,所以從來沒有整體比對過。
  • 資料含個資,需要只讀、出錯寧可不更新。

更多成果與運作條件

  • 全部客戶資料一次取回

    登入完成後,約 2 秒取得 9,777 筆資料

  • 978 頁 → 1 次(實測)

    後台翻頁收斂為一次全量撈取

  • 0 條寫回路徑

    工具設計上只讀,要改平台上的資料仍須回到平台本身

以上為本案既有成果與運作條件;估計值依原始資料標示,其他專案需另行評估,並非通用成效保證。

挑戰:原本遇到的困難

對帳要比的是「平台上登錄的客戶資料」和「公司認知的客戶資料」是否一致。問題在於平台那一側沒有辦法整體看到:

  • 只能一筆一筆查:後台一頁 10 筆、共約 978 頁,任何形式的整體比對實務上都做不到
  • 沒有匯出路徑:後台只有匯入功能,沒有可用的匯出,也沒有公開 API 可以呼叫
  • 登入有圖形驗證碼:程式無法自行登入,這一步一定要有真人參與
  • 資料含個人資訊:客戶地址等欄位會出現在試算表裡,抓取與儲存都要謹慎

因此前提是:只借用已登入瀏覽器的身分、只讀、出錯時寧可不更新。

完整解決方案與設計取捨

以常駐的 Chrome 作為工作階段,由人工登入一次。之後程式透過 Chrome DevTools Protocol(瀏覽器開放給外部程式控制的介面)接上這個瀏覽器,沿用它的登入狀態發出請求。

核心設計

  1. 不模仿翻頁:後台清單請求接受每頁筆數參數,直接要求全部資料,一次回應即是完整結果集
  2. 寫入前先把關:四項檢查(結果非空、欄位結構一致、統一編號無重複、無個資遮罩殘留)任一不過就不覆寫,改發告警
  3. 只讀設計:程式碼中沒有任何寫回平台的路徑,唯一會改動的是那張試算表
  4. 每次執行都回報:不論成功、跳過或驗證失敗,結束時都發一則 Slack 報告
  5. 排程與重試:macOS 的排程服務 launchd 每日 09:00 執行,失敗時於 12:00、15:00、18:00 重試,當天成功一次後就不再重跑

技術與實作細節

展開完整實作說明

為什麼借用頁面的請求,而不是正式 API?

因為沒有可以呼叫的 API。平台的管理頁只有匯入,找不到匯出。這支工具走的是使用者本人的路徑,只在登入這一步由人完成,之後的請求都以已登入的瀏覽器身分發出。

它唯一省略的是「點擊翻頁」這件事。管理頁自己的清單請求吃每頁筆數的參數,所以工具直接要求整份清單,而不是一頁一頁翻。這裡借用的是頁面本身的請求,不是去讀畫面上長出來的值。

代價是這個做法依賴平台前端的行為。平台若改版,工具會失效;這個失效會出現在每次執行的報告裡,不會靜默發生。

寧可當天不更新,也不發布壞資料

撈回來的資料在寫入試算表前要通過四項檢查:結果是不是空的、欄位結構是否與預期一致、統一編號有沒有重複、本該是明碼的欄位有沒有混入個資遮罩的痕跡。任一項不過,這趟就不覆寫,直接發告警。

當天沒更新,資料只是舊了一天;悄悄用錯誤資料蓋掉正確資料,才是要很久以後才會發現的問題。

注意

每次執行都會發一則 Slack 報告,不論成功、跳過還是驗證失敗。收不到這則報告本身就是異常訊號,代表排程可能整個失敗到連告警都發不出去,不能當成「今天沒事所以沒有訊息」。

登入狀態監控與工作階段

每 5 分鐘探測一次登入狀態。若發現被登出,立即發出 Slack 告警,不必等到下一次排程才察覺。這個探測流量同時讓工作階段在兩次執行之間保持存活,是自動化能持續運作的一部分。

說明

跑這支工具的電腦必須保持清醒,因為工作階段撐不過睡眠。試算表永遠只反映最後一次撈取當下的狀態,要真的修改客戶登錄資料,仍須到平台本身處理。

人工註記放在隔離的分頁

主頁每天整頁覆寫,所以不能讓人直接在主頁上加註記,隔天就會被洗掉。人工註記(例如某客戶需寄紙本發票、聯絡窗口變更)放在獨立的備註分頁,以統一編號對應。自動化只把備註當成唯讀參考欄位帶回主頁,從不寫入這張分頁。

延伸閱讀

有類似的情境想討論

帶著現有流程與去識別範例,討論適合的做法。