
專案概述
一個使用 discord.js v14(ES Modules)與 Node.js 開發的自動化 Discord 機器人,監控已訂閱的 YouTube 頻道並將新影片及直播通知推送到指定的 Discord 頻道。支援排程爬取(每小時整點和半點)、手動觸發、即將開播提前通知(附用戶 tag),以及完整的 Slash Command 管理介面。MongoDB 記錄推播歷史,防止重複通知。
技術挑戰與解決方案
YouTube 爬蟲穩定性
YouTube 頁面由 JavaScript 渲染,純 HTTP 爬取不穩定;但重度使用 Puppeteer 又慢且耗資源。
解決方案:
實作雙重爬蟲策略:node-fetch + Cheerio 作為快速主要爬蟲,Puppeteer 作為需要 JS 渲染時的備用方案。在保持高效能的同時確保爬取可靠性。
重複推播防止
機器人必須不重複通知已推播的內容,即使在服務重啟後也要有效。
解決方案:
使用 Mongoose 將每個已通知的影片/直播 ID 儲存至 MongoDB。每次爬取週期前先查詢已推播 ID,比對後才決定是否發送 Discord 訊息。
即將開播提前通知
用戶希望在直播開始前就收到預先通知,而不只是直播上線當下才推播。
解決方案:
新增排程預播前檢查功能,讀取直播的預定開始時間,在直播開始前的可設定時間間隔提前發送附有 tag 的 Discord 通知給訂閱用戶。
系統架構

純 ES Module 的 Node.js 架構,採用 discord.js v14 Slash Command API。雙爬蟲策略結合 node-fetch + Cheerio(主要快速爬蟲)和 Puppeteer(JS 渲染後備方案)。PM2 管理程序生命週期與排程重啟。MongoDB(Mongoose ODM)按頻道儲存推播歷史。支援 Docker 容器化部署。
學習與心得
這個專案深化了我對 discord.js v14 現代 Slash Command API 的理解,以及針對 JavaScript 動態渲染頁面的多重爬蟲策略設計。處理跨重啟的重複推播去重,以及建立可維護的指令結構,都是非常有價值的學習。
技術棧
核心技術
Node.jsDiscord.js v14JavaScript (ES Modules)
爬蟲技術
node-fetchCheerioPuppeteer
資料庫
MongoDBMongoose
部署管理
PM2Docker