04案例研究

停車神隊友

在 LINE 傳出你的位置,馬上知道附近哪裡還有車位、怎麼收費、開車要多久。

角色
獨立開發
時間
2025
類型
LINE Bot · Node.js 服務
資料
交通部 TDX · Google Maps Platform · 臺北市開放資料
停車神隊友:停車標誌與停在車格裡的汽車插畫
  • 8依縣市平行查詢的 TDX 端點
  • 2.5 km搜尋半徑
  • 5每次回覆的結果卡片
  • 10 次/分每個 IP 的 webhook 限流

問題

找車位時,常要在地圖 App、停車場 App 與政府資料之間來回切換,才能拼湊出「附近哪裡有位子、多少錢、怎麼去」。停車神隊友把這件事收進 LINE:傳一個位置,就拿到排好序的答案。

使用流程

1. 選模式

輸入「停車場」或「停車格」,Bot 會記住你要查的是哪一種。

2. 給位置

點快速回覆分享目前位置,或直接輸入地址、地標。

3. 拿答案

收到最近 5 個結果的卡片:名稱、地址、剩餘車位、收費說明、開車距離與時間,點一下就開啟 Google 地圖導航。

架構

停車神隊友架構 LINE 使用者位置 / 地址LINE PlatformWebhookExpress 服務簽章驗證限流 10 次/分/IPGoogle Geocoding座標 → 縣市交通部 TDX停車場 4 端點路邊 4 端點Google Places補充停車場臺北市開放資料備援合併 · 排序約 20 m 內去重2.5 km 內依距離Distance Matrix開車距離與時間Flex 卡片前 5 筆一鍵導航
先用座標判斷縣市,再平行查詢 TDX 與 Google Places,合併去重後才計算開車距離。

關鍵設計決策

01

依縣市平行查詢、容錯合併

先用反向地理編碼判斷縣市,再用 Promise.allSettled 平行呼叫該縣市的 TDX 端點(停車場、設施、即時車位、費率;路邊則是路段、即時車位、費率、收費時段),任一端點失敗不影響其他結果。

02

多來源去重

TDX 與 Google Places 的結果合併後,座標相差約 20 公尺內視為同一處;只保留 2.5 公里內並依距離排序。

03

Token 快取

TDX 使用 OAuth client credentials,存取權杖快取到到期前 60 秒,不必每次查詢都重新換發。

04

保護 API 額度

webhook 每個 IP 每分鐘最多 10 次。每次查詢約 3 次 TDX 呼叫與 5 個 Distance Matrix elements,以 Google 免費額度估算可支撐每日上千名使用者。

05

降級而不是失敗

TDX 沒有資料時改用臺北市開放資料補上停車場清單;每次回覆都附純文字摘要,沒有卡片也能讀到結果。

技術

  • Node.js
  • Express 5
  • LINE Messaging API
  • LIFF
  • axios
  • express-rate-limit
  • TDX API (OAuth 2.0)
  • Google Geocoding
  • Google Places
  • Distance Matrix