switchboard

代理設定管理後台

switchboard

slug目標網址method啟用備註

    全域白名單。子網域會自動放行(例 peteryang.me 也允許 od.peteryang.me)。* = 全部放行。

    依 cron 表達式(台北時間)定期呼叫 API,保留最近 50 筆結果
    名稱對象cron通知啟用最後執行
    載入中…

    健康巡檢

    1~1440,例如 10 = 每 10 分鐘檢查一次

    健康檢查通知

    此處只控制「健康巡檢」的通知;排程任務各自的通知設定、以及「測試通知」按鈕不受影響。

    運作原理

    呼叫者(GET 或 POST 都可)
       │
       ▼
    https://switchapi.peteryang.me/<slug>      ←(別名 switchapi.000.taipei)
       │  查 D1 設定 → 依「method 欄位」決定用 GET 或 POST 打來源
       ▼
    來源 API ──→ 依 source_format 解碼/轉換 ──→ 回傳給呼叫者
    • 進來的方法不限制(GET / POST 都收);打去來源的方法只看設定的 method,兩者脫鉤。
    • 呼叫者 POST 進來的 body 一律忽略;網址 query 參數只在 passthrough_query 開啟時轉傳。
    • API key、POST body 等細節都藏在 worker 設定裡,前端只要記得網址。

    欄位說明

    欄位必填說明
    slug必填路徑識別碼,小寫英數與 -。呼叫網址即 /slug
    target_url必填來源完整網址(可含固定 query,如 api_key)
    method-打來源用的方法:GET(預設)/POST/PUT/PATCH/DELETE/HEAD。POST/PUT/PATCH 會依 body_format 帶 body;其餘把 params 拼進 query。PUT/PATCH/DELETE 會改資料,不做自動健康巡檢(手動測試仍可)
    params-固定參數(JSON 物件)。GET → 拼進 query;POST → 當 body 欄位
    passthrough_query-開啟後,呼叫者網址上的 query 也轉傳給來源(同名時 params 優先)
    body_format-POST/PUT/PATCH 的 body 型態:json(預設)/form(表單 urlencoded)/raw(用 body 欄位原文)
    body-body_format=raw 時送出的原始字串
    request_headers-送給來源的自訂 headers(JSON 物件),會覆蓋自動帶的 Content-Type
    timeout-等待來源的上限(毫秒),超時回 504。空 = 不限
    source_format-來源格式:json/csv(自動轉 JSON)/binary(PDF、圖片等,不做文字處理)
    output_format-輸出:json/xml/留空 = 原格式透傳(僅統一轉 UTF-8)
    encoding-來源編碼:utf-8(預設)/big5(舊政府資料亂碼時選這個)/null(binary 用)
    csv_delimiter-CSV 分隔符,預設 ,;Tab 分隔填 \t
    json_path-只取資料中某路徑,例 result.records 或 data[0].items
    fields-欄位瘦身:字串陣列白名單,例 ["行政區","地址","經度","緯度"],只輸出列出的欄位。政府 CSV 動輒二三十欄、地圖只要四五欄,體積可縮 70% 以上。需 output_format 為 json/xml;資料包在深層時先用 json_path 指到陣列
    xml_root / xml_item-輸出 XML 時的根元素/陣列子項名稱
    filename-設定後強制瀏覽器下載(Content-Disposition),常配 binary
    mock_response-Mock 模式:有值就直接回傳這段內容、完全不打來源(回應帶 X-Mock: true)。此時 target_url 可留空、不做健康巡檢。搭配 mock_content_type(預設 application/json)
    browser_cache_ttl-瀏覽器快取秒數。0 = 不快取(每次都來要)
    edge_cache_ttl-Cloudflare 節點快取秒數,所有人共享、大幅減少打來源。0 = 關
    stale_ttl-來源掛掉時「備胎資料」可頂替的秒數。0 = 關。即時資料務必設 0
    cors_origin-此筆額外允許的來源:*(完全公開)/單一網域/JSON 陣列
    enabled-停用時回 404,如同不存在
    note-備註,不影響邏輯

    快取三層怎麼設

    資料性質browser / edgestale_ttl例子
    幾乎不變(設施、位置)3600~86400604800(7 天)公園設施、監視器
    定期更新600~360086400(1 天)公廁、垃圾車路線
    即時0(都關)0(必關)水位、GPS、座位、急診

    stale = 來源掛掉時回傳上次成功的舊資料(帶 X-Stale: true)。即時資料給舊值會誤導,所以必關。

    CORS 白名單規則

    • 「白名單」分頁是全域名單,存主機名(如 peteryang.me),子網域自動放行(od.peteryang.me 也會過)。填 * = 全部放行。
    • 單筆的 cors_origin 是額外加開,不影響其他資料集。
    • 沒帶 Origin 的請求(curl、伺服器端)一律放行。

    範例

    1. 政府 CSV(Big5 亂碼)轉 JSON

    target_url:     https://data.taipei/api/dataset/…/download
    source_format:  csv        ← 來源是 CSV
    output_format:  json       ← 轉成 JSON 給前端
    encoding:       big5       ← 中文變亂碼就是選這個
    browser/edge:   600 / 600

    2. 需要 POST + API key 的 JSON API(如健保署急診)

    target_url:      https://info.nhi.gov.tw/api/…/SQL0002
    method:          POST
    body_format:     raw
    body:            {"AREA_NO":"","CONT_TYPE":""}
    request_headers: {"Content-Type":"application/json","User-Agent":"Mozilla/5.0"}
    快取全 0(即時資料)

    前端仍用普通 GET 呼叫 /nhi-er 即可 —— worker 會替你轉成 POST。

    3. 只吃「表單提交」的 API

    method:       POST
    body_format:  form                          ← 自動 urlencode + 正確 Content-Type
    params:       {"city":"taipei","type":"1"}  ← 表單欄位放這裡

    4. Mock 假回應(測試前端用)

    slug:           demo-mock
    mock_response:  {"status":"ok","items":[{"name":"測試站點","lat":25.03,"lng":121.51}]}
    target_url:     (留空即可)

    呼叫 /demo-mock 永遠回這段 JSON,來源還沒好、想先接前端時很好用。

    5. 代理 PDF / 圖片等二進位檔

    target_url:     https://example.com/report.pdf
    source_format:  binary
    encoding:       null
    filename:       report.pdf   ← 有填會直接觸發下載,不填則瀏覽器自行預覽
    browser/edge:   86400 / 86400

    排程

    • 依 cron 表達式(5 欄:分 時 日 月 週,台北時間)定期呼叫 API,每分鐘檢查一次到期任務。
    • 對象可選既有代理規則(填 slug,重用其全部設定)或任意 URL(自訂 method / headers / body)。
    • 每個任務保留最近 50 筆結果(狀態、耗時、回應內容前 64KB),點「歷史」查看。
    • email 通知三段式:不通知/失敗才寄/每次都寄(需已設定 Resend)。
    • 常用 cron:*/30 * * * * 每 30 分|0 8 * * * 每天 08:00|0 9 * * 1 每週一 09:00|0 */6 * * * 每 6 小時
    • 快照 API(每個排程可獨立開關,預設關閉):開啟並取一個 snapshot_slug 後, /snapshot/<snapshot_slug>/latest 回最新一筆成功結果、 /snapshot/<snapshot_slug>/history?limit=50 回最近 N 筆(含時間、狀態、內容)。 受同一套 CORS 白名單保護。搭配即時資料排程即可累積歷史數據(例:每小時存一次水位 → 畫歷史曲線)。

    設定

    • 健康巡檢:可開關自動巡檢、調整間隔(分鐘)。間隔不再寫死在部署設定,改後即時生效。
    • 通知開關:分別控制健康巡檢的 email / webhook。未設定對應 secret 時會提示「開了也不會發」。
    • 此處只管「健康巡檢」的通知;排程任務各自的 notify、以及「測試通知」按鈕都不受影響。

    其他功能

    • 測試:列表或編輯表單的「測試」按鈕會由後端當場打來源,顯示狀態、耗時與前幾筆資料 —— 存檔前就能驗證設定。
    • 健康檢查:依「設定」頁的間隔自動巡檢(預設 10 分鐘),列表左側 正常/ 掛了(點一下看最後檢查時間、HTTP 狀態與錯誤原因),狀態轉變時發 webhook / email 通知。
    • 快速編輯:點列表上的 slug(排程點名稱)直接打開編輯。手機上列表自動改成卡片排版。
    • 複製:每列「複製」可選 switchapi.peteryang.me 或 switchapi.000.taipei 網址。
    • 匯出/匯入:右上角可整包備份還原代理規則與白名單(JSON,不含排程)。匯入可選「合併」(同名 slug 以檔案更新、其餘保留)或「覆蓋全部」(先刪光再寫入,需二次確認);檔案內沒有規則時會直接擋下,不會清空資料。

    編輯

    
          
          

    新增排程

    cron 範例:*/30 * * * * 每 30 分|0 8 * * * 每天 08:00|0 9 * * 1 每週一 09:00|0 */6 * * * 每 6 小時
    
          

    執行歷史

    匯入設定

    • 合併:同名 slug 以檔案內容更新,其他既有規則保留
    • 覆蓋全部:先刪除目前全部代理規則與白名單,再寫入檔案內容

    排程不在匯入範圍內,不受影響。