今日學習目標
今天的目標是讓昨天建立好的 Discord Bot 真正連線到 Discord,並完成第一個 Slash Command。
今天主要完成:
使用 .env 儲存 Discord Bot Token
使用 dotenv 讀取環境變數
成功登入 Discord Bot
將 Bot 加入測試伺服器
設定 Application ID
註冊第一個 Slash Command /ping
讓 Bot 收到 /ping 後回覆 Pong!
一、讓 Bot 成功登入 Discord
昨天已經先建立好 Discord Bot,今天先讓 Node.js 程式真正登入這個 Bot。
我先在 .env 裡放入 Discord Bot Token:
DISCORD_TOKEN=我的Bot Token
接著在 index.js 中使用:require("dotenv").config();
這行會讓 dotenv 讀取 .env 裡的資料,並放進 Node.js 的 process.env。
所以後面就可以用:
process.env.DISCORD_TOKEN
取得 Token。
最後再用:
client.login(process.env.DISCORD_TOKEN);
讓程式用 Token 登入 Discord。
執行:
npm start
成功後 Terminal 顯示:
Bot 已登入:Calendar Bot#5204
代表 Bot 已經成功使用 Token 通過 Discord 驗證並連線。
二、把 Bot 加入測試伺服器
Bot 成功登入 Discord,並不代表它已經加入我的 Discord 伺服器。
所以接下來需要進入 Discord Developer Portal進行一些設定。
進入:
OAuth2
→ URL Generator
勾選:
bot
applications.commands
接著設定 Bot 的基本權限:
檢視頻道
傳送訊息
使用斜線指令
接著複製系統產生的 OAuth2 URL,開啟並授權授權後,Discord 會成功顯示「Calendar Bot 剛剛著陸下來」
代表 Bot 已經正式並成功加入測試伺服器了。
三、加入 Application ID
接下來建立 Slash Command,因此除了 Token 之外,還需要知道這個指令是屬於哪一個 Discord Application。
所以到 Discord Developer Portal:一般資訊 → 應用程式 ID複製 → Application ID。
接著在 .env 裡加入第二個環境變數:
CLIENT_ID=我的Application ID
這兩個資料用途不同。
DISCORD_TOKEN 是用來證明 Bot 的身分並登入 Discord。
CLIENT_ID 是用來指定我要替哪一個 Discord Application 註冊指令。
四、建立第一個 /ping 指令
/ping 並不是這個專題最後真正要用的功能,而是先拿來測試整個 Discord Slash Command 流程有沒有正常運作。
我建立了一個 deploy-commands.js 檔案。
它的主要工作是告訴 Discord:
Calendar Bot 有一個叫做 /ping 的指令。
主要程式如下:
require("dotenv").config();
const { REST, Routes, SlashCommandBuilder } = require("discord.js");
const commands = [
new SlashCommandBuilder()
.setName("ping")
.setDescription("測試機器人是否正常運作")
.toJSON(),
];
const rest = new REST({ version: "10" }).setToken(
process.env.DISCORD_TOKEN
);
(async () => {
try {
console.log("開始註冊 /ping 指令...");
await rest.put(
Routes.applicationCommands(process.env.CLIENT_ID),
{ body: commands }
);
console.log("/ping 指令註冊成功");
} catch (error) {
console.error(error);
}
})();
完成後在 Terminal 執行:
node deploy-commands.js
這一步是在把 /ping 註冊到 Discord。
五、讓 Bot 收到 /ping 後回覆
Discord 雖然已經知道這個指令存在,但 Node.js 還不知道收到 /ping 之後要做什麼。
所以需要在 index.js 加入:
client.on("interactionCreate", async (interaction) => {
if (!interaction.isChatInputCommand()) return;
if (interaction.commandName === "ping") {
await interaction.reply("Pong!");
}
});
流程是:
Discord 收到操作
↓
觸發 interactionCreate
↓
確認是不是 Slash Command
↓
判斷指令名稱是不是 ping
↓
回覆 Pong!
六、重新測試
先control + c 停止先前程式的運作
接著使用npm start確認是否還能連到
成功後回到 Calendar Bot 測試伺服器。
我在對話匡輸入/ping bot 也有成功回傳Pong!代表成功。