iT邦幫忙

2026 iThome 鐵人賽

DAY 7
0
自我挑戰組

30 天養大一個開源專案:baodao-skill 從零開始系列 第 7

【Day 7】第一週回顧:八個 skill,和一張政府資料的地雷圖鑑

  • 分享至 

  • xImage
  •  

第一週過完了。先盤點:repo 裡躺著八個 skill——統一發票、CWA 天氣、YouBike、垃圾車(台北、新北、台中)、國定假日、台股行情、郵遞區號英譯,release 從 v0.1.0 走到 v0.4.2,CHANGELOG 寫到了 0.5.0。

但這篇回顧不想數做了什麼。想數的是這週踩過的雷。因為 Day 1 定的規則裡有兩條——「實測過才收錄」「踩雷照實寫」——一週下來我才真正搞懂它們的份量:keyless 的意思不是「沒有鑰匙」,是每一扇門你都得自己敲過,才知道門後是資料還是坑。

以下是本週實測出土的地雷圖鑑。

地雷一:HTTP 200 也可能是失敗

台中垃圾車資料,拿資料集 id 直接打 API,回傳 HTTP 200,內容是 {"success":false,"code":401,"s_message":"NO_AUTH"}。狀態碼是綠的,內容是紅的。正解是走資源 rid 的 no-auth 下載路徑。學到的:判斷成功與否要看 body,不是看 status code。

地雷二:編碼每個檔案不一樣

人事總處的日曆 CSV,115 年、116 年是 UTF-8 含 BOM,114 年更新版是 Big5。同一個資料集、同一個頁面、不同的編碼。無腦用 UTF-8 解,「西元日期」四個字直接變亂碼。現在的鐵則:先 file 看編碼,再決定要不要 iconv。

地雷三:BOM 會吃掉你的第一個欄位

台北垃圾車 CSV 開頭有 UTF-8 BOM。不去掉就比對欄位名,第一欄永遠對不上,而且錯得無聲無息——查詢結果不報錯,只是永遠是空的。空結果也是一種錯誤訊息。

地雷四:CRLF 讓字串永遠差一個字

人事總處的 CSV 是 CRLF 行尾。awk 比對最後一欄「備註」之前不先去掉 \r,「補行上班」永遠比對不上「補行上班\r」。又是無聲的失敗。

地雷五:分頁預設只給你第一頁

新北垃圾車 JSON API,一頁上限 10,000 列,不帶 page 參數就只拿第一頁。全量 26,655 列(2026-09-09 實測),少抓兩頁就是少了六成資料,而且看起來完全正常。

地雷六:你的 IP 也是環境的一部分

YouBike 統一 feed 在本機、在台灣都正常,在 GitHub Actions 上被 Incapsula 整排擋掉——不是 API 掛了,是 CI 的 IP 段信譽問題。同一段程式碼、同一支 API,換個 IP 就是兩個世界。「在我機器上可以」這句話,從此要加上「從這個 IP 可以」。

地雷七:下載連結會換

政府資料平台的資源 rid 會不定期更換,今天能下的網址明天可能 404。所以每個 skill 的錯誤處理章節都寫了同一件事:404 的時候回資料集頁面重新解析連結,不要把舊網址當成永恆。

地雷八:單一來源不可信

國定假日最後用了兩條完全獨立的路徑——結構化 CSV 和官方 xlsx 月曆的粉紅格子——365 天逐日比對完全一致,才敢寫「已驗證」。一個來源叫資料,兩個一致的來源才叫證據。

回收 Day 1 的規則

地雷圖鑑攤開來看,每一條都長成 Day 1 規則的樣子。「實測過才收錄」現在具體到:每個指令後面都標實測日期,因為資料源是活的,會變、會換、會過期。「踩雷照實寫」變成每個 skill 都有錯誤處理章節,把這週這些雷一顆一顆標回去。

keyless 這條路走一週的心得:它不只是「裝了就能用」的方便,還有一個意外的好處——沒有金鑰,就沒有金鑰外洩的問題,文件可以整本公開,指令可以整段貼上來給讀者自己跑。透明本身就是一種功能。

一週每天一篇,說不累是騙人的。但看著 repo 從一個 README 長成八個 skill、文件上每個指令都有實測日期,這種踏實感大概是日更最好的報酬。


上一篇
【Day 6】辛辛苦苦解析完 xlsx,才發現官方 CSV 早就躺在那裡
系列文
30 天養大一個開源專案:baodao-skill 從零開始7
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言