Discord Bot2023

YouTube Discord Bot

Discord Bot,自動追蹤 YouTube 頻道的最新影片和直播,並推送通知到指定頻道

YouTube Discord Bot

專案概述

一個使用 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