2023年10月14日 星期六

tdx7984: 自架公車到站時間查詢服務

本文已過時作廢。 請改看新版: tdx7984: 自架公車到站時間查詢服務, 2407 版


如果你想要在自己的伺服器上自行架設 tdx7984 "去坐巴士" 服務 (github 專案首頁使用說明) 可以這樣做:

  1. 安裝相依套件: apt install python3-flask python3-flask-cors python3-apscheduler
  2. 到交通部的運輸資料流通服務 tdx 網站註冊、 取得一組 ID 跟 secret。 詳見 我寫的簡介文
  3. 請參考 tdx-credential.sh 先把 ID 跟 secret 設定到環境變數裡面, 也建好目錄以便存放 access_token。 執行這個 script: source tdx-credential.sh 並且確認 $TDX_TOKEN_DIR 裡面出現了一個 tdx-credential.json 檔案、 確認 echo $TDX_ACCESS_TOKEN 會出現一堆看似亂碼的通行憑證。 注意: 一定要用 source 或 . 執行, 環境變數才會保留下來。
  4. 從 tdx API 取得路線與站牌靜態資訊: for ct in $(grep -Po '\b[A-Z]\w+$' cities.csv) ; do curl -H 'accept: application/json' -H "authorization: Bearer $TDX_ACCESS_TOKEN" "https://tdx.transportdata.tw/api/basic/v2/Bus/StopOfRoute/City/$ct" > $ct.json ; sleep 8 ; done
  5. (可略過) zq 範例: 列出某縣市所有路線名稱及起迄站名: zq -f csv -i json 'over this | { SubRouteUID, name:SubRouteName.Zh_tw, begin:Stops[0].StopName.Zh_tw, end:Stops[-1].StopName.Zh_tw }' Taipei.json
  6. (可略過) zq 範例: 列出某縣市所有路線的所有站牌名稱: zq -f csv -i json 'over this | over Stops with RouteUID,RouteName => ({rt_uid:RouteUID, rt_name:RouteName.Zh_tw, stn_id:StationID, stop_uid:StopUID, stop_name:StopName.Zh_tw})' Taipei.json
  7. 刪除舊的資料庫、重新建立空的資料庫: rm -f routes_stops.sqlite3 ; sqlite3 routes_stops.sqlite3 < create_db.sql
  8. 把各縣市的 json 檔匯入 sqlite3: python3 sqlify.py routes_stops.sqlite3
  9. (可略過) 進入 sqlite routes_stops.sqlite3, 然後測試: select stop.uid, stop.cname, stop.station_id, stop.srt_uid, subroute.cname from stop join subroute on stop.srt_uid=subroute.uid where stop.cname="一女中(公園)" order by station_id
  10. 建立 log 檔的目錄: mkdir ~/log
  11. 把 app.py 裡面的 ssl_context=... 那一段註解掉, 採用 http 而不採用 https。
  12. 執行 python3 app.py
  13. 用瀏覽器打開: http://localhost:7984/bus/
  14. 如果想恢復採用 https, 除了還原 ssl_context 那一段之外, 也必須先按照 這篇 裡面的 openssl req ... 指令 產生自製的 ssl 憑證, 並且將兩個 *.pem 放到 ~/secret/ 。

是說從這幾天冷清的 log 檔看來, 我應該不太需要設密碼; 大家應該可以繼續用我的服務, 不必自架。 不知道該高興還是難過 :-)

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。