第一週過完了。先盤點:repo 裡躺著八個 skill——統一發票、CWA 天氣、YouBike、垃圾車(台北、新北、台中)、國定假日、台股行情、郵遞區號英譯,release 從 v0.1.0 走到 v0.4.2,CHANGELOG 寫到了 0.5.0。
但這篇回顧不想數做了什麼。想數的是這週踩過的雷。因為 Day 1 定的規則裡有兩條——「實測過才收錄」「踩雷照實寫」——一週下來我才真正搞懂它們的份量:keyless 的意思不是「沒有鑰匙」,是每一扇門你都得自己敲過,才知道門後是資料還是坑。
以下是本週實測出土的地雷圖鑑。
台中垃圾車資料,拿資料集 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。
台北垃圾車 CSV 開頭有 UTF-8 BOM。不去掉就比對欄位名,第一欄永遠對不上,而且錯得無聲無息——查詢結果不報錯,只是永遠是空的。空結果也是一種錯誤訊息。
人事總處的 CSV 是 CRLF 行尾。awk 比對最後一欄「備註」之前不先去掉 \r,「補行上班」永遠比對不上「補行上班\r」。又是無聲的失敗。
新北垃圾車 JSON API,一頁上限 10,000 列,不帶 page 參數就只拿第一頁。全量 26,655 列(2026-09-09 實測),少抓兩頁就是少了六成資料,而且看起來完全正常。
YouBike 統一 feed 在本機、在台灣都正常,在 GitHub Actions 上被 Incapsula 整排擋掉——不是 API 掛了,是 CI 的 IP 段信譽問題。同一段程式碼、同一支 API,換個 IP 就是兩個世界。「在我機器上可以」這句話,從此要加上「從這個 IP 可以」。
政府資料平台的資源 rid 會不定期更換,今天能下的網址明天可能 404。所以每個 skill 的錯誤處理章節都寫了同一件事:404 的時候回資料集頁面重新解析連結,不要把舊網址當成永恆。
國定假日最後用了兩條完全獨立的路徑——結構化 CSV 和官方 xlsx 月曆的粉紅格子——365 天逐日比對完全一致,才敢寫「已驗證」。一個來源叫資料,兩個一致的來源才叫證據。
地雷圖鑑攤開來看,每一條都長成 Day 1 規則的樣子。「實測過才收錄」現在具體到:每個指令後面都標實測日期,因為資料源是活的,會變、會換、會過期。「踩雷照實寫」變成每個 skill 都有錯誤處理章節,把這週這些雷一顆一顆標回去。
keyless 這條路走一週的心得:它不只是「裝了就能用」的方便,還有一個意外的好處——沒有金鑰,就沒有金鑰外洩的問題,文件可以整本公開,指令可以整段貼上來給讀者自己跑。透明本身就是一種功能。
一週每天一篇,說不累是騙人的。但看著 repo 從一個 README 長成八個 skill、文件上每個指令都有實測日期,這種踏實感大概是日更最好的報酬。