前言:一個懶惰的想法
約莫今年三月份(2025-03)的事情,和同事閒聊時有談到最近他訂閱了華爾街日報的消息。
並且每日也會寄送報紙版本的華爾街日報到信箱來,但是每日看完一份報紙對於一個上班族工程師來說是個奢侈的妄想,或許對現代人來說都是。
如果能有更簡短的重點資訊和摘要,應該會對日常接收資訊上有所幫助。甚至可以進一步過濾出有用的資訊就更好了。
所以當下決定搞起這份專案。
核心概念很簡單,就是
從下載《華爾街日報》(WSJ) 的每日 PDF 報紙,利用 Google Gemini AI 進行深度分析與摘要,最終將精美的 HTML 格式報告透過 Email 發送給訂閱者。
實作:細節往往比想像中更多
在規劃時,早期的版本由於華爾街日報的連結都是固定的。所以很簡單就可以爬取到資料,甚至根本不需要登入的 session ,只要知道連結,就可以看到報紙。
但很不幸的,約莫四月中,華爾街日報剛好打算將這功能收斂。現在會綁定有訂閱帳號者的 session 。
所以我們需要多維護一份 cookie ,去維持 session 的存活。
再來,還有微調 gemini 每次回傳的格式內容要是固定且符合預期的格式,在這方面上也嘗試了許多不同的 prompt engineering 的細節。
還有 system_instruction 上的 prompt design 。
最後還有一些訂閱信件者的 api 還有 web 介面,這部分決定簡單做在 cloudflare worker 上。
會有訂閱連結、取消訂閱連結、重新訂閱之類的流程該如何設計。
細節:防止訂閱者中出現 cracker
- 在取消訂閱的連結上,為了有效預防訂閱連結外流出去以後,可能會吸引到一些 cracker 去惡意退訂閱別人的電子報。所以需要一些 token 的機制 (去將 email, expires, secret 去做 hash)。
細節: ci/cd 建置
- 搭建在自己的 server 上,透過串接 github action ,介接 local machine 的 action runner (透過 docker),來實作自動化部署。
細節: Cookie daemon 要留存哪些項目
- 觀察 SSO cookie 的需要項目,以維持可用的登入憑證。
細節: sql & storage service for free
- 目前採用 cloudflare 的
D1 SQL還有R2 storage service來作為 mail list 和 pdf file 的儲存區。
細節: 機敏資訊的防護
- 在 mail list 的處理上,又區分為讀取和寫入。寫入就是訂閱電子報的功能,所以 worker api 會是開放對外,僅設置簡單的 invite_code 機制還有區域性防火牆阻擋(台灣)。讀取 mail list 則會比較需要被保護,防火牆規則上採用 ip 限制和 api_key 機制。
細節: hosting mail server
- 目前採用自己建立的 mail server 去發信(僅打算給周遭親友訂閱),所以要注重垃圾信件分數還有一堆驗證 header(SPF, DKIM, DMARC, BIMI)。
總結
簡而言之,大概要顧及以下項目的實作,這項系統才算完整。
- cron job 1: Cookie renew
- 你需要讓程式的行為很像人類(crontab 執行時間不能每天都完全一致、觸發 cookie renew 的 web URL 也須保持不一樣的連結)
- 同時他是 SSO 登入機制,我想你會需要維護多種 domain 的 cookie
sso.accounts.dowjones.comwww.wsj.com.wsj.com
- cron job 2: 本體
- 查看 gmail 有無當日信件
- parsing 正確連結
- 夾帶被維護的 cookie (from cron job 1) 去取得正確的 PDF file
- upload to R2
- sending gemini api, get html response
- system_instruction(prompt design), 穩定的 html response(prompt eengineeringng)
- 信件組裝 render
- 寄送信件
- 訂閱信件 endpoint
- 退訂信件 endpoint
- pdf 內容線上調閱 endpoint
實作細節如上,但避免法律問題,我就不開放給大家訂閱惹。畢竟前陣子台灣的七法公司案件,讓我怕到不敢貿然開放訂閱。
此篇文章僅限技術上的分享,切記不要犯法去當內容剽竊者。
在未來的世界當中,我相信最有價值的就是資訊內容,但很可惜的是現在也是最沒有價格機制可以去完善保護的部分。
最後,以上皆可自行 vibe coding 去執行。費用基本上只有租賃 domain 的成本。
還有需要有一個機器可以去跑 cron tab,但這可以考慮採用在爪雲的 container 平台上架 n8n 去解決 (https://run.claw.cloud/)。