iT邦幫忙

2026 iThome 鐵人賽

DAY 9
0
自我挑戰組

30 天養大一個開源專案:baodao-skill 從零開始系列 第 9

【Day 9】統一發票對獎:被 HTML 切開的中獎號碼,和過期的領獎期間

  • 分享至 

  • xImage
  •  

先講結論: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 教會我的事:政府網站的資料是對的,但排版是給人看的不是給程式看的。對獎這種錢的事,每個環節都要實測過才敢寫進文件。


上一篇
【Day 8】授權碼到手:中央氣象署預報實測,和一個假裝有用的參數
下一篇
【Day 10】台股行情不用 key:兩個證交所主機,和慢半天的 openapi
系列文
30 天養大一個開源專案:baodao-skill 從零開始15
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言