先講結論:baodao-skill 現在會對發票了。invoice-winning-numbers 從財政部電子發票整合服務平台抓最新中獎號碼,丟給它一串 8 碼就知道有沒有中。免金鑰、免登入,curl 就抓得到。
統一發票對獎大概是台灣最全民的開獎活動,兩個月一次,特別獎一千萬。這種「人人都用得到」的功能,當然要收進來。頁面本身很單純:https://invoice.etax.nat.gov.tw/lastNumber.html ,2026-09-09 實測 HTTP 200、約 20KB,連 User-Agent 都不用裝。
但對獎對錯比沒對還糟,這個頁面有兩個真正的陷阱。
第一個:中獎號碼在原始碼裡是被 HTML 標籤切開的。頭獎 07225810 在 HTML 裡長這樣:072</span><span ...>25810。如果把標籤取代成空白再取數字,號碼會碎成 072、258、10 三段,對獎全滅;直接對原始 HTML 下正則也會漏。解法很暴力但有效:把標籤「整個刪掉」取代成空字串,讓碎片黏回去,再取 8 碼。
第二個更陰:頁面上的「領獎期間」會說謊。9/9 實測時,最新號碼單已經是 115 年 05-06 月期,但頁面殘留的「領獎期間自 115 年 06 月 06 日起至 115 年 09 月 07 日止」是上一期(03-04 月)的。直接配對,就會跟使用者說一個已經過期的領獎期限。規則只能這樣寫:領獎期間只引用跟期別標籤同一個區塊的文字;取不到就依「開獎日次月 6 日起算 3 個月」推算,並請使用者回官網確認。
還有一個結構上的冷知識:雲端發票專屬獎的中獎號碼不在 HTML 裡,是每個獎別一份 PDF 清單,要另外解析。
對獎邏輯本身是八碼一路往末碼比:全同看特別獎、特獎,再對每組頭獎比 8 碼,沒中退到末 7 碼(二獎)、末 6 碼(三獎)一路到末 3 碼(六獎、兩百元)。一張中多個獎只能領一個,回報挑最高的。批次對獎的 python 一併收在 skill 裡。
當期實測(115 年 05-06 月期):特別獎 19531471、特獎 85941329、頭獎 07225810/20231230/83518781 三組完整取出。民國年換算就是西元年減 1911。
這個 skill 教會我的事:政府網站的資料是對的,但排版是給人看的不是給程式看的。對獎這種錢的事,每個環節都要實測過才敢寫進文件。