2018年1月20日 星期六

ptx 公共運輸整合資訊流通服務平台 bash 及 php 範例

[2023/7] 現在 ptx 已經被新的服務取代囉: 運輸資料流通服務 tdx

公車動態地圖去年中才知道這個好站: 交通部透過 公共運輸整合資訊流通服務平台 (PTX) 提供各種大眾運輸工具的時刻/路線/動態/...等等政府開放資料, 正好可以拿來實作我心目中理想的 具有運算思維的公車動態地圖。 最近終於有空, 用它重新寫好公車動態 geojson 查詢 (範例: 公車即時動態 geojson 文字檔之 臺中市 151 路 高雄市 100 路; 其他都市名稱請見 官網說明文件 第 4 頁; 原始碼)。 壞掉好久的 朝陽科大五路線公車動態地圖 終於又可以動了! 以下分享範例程式及注意事項給 php 程式設計師。 "

官網的範例程式碼 沒有 php 的範例; 會員 Benyi 所提供的 php 範例太進階了, 我的 php 很菜, 看到 OOP 跟一堆相依套件就手軟了啊~~ 改從 javascript 版範例程式著手, 先試出 bash 版範例, 然後很快就完成陽春簡單的 php 版範例。 幾個重點提示:

  1. 小量測試的話, 其實根本不需要申請帳號。 官網的 javascript 範例裡所採用的那組 (從頭到尾全部是 F 的) id 與 key 直接就可以用。 大量使用我就不知道了; 正式上線的版本, 我就套用自己的 key 跟 id。
  2. key 跟 id 是私密資料, 建議採用 這篇文章 "PHP Cookbook" 那一段的做法, 把 SetEnv PTX_ID "..."SetEnv PTX_KEY "..." 放在一個私密的檔案裡, 從 apache 的設定檔裡面去 include 它。
  3. 時間格式一定要轉成 GMT 而非臺灣時間 (GMT+8)。
  4. 要餵給 hmac 演算法的時間字串, 格式必須一模一樣, 不能少一個空白 (例如 "x-date:" 後面)、 多一個空白, 或有任何大小寫不同。
  5. 要傳給 http 伺服器的 "x-data:" 標頭, 大小寫都可以, 但冒號後面不能有空格。 搜尋不到詳細解釋的文章, 只能從一篇 資安攻防文 跟讀不懂的 RFC 7230 猜測這個嚴格的規定跟資安防護有關。 很多開發者都跟我一樣迷惑。
  6. 下一步就可以略讀官網的 PTX API URI Convention 說明文件, 測試更多 API 了。
  7. 在你的 apache2 伺服器的設定檔裡面 (/etc/apache2/sites-enabled/000-default.conf 之類的), 可能還需要設定 Header set Access-Control-Allow-Origin "*" 並且從命令列上 a2enmod headers ; systemctl restart apache2

又, 在 bash 底下測試時, 搜尋到一個好物: HTTPie:超爽的HTTP命令行客户端 httpie人性化curl工具使用详解。 雖然我只用到最簡單的 「設定 header」 功能, 但看起來未來如果需要處理更複雜的 http 通訊協定, 這真是個恩物啊!

9 則留言:

  1. 我有使用您的Code做開發
    昨天他們患了伺服器之後
    就一直403無法使用了
    想請問你有這個狀況嗎?

    回覆刪除
  2. 謝謝提醒! 修好了。 原來日期要寫兩位, 例如今天, 要寫 04 Feb 不能寫 4 Feb。

    回覆刪除
  3. 請問signature的格式是這樣嗎

    x-date: GMT時間 , APP KEY

    回覆刪除
    回覆
    1. 不是哦。 分別在兩個參數裡。 請執行 bash ptx-example.bash 會看到我的程式先印出 (除錯用的) http 指令, 類似這樣: + http GET 'http://ptx.transportdata.tw/MOTC/v2/Rail/TRA/Station?$top=5&$format=JSON' 'Authorization:hmac username="FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF", algorithm="hmac-sha1", headers="x-date", signature="QGrctgqxnyWAJjfUzc5GWPkViHY="' 'X-Date:Wed, 27 Feb 2019 09:06:10 GMT' 'Accept-Encoding:gzip, deflate' 也就是說, app key 寫在 Authorization: 那一段; 日期寫在 X-Date: 那一段。 X 是大寫, 冒號後面不能有空格。 超級龜毛的。 總之建議拿 bash 版的除錯輸出當作樣版。

      刪除
    2. 抱歉!我應該用圖片表達我的問題
      https://imgur.com/ybHZTRY

      刪除
    3. 請把 「文字」 那一段完整貼上來囉。 跟我上面貼的 'hmac username= ... X-Date:Wed, 27 Feb 2019 09:06:10 GMT' 很像的那一段。 用文字剪貼, 不要用貼圖的。 這個是什麼 app 啊?

      刪除
    4. 作者已經移除這則留言。

      刪除
    5. 這個app叫[捷徑]
      hmac username="變數A", algorithm="hmac-sha1", headers="x-date", signature="變數B"
      變數A是[APP ID]
      我想請問的是我把[x-data: GMT時間 , app key]這段經過SHA1和base64編碼
      EX:[x-date: Thu, 28 Feb 2019 04:42:00 GMT , FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF]加密成[ZmY3YmVmN2NkNWQ0ZDkyNTk5YjZhZjg5ZDA2MDNhODYwMGRiOWM1Yw==]
      後放到變數B後什麼會傳回HMAC signature does not match
      header的日期部分是沒問題的,問題在Authorization
      而且我的signature加密後會有很長的代碼

      刪除
    6. 不知道耶。 建議拿你的資料餵給我的 ptx-example.bash 測試, 先看是否能動, 再看中間的值跟你預期的結果有何不同。

      刪除

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