晚上七點,你還在開會,耳邊隱約傳來〈少女的祈禱〉。垃圾車來了——但你家巷口那個點,今天到底有沒有收?幾點到?這就是垃圾車查詢 skill 要解決的日常。baodao-skill 第一天就有它,但只支援台北市。今天把新北市補進來,順便把名字改老實。先講三個真實使用場景,再講背後的工程坑。
住板橋的小陳,週四晚上聽到音樂聲才想起垃圾還沒丟。以前他要衝下樓賭一把,現在他(或他的 AI)只要一句話:查新北市板橋區的清運點,看星期四有沒有收。
新北市的開放資料裡,每個清運點都直接標好 garbagemonday 到 garbagesunday、加上 recycling 開頭的一組星期欄位。所以查法很直接:
jq -r '.[] | select(.city=="板橋區" and .garbagethursday=="Y") | "\(.village) \(.name) \(.time)"' garbage_all.json | head -3
香社里 中正路341巷8弄口 19:00
香社里 中正路375巷30號 19:03
……
今天星期四,garbagethursday 是 Y,19:03 到巷口——小陳還有時間,垃圾袋還來得及拿。這個「今天有沒有收」的問法,是我翻欄位時發現這排星期欄位才做出來的。開放資料的好東西,真的要挖。
剛搬到永和的小美,連巷口在哪都還不認識,更別說垃圾車停哪。新北和台北的清運點資料都帶經緯度(字串型,算之前記得 tonumber),所以把她的座標丟進去,算距離排序:
jq -r --argjson la 25.008 --argjson lo 121.474 '
[.[] | . + {d: (((.latitude|tonumber)-$la)*((.latitude|tonumber)-$la) + ((.longitude|tonumber)-$lo)*((.longitude|tonumber)-$lo))}]
| sort_by(.d) | .[0:3][] | "\(.village) \(.name) \(.time)"' garbage_all.json
離她最近的三個點,連同停靠時間和地址一次列出來。搬家第一週最需要的資訊,不用問鄰居。
台北市的資料是 CSV(約 550KB),按里列出清運點和預計抵達時間。住大安區的人查「我這個里的點幾點來」就能直接過濾。這裡有兩個老陷阱:檔案開頭的 UTF-8 BOM 不看掉,第一個欄位名會多一個隱形字元,怎麼查都是空的;時間是 "1930" 這種 HHMM 字串,要自己轉成「19:30」才好讀。
場景講完,說背後的工程。新北市走 JSON API,很先進——直到我看到總筆數:26,655 列(2026-09-09 實測)。而且這個 API 分頁上限 10,000 列,size 寫多大都沒用,要老實抓三頁:
curl -s "https://data.ntpc.gov.tw/api/datasets/EDC3AD26-8AE7-4916-A00B-BC6048D19BF8/json?page=0&size=10000" -o garbage0.json
curl -s "https://data.ntpc.gov.tw/api/datasets/EDC3AD26-8AE7-4916-A00B-BC6048D19BF8/json?page=1&size=10000" -o garbage1.json
curl -s "https://data.ntpc.gov.tw/api/datasets/EDC3AD26-8AE7-4916-A00B-BC6048D19BF8/json?page=2&size=10000" -o garbage2.json
抓完 jq -s add 合併。這跟昨天桃園 YouBike 的 limit=20 是同一個教訓:API 回「有資料」不等於「全部資料」,總筆數一定要對。
還有一條寫進 SKILL.md 的誠實條款:這些都是計畫停靠時間,不是即時 GPS。颱風天或連假,實際收運以各市環保局公告為準,趕時間請看車尾燈。
功能做完,剩下命名。taipei-garbage 在新北進來的瞬間就變成謊言。repo 改名不難:目錄換掉、README 和 docs 連結更新、舊文件刪掉,三個 commit 解決。但「名字跟不上內容」的債放著不還,三個月後就會有人照著錯名字繼續寫。改名要趁早。
taipei-garbage 正式改名 taiwan-garbage:台北走 CSV、新北走 JSON API,兩萬六千多個清運點全收錄。可以回答「我家這個點今天有沒有收」、可以幫剛搬家的人找最近的清運點,台北新北都支援。實測日期照慣例寫進文件:2026-09-09。