2024年7月18日 星期四

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

2407 版的 tdx7984 "去坐巴士" 出爐囉! 終端使用者的 使用方式 沒有改變。 查詢 「經過某一站牌的所有路線」 希望有變快一點, 因為舊版要針對每一路線去呼叫 tdx 服務 (很傷我的點數!) 新版則是查詢靜態的資料庫, 而資料庫每天半夜才更新一次。 修了很多 bugs, 現在應該比較不容易當掉。 熱門 (有很多路線經過) 的站牌, 會出現好幾條路線都查不到 「下一站」 的資訊, 可能是因為我的會員等級太低, 所以後台一直出現 API rate limit exceeded 的錯誤訊息。 我只測試台北、台中、高雄; 光是這樣, 就已經看到不少資料不一致或不全的狀況, 甚至一個縣市自己內部的資料就互相打架, 例如台北市 221 號公車的 SubRouteUID, 有時叫做 TPE10415 有時叫做 TPE104150。

[ 給程式設計師看的: 舊版不時會停止服務, 所以 2407 版改成用 systemd 啟動, 以便可以用 cron 定時重啟服務。 為了避免用命列列參數指定敏感資訊的路徑 (tdx credential、 flask *.pem), 現在採用 configparser 處理設定檔。 所有的 print 也都改成 logging。 另外也加強 exception handler 的資訊, 方便除錯。 ]

安裝與啟動方式有較大改變, 本文詳述。 雖然我把程式碼放在系統的 /opt/tdx7984, 並且用 root 啟動服務, 但為了偷懶, 又還是把檔案所有人設成個人帳戶 ckhung 以便不需要 sudo 就可以直接執行 git 指令、 編輯檔案、 取得 tdx token 等等, 所以底下有些設定怪怪的, 例如用個人帳戶儲存 flask 的 *.pem; 大家看不慣的話可以自行更改。 (或者, 至少你必須把所有的 ckhung 改成你自己的 id)

我開兩個終端機分頁, 一個維持 ckhung 身份, 另一個 sudo bash 變身成 root, 經常切換身份做事。

  1. [root] mkdir -p /opt/tdx7984 /var/log/tdx7984 ; chown ckhung:ckhung /opt/tdx7984 /var/log/tdx7984
  2. [ckhung] git -C /opt clone git@github.com:g0v/tdx7984.git
  3. [ckhung] 請查看 /opt/tdx7984/tdx.ini 裡面的路徑設定。 如果剛剛你放置 tdx7984 的位置不是 /opt/tdx7984, 就要修改這裡, 還有 tdx7984.service。
  4. [ckhung] cd /opt/tdx7984 編輯 tdx-credential.sh 把 source /home/ckhung/private/config/bashrc 那一句改成你自己的 (私密) tdx API 金鑰檔路徑, 內容類似以下:
    export TDX_ID=XXXXXX-XXXXXXXX-XXXX-XXXX
    export TDX_SECRET=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
    export TDX_TOKEN_DIR=/home/ckhung/secret
    
  5. [ckhung] source tdx-credential.sh 並確認 $TDX_TOKEN_DIR 底下有出現一個包含 access_token 欄位的 json 檔 tdx-credential.json。
  6. [ckhung] 取得所有縣市站牌資訊、 產生 routes_stops.sqlite3 資料庫檔: source renew-stop-info.sh
  7. [ckhung] 單次測試: python3 tdx.py 台中市 151 應該要印出一個有點大的 json 陣列。
  8. [ckhung] 如果想採用 http, 就把 app.py 裡面的 ssl_context=... 那一句註解掉。 如果想採用 https, 就不要動那一句, 但是要按照 這篇 裡面的 openssl req ... 指令, 產生自製的 ssl 憑證, 並且將兩個 *.pem 放到 /home/ckhung/secret/ 。
  9. [root] ln -s /opt/tdx7984/tdx7984.service /usr/lib/systemd/system/
  10. [root] 啟動服務: systemctl start tdx7984 如果想要一開機就自動啟動服務: systemctl enable tdx7984
  11. [root] ln -s /opt/tdx7984/cron /etc/cron.d/tdx7984 cp /opt/tdx7984/cron /etc/cron.d/tdx7984 每天半夜 1 點停止服務、 3 點更新 tdx API token 並且更新縣市站牌資料庫、 5 點動啟服務。
  12. [root] ln -s /opt/tdx7984/logrotate /etc/logrotate.d/tdx7984 cp /opt/tdx7984/logrotate /etc/logrotate.d/tdx7984 每天對 log 檔做 rotate。
  13. 在瀏覽器裡查看: http(s)://localhost:7984/bus/rte/台中市/151

請大家回報 bugs 囉!

1 則留言:

  1. 呃, cron 跟 logrotate 都會檢查設定檔的擁有人, 如果不是 root, 就拒絕。 所以不可以用 ln -s ... 要用 cp ...

    回覆刪除

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