先講結論:cwa-weather 終於從「文件上寫著可以用」變成「實際打過、回來是真的」。2026-09-14 實測,臺北市白天多雲短暫陣雨,降雨機率 30%,25 到 30 度,舒適至悶熱。這串文字不是文件截圖,是 API 真的回來的東西。
baodao-skill 的天氣分兩層:免金鑰的 taiwan-weather(Open-Meteo 預報 + NCDR 警特報)先上場,中央氣象署的正式預報則一直掛著「需要授權碼」的牌子。第一週收尾,終於把這塊補上。
申請本身不難:到 opendata.cwa.gov.tw 註冊會員,登入後「會員專區」就有授權碼,免費、即時發給。只有一個小地雷:註冊和登入都掛著 Cloudflare Turnstile 人機驗證,這站對自動化非常不友善,乖乖手動。沒帶授權碼硬打 API 會吃 401:Authorization key is not correct.(9/9 就實測過這句錯誤訊息,今天是終於不用再看它了。)
36 小時預報 F-C0032-001 一次過:
curl -sm 30 'https://opendata.cwa.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=<授權碼>&locationName=臺北市'
回來的 JSON 結構跟官方文件寫的一模一樣:Wx、PoP、MinT、MaxT、CI 五個欄位各三個時段,locationName=臺北市 確實只回臺北。看到 success:true 的時候還想說,這麼順?
然後就踩到今天的雷。
鄉鎮逐區預報 F-D0047(臺北市是 F-D0047-061)一樣帶上 locationName=大安區,結果回來的是臺北市全部 12 個區、574KB 的 JSON。參數完全被無視,文件上寫著支援,這個系列根本不過濾。昨天才整理完第一週的地雷圖鑑,今天立刻新增一筆。
解法很簡單,拿回來自己篩:
jq -r '.records.Locations[0].Location[] | select(.LocationName=="大安區")'
skill 文件已經改寫:F-D0047 的範例換成 client-side jq 篩選,CHANGELOG 記 0.5.1。這就是為什麼這個專案的第一條規則是「實測過才收錄」——文件會說謊,curl 不會。