如今,機器人被用來自動化各種任務。 自亞馬遜的Alexa設備發布以來,圍繞自動化機器人的炒作才剛剛開始增長。 除了Alexa,其他通信工具(例如Discord和Telegram)還提供API以開發自定義機器人。
本文僅專注於使用公開的Discord API創建第一個機器人。 也許最著名的Discord機器人是Music Bot。 音樂漫遊器可以讓您鍵入歌曲名稱,並且漫遊器會將新用戶附加到播放所請求歌曲的頻道上。 它是年輕人在遊戲或流媒體服務器上的常用機器人。
讓我們開始創建一個自定義Discord機器人。
本文已於2020年更新。要了解更多有關Node的信息,請查看 Node.js Web開發.
條件:
- 已安裝Node.js v10或更高版本(基本知識)
- Discord帳戶和Discord客戶
- 使用終端的基本知識
步驟1:設置測試服務器
首先,我們需要一個測試服務器,以後可以在其上測試Discord機器人。 我們可以通過單擊屏幕左側的加號圖標來創建新服務器。
將顯示一個彈出窗口,詢問您是否要加入服務器或創建新服務器。 當然,我們要創建一個新服務器。
接下來,我們需要輸入服務器的名稱。 為簡單起見,我將服務器命名為 discord_playground
。 如果需要,可以根據您所在的位置更改服務器位置,以實現更好的ping操作。
如果一切順利,您應該會看到新創建的服務器。
第2步:生成身份驗證令牌
當我們想通過代碼控制我們的機器人時,我們需要先在Discord帳戶下註冊該機器人。
要註冊機器人,請轉到 Discord開發人員門戶 並使用您的帳戶登錄。
登錄後,您應該能夠看到儀表板。 讓我們通過單擊 新申請 按鈕。
接下來,您將看到一個彈出窗口,要求您輸入應用程序的名稱。 叫我們的機器人 my-greeter-bot
。 通過點擊 創建 按鈕,Discord將創建一個API應用程序。
創建應用程序後,您將看到新創建的應用程序的概述 my-greeter-bot
應用。 您會看到諸如客戶ID和客戶機密之類的信息。 該機密將在以後用作授權令牌。
現在,點擊 博特 菜單選項 設定 菜單。 不和諧會建立我們的 my-greeter-bot
應用程序,並向其中添加機器人用戶。
構建機器人後,您將獲得自定義機器人的概述。 看看 Token 部分。 複製此授權令牌並將其記入某個地方,因為稍後我們需要使用它來連接到我們的機器人用戶。
步驟3:定義權限並將Bot添加到服務器
第三,我們要定義機器人的權限並將其添加到我們的Discord服務器中。
導航到 OAuth2 下的部分 設定 菜單。 在這裡,我們可以定義我們的機器人的範圍。 由於我們只想啟用一個簡單的漫遊器,因此選擇 BOT 選項。
您可能會注意到下面的授權URL已經更改。 但是,那 permissions=0
部分錶明我們尚未設置權限。
如果我們向下滾動,您會發現 機器人權限 部分。 我們希望機器人能夠 Send Messages
和 Read Message History
。 我們需要閱讀消息歷史記錄的權限,以便我們可以檢測用戶的請求。
當您選擇兩個選項時,請注意授權URL中權限參數的數字已更改。
最後,複製此URL並將其粘貼到您喜歡的Web瀏覽器中。 您將找到一個概述,詢問您要將機器人添加到哪個服務器。 讓我們選擇我們新創建的 discord_playground
.
點擊 授權 按鈕,將漫遊器添加到我們的服務器。
如果您能夠成功地將漫遊器添加到服務器中,則應該看到以下成功屏幕。
如果您想再次檢查您的漫遊器是否已添加,請轉到 總 渠道。 您應該看到一條類似的消息,表明該漫遊器已加入頻道。
成功了!
步驟4:專案設定
最後,讓我們設置項目。 您可以在以下位置找到基礎項目 GitHub上。 請使用以下命令在您的計算機上本地克隆存儲庫 git clone https://github.com/sitepoint-editors/discord-bot-sitepoint
.
該項目取決於兩個依賴項, dotenv
和 discord.js
。 第一個依賴項允許我們使用 .env
包含我們已記下的機器人令牌的文件。 顯然,我們需要第二個依賴項, discord.js
,用於開發Discord機器人。
為了安裝兩個依賴項,請執行 npm install
在項目文件夾中。
最後,要完成安裝,請創建一個 .env
文件放在項目的根目錄中。 添加一個環境變量,稱為 TOKEN
到這樣的文件:
TOKEN=my-unique-bot-token
步驟5:探索Discord.js
我們來看看吧 index.js
文件位於項目的根目錄:
require('dotenv').config();
const Discord = require('discord.js');
const bot = new Discord.Client(); const TOKEN = process.env.TOKEN; bot.login(TOKEN);
我們首先通過要求環境中的配置來加載已定義的環境變量 .env
文件。 這使我們可以使用 TOKEN
我們通過定義的變量 process.env.ToKEN
。 上面代碼片段的最後一行顯示瞭如何將令牌傳遞給登錄函數,以訪問已創建的機器人。
bot
變量實際上是我們進行交互的Discord客戶。
收聽“就緒”事件
接下來,我們可以監聽事件。 首先,我們正在聽 ready
事件。 一旦我們連接到機器人,就會觸發ready事件:
bot.on('ready', () => { console.info(`Logged in as ${bot.user.tag}!`);
});
如果您使用的是正確的 TOKEN
要登錄該機器人,您的終端應打印您的機器人名稱 bot.user.tag
.
您只需執行以下命令即可啟動機器人 node index.js
在您的終端。 確保在項目的根目錄中執行此命令。
如果自動程序已成功連接,則應該在終端上看到正在打印的自動程序的名稱。
收聽“消息”事件
除了 準備 事件,Discord客戶端可讓您收聽 信息 事件。 這意味著漫遊器可以讀取發送到通道的任何消息。 回到權限部分,這就是為什麼我們需要授予機器人權限以讀取消息歷史記錄的確切原因。
bot.on('message', msg => { if (msg.content === 'ping') { msg.reply('pong'); msg.channel.send('pong'); }
});
如果我們進一步研究代碼,您會發現我們正在尋找包含內容的消息 ping
。 如果我們收到的消息僅包含 ping
,該漫遊器會回复 pong
。 之後,我們使用 msg.channel.send
再次發送 pong
到頻道。
注意兩個命令之間的區別:
msg.reply
:標記發送消息的初始用戶msg.channel.send
:向通道發送消息,而不標記任何人
嘗試使用 node index.js
並發送一條消息 ping
到 general
渠道。 驗證是否看到相同的結果。
尋找標記的用戶
為了添加新命令,我們必須擴展 if
我們有一個條款 else … if
:
if (msg.content === 'ping') { msg.reply('pong'); msg.channel.send('pong'); } else if (msg.content.startsWith('!kick')) { if (msg.mentions.users.size) { const taggedUser = msg.mentions.users.first(); msg.channel.send(`You wanted to kick: ${taggedUser.username}`); } else { msg.reply('Please tag a valid user!'); }
}
假設我們想通過發送一條消息來踢某人 !kick @username
。 所以,首先我們尋找 !kick
在郵件的內容中。 如果我們發現開頭為 !kick
,我們可以檢查郵件中用戶是否被標記為 msg.mentions.users
屬性。
如果有標記的用戶,我們可以選擇第一個提到的用戶 msg.mentions.users.first()
。 接下來,我們在消息中使用用戶名回复該頻道。
步驟6: else … if
鏈
接下來,讓我們討論所有這些問題 else … if
陳述。 如果您僅定義了一些命令以在消息事件中進行偵聽,則該代碼非常易讀。
但是,當我們決定以這種方式構建一個廣泛的項目時,最終會產生一系列 else … if
陳述。 這是為什麼不應該使用的一小部分原因 else … if
不小的項目的鏈條:
- 更容易成為意大利麵條代碼的受害者
- 該代碼很難閱讀
- 調試起來並不容易
- 組織代碼很困難
- 隨著代碼的增長,維護起來並不容易
因此,讓我們看一下可以使用的命令模式。
實施命令處理程序
命令處理程序是一種受支持的方法 discord.js
包。 在繼續之前,請查看 advanced
與 git checkout advanced
。 該分支保存命令處理程序的實現。
命令文件夾
首先,讓我們探索命令文件夾。 此文件夾包含一個 index.js
導出我們將定義的所有命令的文件。 為了簡單起見,我們只定義一個命令, ping
:
module.exports = { Ping: require('./ping'),
};
接下來,讓我們看一下 ping
命令,該命令基本上導出包含以下內容的對象:
name
:命令名稱。description
:最佳做法是為每個命令添加描述。execute
:接受的功能msg
和args
輸入。 此功能與我們在邏輯中具有相同的邏輯else … if
鏈。
module.exports = { name: 'ping', description: 'Ping!', execute(msg, args) { msg.reply('pong'); msg.channel.send('pong'); },
};
導入命令
繼續,讓我們將命令導入到 index.js
文件。 注意,我們在Discord機器人上定義了一個命令集合。 我們遍歷所有命令,並將它們一個接一個地添加到命令集合中。
bot.commands.set
函數接受命令名稱和整個命令對象:
const Discord = require('discord.js');
const bot = new Discord.Client();
bot.commands = new Discord.Collection();
const botCommands = require('./commands'); Object.keys(botCommands).map(key => { bot.commands.set(botCommands[key].name, botCommands[key]);
});
之後,我們必須刪除 else … if
鏈並用一些動態代碼替換它以找到我們要調用的正確命令:
bot.on('message', msg => { const args = msg.content.split(/ +/); const command = args.shift().toLowerCase(); console.info(`Called command: ${command}`); if (!bot.commands.has(command)) return; try { bot.commands.get(command).execute(msg, args); } catch (error) { console.error(error); msg.reply('there was an error trying to execute that command!'); }
});
我們首先嘗試使用空格將消息的內容拆分為空白 .split(/ +/)
。 我們假設其中的第一項 args
數組是我們的命令。 為了檢查命令是否存在於我們的集合中,該集合公開了一個 has()
函數,僅返回true或false。 如果該命令不存在,我們將返回一個空響應。
但是,如果命令存在,則使用 get()
函數檢索正確的命令並使用輸入參數執行它 msg
和 args
.
這是一種易於閱讀的動態調用方式,無需編寫意大利麵條式代碼。 這使您可以根據需要將項目擴展到數百個命令。
同樣,如果您想測試我們的代碼的新版本,請確保簽出 advanced
與 git checkout advanced
。 接下來,使用 npm install
並啟動機器人 node index.js
.
結束語
起初,安裝和設置新的Discord機器人可能會感到不知所措。 但是,由 discord.js
軟件包非常簡單,Discord網站提供了 很好的例子.
由於本教程僅涉及兩個權限,因此還有更多的發現。 您可以進一步了解有關 Discordjs.指南 網站。
祝您構建第一個Discord機器人好運!
順便說一句,你可以加入 具有此鏈接的SitePoint的Discord社區。 來和我們談談技術。
資料來源:https://www.sitepoint.com/discord-bot-node-js/?utm_source=rss