# 使用 Discord.js v14 開發全能Discord機器人 | Ep.2 官方範例操作 :::info 這個系列會帶著您通過Node.js中的Discord.js套件,從0到1開始製作屬於自己的Discord機器人,希望可以幫助大家成為機器人的開發者哦! ::: ## 前言 這篇文章將帶著大家從[Discord.js 官方範例](https://discord.js.org/#/docs/discord.js/main/general/welcome)開始了解Discord.js的撰寫方式,並讓機器人上線運作! 此文採取之範例取自Discord.js官方文檔: https://discord.js.org/#/docs/discord.js/main/general/welcome ## 前置工作 首先,我們要準備好寫機器人的資料夾與檔案。 ### Step. 1 建立資料夾 建立一個用於製作機器人的資料夾,並在程式編輯器中開啟,下圖為VSCode中的開啟方法,開啟檔案頁籤後點按 `開啟資料夾` ![](https://i.imgur.com/8ZB5Z3l.png) ### Step. 2 安裝套件 接著開啟終端機,VSCode的開啟方法如下,開啟終端機頁籤並點按 `新增終端` *NOTE: 若終端機的路徑不是機器人的資料夾,請在終端機輸入 `cd 要切換到的資料夾` ,可以是絕對路徑或相對路徑* ![](https://i.imgur.com/82cKR9F.png) 在終端機內輸入下方指令,用於安裝 `discord.js` npm套件,用於編寫機器人 ``` npm install discord.js ``` ![](https://i.imgur.com/XhH5gEk.png) 若成功安裝,您將會發現資料夾中多了許多檔案或資料夾,說明如下: | 檔案或資料夾名稱 | 用途 | | ----------------- | ------------------------ | | package.json | 紀錄專案中使用的所有套件 | | package-lock.json | 鎖定使用套件的版本 | | node_modules | 下載的套件將會存放其中 | ### Step. 3 建立檔案 然後在機器人的資料夾中新增兩個檔案,分別是 `deploy.js` 和 `index.js`,deploy意即「部署」,是讓機器人用來註冊斜線指令的檔案,而index意味著索引,即是機器人的主程式 此時,資料夾中應為如此配置 ![](https://i.imgur.com/ev0K37O.png) 恭喜您完成前置的準備工作囉!接下來就要編寫程式了 ## 範例學習 官方範例如同剛剛所述,分為註冊指令的檔案以及主程式,將會一行一行向各位解析含意。 ### 註冊斜線指令 deploy.js #### 官方範例 ```javascript= const { REST, Routes } = require('discord.js'); const commands = [ { name: 'ping', description: 'Replies with Pong!', }, ]; const rest = new REST({ version: '10' }).setToken('token'); (async () => { try { console.log('Started refreshing application (/) commands.'); await rest.put(Routes.applicationGuildCommands(CLIENT_ID, GUILD_ID), { body: commands }); console.log('Successfully reloaded application (/) commands.'); } catch (error) { console.error(error); } })(); ``` #### 程式解析 ```javascript=1 const { REST, Routes } = require('discord.js'); ``` 這行程式碼是引入discord.js中向Discord發送請求並註冊斜線指令的套件,require意即要求 ```javascript=3 const commands = [ { name: 'ping', description: 'Replies with Pong!', }, ]; ``` 這段程式碼是將機器人的指令儲存於一個清單內,並用於之後註冊 ```javascript=10 const rest = new REST({ version: '10' }).setToken('token'); ``` 此行程式碼將會建立一個新的REST,其中`.setToken('token')`中的token需替換為自己的機器人Token,獲取方式如下: 1. 進入上篇教學曾提到的 [Discord Developer Portal](https://discord.com/developers/applications) 網址:https://discord.com/developers/applications 2. 開啟自己的機器人應用程式,並選擇 `Bot` 頁籤 ![](https://i.imgur.com/4z3jg5N.png) 3. 頭像旁有一欄位為 `TOKEN` ,點擊藍色的 `Reset Token` 按鈕 ![](https://i.imgur.com/RnXsXQ8.png) 4. 接著會看到這個提示框,提醒您若您的機器人正在運作中更換Token將會終止運作,直到您替換程式碼中的Token,請點擊 `Yes, do it!` 進行確定 ![](https://i.imgur.com/tDm4PGn.png) 5. 此時您會看到一長串的英語、數字與符號的組合,這就是您的機器人Token,點擊 `Copy` 即可複製 :::danger 此Token請勿向他人洩漏,若他人持有機器人Token將可操作機器人進行任何行為,務必謹慎保管 ::: ```javascript=12 (async () => { try { console.log('Started refreshing application (/) commands.'); await rest.put(Routes.applicationGuildCommands(CLIENT_ID, GUILD_ID), { body: commands }); console.log('Successfully reloaded application (/) commands.'); } catch (error) { console.error(error); } })(); ``` 這段程式碼是用來進行註冊斜線指令的動作,將會嘗試向Discord API發送註冊斜線指令「至指定伺服器」的請求,若成功會在控制台發送成功註冊的訊息,若失敗則會發送錯誤內容。 其中的 `CLIENT_ID` 需改成自己機器人的CLIENT_ID(在 [Discord Developer Portal](https://discord.com/developers/applications) 中的機器人應用程式 > OAuth2 > General) ![](https://i.imgur.com/5Nx2s43.png) 【複製的CLIENT_ID在程式碼中需為字串,因此需用引號包裹,例:"935330155109445730"】 `GUILD_ID` 需改為要註冊指令的伺服器ID,取得方式如下 1. 開啟 [Discord](https://discord.com/channels/@me),並從左下角的個人名稱右側開啟 `使用者設定` 2. 向下滑動並找到「應用程式設定 > 進階」 ![](https://i.imgur.com/mAj6HGS.png) 3. 開啟「開發者模式」 ![](https://i.imgur.com/jRgP5A4.png) 4. 關閉設定回到Discord頁面,對要複製ID的伺服器點擊右鍵 ![](https://i.imgur.com/w9Dz5F0.png) 5. 最下方的按鈕為「複製ID」,點擊後即可複製伺服器ID 【複製的GUILD_ID在程式碼中需為字串,因此需用引號包裹,例:"935330155109445730"】 #### 但有些機器人的指令所有伺服器皆可看到,是一個一個註冊的嗎? 有些機器人會將斜線指令註冊為「全域指令」,凡是註冊即可在任何授予機器人斜線指令功能的伺服器中註冊,不需將所有伺服器逐個註冊! 方法也非常簡單,將上述程式碼的第16行 ```javascript=16 await rest.put(Routes.applicationGuildCommands(CLIENT_ID, GUILD_ID), { body: commands }); ``` 改為如下所述即可,而因為是全域指令,因此不需GUILD_ID,所以省略 ```javascript=16 await rest.put(Routes.applicationCommands(CLIENT_ID), { body: commands }); ``` #### 實際執行 要執行剛剛寫好的程式碼,請存檔後在終端機輸入此指令 ``` node deploy.js ``` node是用於執行node.js程式碼,而deploy.js即為要執行的檔案名稱 ![](https://i.imgur.com/eiVstFA.png) 若成功註冊終端機將會呈現這兩行文字,在Discord輸入/,即會發現機器人已經有了註冊的斜線指令 ![](https://i.imgur.com/epquB0E.png) 目前機器人的斜線指令還是無法運作的,需要有了運作機器人的程式碼來回應指。 ![](https://i.imgur.com/wEu8O6o.png) 接下來,我們要讓機器人可以接收這個指令並運作! ### 運作機器人 index.js #### 官方範例 ```javascript= const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [GatewayIntentBits.Guilds] }); client.on('ready', () => { console.log(`Logged in as ${client.user.tag}!`); }); client.on('interactionCreate', async interaction => { if (!interaction.isChatInputCommand()) return; if (interaction.commandName === 'ping') { await interaction.reply('Pong!'); } }); client.login('token'); ``` #### 程式解析 ```javascript=1 const { Client, GatewayIntentBits } = require('discord.js'); ``` 此行程式碼引入了discord.js套件中我們所需的功能,Client是用於偵測並處理事件,而GatewayIntentBits用於得知所需指定意圖的代碼 ```javascript=2 const client = new Client({ intents: [GatewayIntentBits.Guilds] }); ``` 這行程式碼定義了client,並告訴Discord我們所需的意圖,讓我們在後續可以偵測事件的發生或處理 ```javascript=4 client.on('ready', () => { console.log(`Logged in as ${client.user.tag}!`); }); ``` 這段程式碼是偵測ready事件的發生,ready事件發生在機器人登入成功並上線時,因此我們會讓機器人在控制台紀錄上線成功 ```javascript=8 client.on('interactionCreate', async interaction => { if (!interaction.isChatInputCommand()) return; if (interaction.commandName === 'ping') { await interaction.reply('Pong!'); } }); ``` 此段程式碼偵測interactionCreate事件的發生,interactionCreate是指指令創建,而此事件不僅會發生在斜線指令使用時,還會發生在其餘任何形式的指令,像是按鈕 由於許多情境會造成interactionCreate觸發,因此在第9行,「若指令不是斜線指令便不做處理直接跳出」 若是斜線指令則會進行後續處置,第11-13行,「若指令名稱是ping,就對指令回覆Pong!」 ```javascript=16 client.login('token'); ``` 這行程式碼會讓機器人登入,token需替換為機器人token(前一段落有提及獲取方法) #### 實際執行 完成程式碼後且存檔後一樣使用node.js,並在終端機輸入指令運行index.js ``` node index.js ``` 若成功運行控制台將會顯示此字樣 ![](https://i.imgur.com/mVE8VWn.png) 此時您的機器人將會成功上線! ![](https://i.imgur.com/0TKJx5C.png) 接著在聊天室輸入 `/ping` 並送出,如果機器人回覆Pong!就成功囉! ![](https://i.imgur.com/vx1xxIB.png) (若要關閉機器人請在控制台按下 `Ctrl + C`,且當您關閉電腦或停止運行程式碼機器人即會下線,後續將會帶著各位讓機器人24/7上線!) ## 總結 這篇教學帶著大家從官方的範例程式碼,學習製作屬於自己的機器人,並成功第一次上線,恭喜各位製作出了屬於自己的機器人!接下來的文章將會讓各位製作更多更有趣的功能,盡請期待! ###### tags: `Node.js` `Discord.js`