告別龐大的 discord.js:我如何打造零依賴的輕量 Discord 推播套件 ezdcbot
身為一名後端工程師,我們經常需要實作一些自動化的小工具,例如:
- 接收 Stripe 伺服器傳來的付費 Webhook,並把通知傳到團隊的 Discord 群組。
- 寫一個爬蟲排程,每天早上把最新的天氣預報發到頻道裡。
在過去,要做到這些事,大部分人的直覺反應都是:npm install discord.js。
但問題來了:如果你只是想「單向」地發送一則通知,或者只是想寫一個架設在 AWS Lambda 或 Vercel 等 Serverless 平台上的輕量腳本,殺雞真的需要用牛刀嗎?
開發痛點:我們不需要一整台卡車
discord.js 是一個非常強大、完整的生態系,但它為了維持與 Discord 之間的雙向即時通訊,底層實作了複雜的 WebSocket 連線,並且需要設定各式各樣的 Gateway Intents。
如果我的程式碼只是一支跑完就結束的無伺服器函數 (Serverless Function),這意味著我每次喚醒這支 API 都要:
- 載入龐大的
node_modules - 建立 WebSocket 連線
- 等待
client.on('ready') - 發送訊息
- 斷開連線
這無論是在啟動時間 (Cold Start) 還是開發體驗上,都顯得非常笨重。
因此,我決定自己動手,打造一款極致輕量、零第三方依賴 (Zero Dependency) 的推播專用套件:ezdcbot。
核心設計理念:極簡的 API
ezdcbot 的底層完全捨棄了 WebSocket,改用 Node.js 18+ 原生支援的 fetch,直接打向 Discord 官方的 REST API (v10)。打完就跑,沒有任何包袱。
為了讓其他開發者能「無腦使用」,我把整個套件的 API 縮減到只剩 3 個動作:
setup:初始化 Token。push:把東西丟進頻道。pull:把頻道裡的東西拿出來。
就這樣,沒了。
const bot = require("ezdcbot")();
// 1. 初始化
bot.setup("你的_BOT_TOKEN");
// 2. 發送訊息
await bot.push("頻道ID", "🚀 輕量推播成功!");
驚喜發現:把討論串 (Threads) 當成頻道來玩
在開發過程中,我原本還在思考要不要針對「發送討論串」、「讀取討論串」去新增各式各樣的函式。但我翻了 Discord 的官方 API 文件後,發現了一個非常聰明的底層設計:
在 Discord API 眼裡,討論串 (Thread) 就是一種比較特別的頻道 (Channel)。
這代表我完全不需要寫新的方法!只要你手上有討論串的 ID,你就可以直接把它當作頻道 ID 塞進 push 或 pull 裡面。
因此,ezdcbot 的使用變得異常優雅:
// 【情境一】無中生有建立一個新討論串
const thread = await bot.push("頻道ID", "今日進度回報", { type: "thread" });
// 【情境二】在剛剛建立的討論串裡面發言
await bot.push(thread.id, "大家早安!請在這裡回報今天的預計進度!");
// 【情境三】下班時,把討論串裡面大家的對話全部抓下來
const messages = await bot.pull(thread.id, 20);
你只需要用 { type: 'thread' } 來觸發第一步的「建立」,後續所有的讀寫操作都不需要改變寫法。這個設計不僅讓原始碼保持極簡,開發者的認知負擔也降到了最低。
真實應用情境:自動化小幫手
結合上面的特性,你可以輕易地用幾十行程式碼,在自己的伺服器上寫出一個每日自動化的「進度追蹤機器人」:
- 每天早上 9 點:用
push傳送包含精美顏色的 Embed 圖文卡片,跟大家說早安。 - 同時:用
{ type: 'thread' }幫當天的日期開一個專屬的討論串。 - 每天晚上 6 點:用
pull把該討論串裡大家回報的內容抓成 Array,丟給 ChatGPT 做重點摘要,然後再push回主頻道。
開源旅程才剛開始
這是我第一次將自己為了解決特定痛點而寫的程式碼,整理成完整的套件發布到 npm 上。
如果你剛好也在找一個輕量、不需要長連線的 Discord 發報工具,非常歡迎你來試用看看 ezdcbot!
🔗 GitHub 原始碼: liwenchiou/ezdcbot (如果對你有幫助,希望能獲得你的 Star 支持!🌟)
📦 npm 安裝: npm install ezdcbot
開發不僅僅是寫出會動的程式碼,更是創造工具來改善開發體驗的過程。希望 ezdcbot 也能成為你日常自動化小專案中的好幫手!
