Node.jsでDiscordボットを構築する方法

0 株式
0
0
0
0

導入

Discordは、世界中の何百万人ものユーザーがギルドやサーバーと呼ばれるコミュニティでオンラインでメッセージや音声チャットを行えるチャットアプリです。Discordは、開発者が強力なDiscordボットを構築するための豊富なAPIも提供しています。ボットは、サーバーへのメッセージ送信、ユーザーへのDM、サーバーのモデレート、音声チャットでの音声再生など、様々なアクションを実行できます。これにより、開発者はモデレーションツールやゲームといった高度で複雑な機能を備えた強力なボットを構築できます。例えば、Dyno Toolボットは数百万のコミュニティにサービスを提供しており、スパム対策、音楽プレーヤーなどの便利な機能を備えています。Discordボットの作成方法を習得すれば、何千人ものユーザーが毎日利用できる幅広い機能を実装できるようになります。.

このチュートリアルでは、Node.jsとDiscord.jsライブラリを使って、Discordボットをゼロから構築します。Discordボットは、ユーザーがDiscord APIを直接操作できるようにします。Discordボットのプロフィールを設定し、ボットの認証トークンを取得し、ユーザー引数を含むコマンドを処理するようにボットをプログラムします。.

前提条件

始める前に、次のものが必要です。

  • 開発マシンに Node.js がインストールされています。.
  • Visual Studio Code、Atom、Sublime、Nano など、任意のテキスト エディター。.
  • 確認済みのメール アカウントと、Discord ボットのテストに使用する無料の Discord サーバーを備えた無料の Discord アカウント。.

ステップ1 – Discordボットの設定

このステップでは、Discord 開発者グラフィカル ユーザー インターフェイス (GUI) を使用して Discord ボットを起動し、ボット トークンを取得してアプリケーションに渡します。.

Discordプラットフォームにボットを登録するには、Discordアプリダッシュボードをご利用ください。開発者はここで、Discordボットを含むDiscordアプリを作成できます。.

始めるには、「新規アプリケーション」をクリックします。Discordは新しいアプリケーションの名前を入力するように求めます。次に、「作成」をクリックしてアプリケーションを作成します。.

注: アプリの名前はボットの名前とは独立しており、ボットがアプリの名前である必要はありません。.

アプリのダッシュボードを開きます。アプリにボットを追加するには、左側のナビゲーションバーにある「ボット」タブに移動します。.

「ボットを追加」ボタンをクリックして、アプリにボットを追加します。確認メッセージが表示されたら、「はい、追加します!」をクリックします。すると、ボット名、認証トークン、プロフィール写真の詳細を含むダッシュボードが表示されます。.

ダッシュボードからボット名やプロフィール写真を変更できます。また、「クリックしてトークンを表示」をクリックし、表示されるトークンをコピーして、ボット認証トークンをコピーする必要があります。.

警告: ボット トークンは誰でもボットにログインできるため、絶対に共有したりアップロードしたりしないでください。.

次に、ボットをDiscordコミュニティに追加してテストするための招待を作成する必要があります。まず、アプリダッシュボードのOAuth2タブにあるURLジェネレーターページに移動します。招待を作成するには、下にスクロールして「スコープ」でボットを選択します。また、コミュニティ内でボットが実行できるアクションを制御するための権限を設定する必要があります。このチュートリアルでは「管理者」を選択します。これにより、ボットはギルド内のほぼすべてのアクションを実行できるようになります。「コピー」ボタンでリンクをコピーしてください。.

次に、ボットをサーバーに追加します。作成した招待リンクに従ってください。ドロップダウンメニューから、所有しているサーバー、または管理者権限を持つサーバーにボットを追加できます。.

「続行」をクリックします。「管理者」の横にあるボックスにチェックを入れてください。これにより、ボットに管理者権限が付与されます。「承認」をクリックします。ボットがサーバーに参加する前に、DiscordからCAPTCHAの解答を求められます。これで、ボットを追加したサーバーのメンバーリストに、Discordボットがオフラインとして表示されます。.

Discordボットを作成し、サーバーに追加しました。次に、ボットにログインするためのプログラムを作成します。.

ステップ2 – プロジェクトを作成する

このステップでは、ボットを構築し、プログラムでボットを入力するための初期コーディング環境をセットアップします。.

まず、ロボットのプロジェクト フォルダーと必要なプロジェクト ファイルを設定する必要があります。.

プロジェクト フォルダーを作成します。

mkdir discord-bot

作成したプロジェクト フォルダーに移動します。

cd discord-bot

次に、テキスト エディターを使用して、ボットの認証パスワードを保存する config.json というファイルを作成します。

nano config.json

次に、次のコードを構成ファイルに追加し、強調表示されたテキストをボットの認証トークンに置き換えます。

{
"BOT_TOKEN": "YOUR BOT TOKEN"
}

ファイルを保存して終了します。.

次に、プロジェクトの詳細とプロジェクトで使用している依存関係の情報を保存するpackage.jsonファイルを作成します。package.jsonファイルは、以下のnpmコマンドを実行して作成します。

npm init

npm はプロジェクトに関するさまざまな詳細を尋ねます。.

次に、Discord APIとのやり取りに使用するdiscord.jsパッケージをインストールします。discord.jsはnpm経由で以下のコマンドでインストールできます。

npm install discord.js

設定ファイルの設定と必要な依存関係のインストールが完了したら、ボットの構築を始める準備が整いました。実際のアプリケーションでは、大規模なボットは複数のファイルに分割されますが、このチュートリアルではボットのコードは1つのファイルにまとめられます。.

まず、コード用の discord-bot フォルダに index.js というファイルを作成します。

nano index.js

discord.js 依存関係とボット トークンを含む構成ファイルを要求して、ボットのコーディングを開始します。

const Discord = require("discord.js");
const config = require("./config.json");

この後、次の 2 行のコードを追加します。

...
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});
client.login(config.BOT_TOKEN);

ファイルを保存して終了します。.

コードの最初の行は、新しいDiscordクライアントを作成し、それを固定クライアントに割り当てます。このクライアントは、Discord APIとのやり取りや、新しいメッセージなどのイベントをDiscordに通知する方法の一部です。クライアントは実際にはDiscordボットを表します。Clientコンストラクタに渡されるオブジェクトは、ボットのゲートウェイインテントを指定します。これは、ボットがリッスンするWebSocketイベントを指定します。ここでは、ボットがフォーラムでメッセージイベントを受信できるように、GUILDSとGUILD_MESSAGESを指定しています。.

2行目のコードでは、クライアント側のログインメソッドを使用して、作成したDiscordボットにログインします。パスワードにはconfig.jsonファイル内のパスワードを使用します。トークンによって、Discord APIはアプリケーションがどのボット用であるか、そしてボットを使用するために認証されていることを認識します。.

次に、Node を使用して index.js ファイルを実行します。

node index.js

ボットを追加した Discord サーバー上で、ボットのステータスがオンラインに変わります。.

コーディング環境を構築し、Discordボットにログインするための基本コードを作成しました。次は、ユーザーコマンドを処理し、ボットにメッセージの送信などのアクションを実行させましょう。.

ステップ3 – ユーザーの最初のコマンドの処理

このステップでは、ユーザーコマンドを処理できるボットを作成します。最初のpingコマンドを実行すると、「ping」という応答と、コマンドへの応答にかかった時間が返されます。.

まず、ユーザーが送信するメッセージを検出して受信し、コマンドを処理できるようにする必要があります。Discordクライアントの on メソッドを使用すると、Discordは新しいイベントに関する通知を送信します。 on メソッドは2つの引数を取ります。1つは待機するイベント名、もう1つはイベントが発生するたびに実行される関数です。このメソッドを使うと、イベントメッセージを待機できます。これは、ボットがメッセージを閲覧する権限を持つフォーラムにメッセージが送信されるたびに発生します。そこで、メッセージが送信されるたびに実行され、コマンドを処理する関数を作成します。.

まず、ファイルを開きます。

nano index.js

ファイルに次のコードを追加します。

...
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});
client.on("messageCreate", function(message) { 
}); 
client.login(config.BOT_TOKEN);

この関数は messageCreate イベントで実行され、メッセージをパラメータとして受け取ります。メッセージは、送信されるメッセージに関する情報とボットの応答を支援するメソッドを含む Discord.js メッセージインスタンスになります。.

次に、コマンド制御関数に次のコード行を追加します。

...
client.on("messageCreate", function(message) {
if (message.author.bot) return;
});
...

この行は、メッセージの作成者がボットかどうかを確認し、ボットの場合はコマンドの処理を停止します。これは重要な点です。一般的に、ボットのメッセージを処理したり、応答したりすることは望ましくないためです。ボットは通常、他のボットからの情報を使用する必要がないため、ボットのメッセージを無視することで処理能力を節約し、ランダムな応答を防ぐことができます。.

コントローラーコマンドを記述します。そのためには、Discordコマンドの一般的な形式を理解しておくとよいでしょう。通常、Discordコマンドの構造は、プレフィックス、コマンド名、そして(場合によっては)コマンド引数の3つの部分で構成されます。.

  • プレフィックス:プレフィックスは何でも構いませんが、通常は句読点や抽象的なフレーズなど、メッセージの先頭には置かれないような文字列です。つまり、メッセージの先頭にプレフィックスを入力すると、ボットはこのコマンドがボットによって処理されることを意図していると認識します。.
  • コマンド名: ユーザーが使用したいコマンドの名前。これにより、ボットは機能の異なる複数のコマンドをサポートし、ユーザーが異なるコマンド名を提供することでそれらの中から選択できるようになります。.
  • 引数: コマンドがユーザーからの追加情報を必要とする場合や追加情報を使用する場合、ユーザーはコマンド名の後に引数を指定できます。各引数はスペースで区切られます。.

注: 必須のコマンド構造はなく、ボットは好きなようにコマンドを処理できますが、ここで示す構造は大多数のボットが使用する実用的な構造です。.

この形式を処理するコマンド パーサーの作成を開始するには、メッセージ ハンドラー関数に次のコード行を追加します。

...
const prefix = "!";
client.on("messageCreate", function(message) {
if (message.author.bot) return;
if (!message.content.startsWith(prefix)) return;
});
...

コードの最初の行に、ロボット プレフィックスとして使用する定数プレフィックスの値「!」を追加します。.

追加するコードの 2 行目は、ボットが処理しているメッセージの内容が設定したプレフィックスで始まっているかどうかを確認し、始まっていない場合はメッセージの処理を停止します。.

次に、メッセージの残りの部分をコマンド名と引数に変換する必要があります。以下の強調表示された行を追加してください。

...
client.on("messageCreate", function(message) {
if (message.author.bot) return;
if (!message.content.startsWith(prefix)) return;
const commandBody = message.content.slice(prefix.length);
const args = commandBody.split(' ');
const command = args.shift().toLowerCase();
});
...

最初の行では、メッセージの内容からプレフィックスを削除し、その結果を定数コマンド本体に代入します。これは、解析されたコマンド名にプレフィックスを含めたくないためです。.

2行目は、プレフィックスを取り除いたメッセージを受け取り、splitメソッドを用いてスペースを区切り文字として使います。これにより、メッセージは部分文字列の配列に分割され、スペースがある箇所では常に分割が行われます。結果として、コマンド名と、メッセージに含まれている場合は引数を含む配列が生成されます。この配列を定数argsに代入します。.

3行目は、args配列の最初の要素(指定されたコマンドの名前)を削除し、小文字に変換してから、定数commandに代入します。これにより、コマンド名を分離し、配列には引数のみを残すことができます。また、Discordボットではコマンドの大文字と小文字が区別されないことが多いため、toLowerCaseメソッドも使用します。.

コマンドパーサーの構築、必要なプレフィックスの実装、そしてメッセージからのコマンド名と引数の取得が完了しました。次は、具体的なコマンドのコードを実装し、生成します。.

ping コマンドを開始するには、次のコードを追加します。

...
const args = commandBody.split(' ');
const command = args.shift().toLowerCase();
if (command === "ping") {

} 
});
...

このif文は、解析したコマンド名(定数コマンドに割り当てたもの)が「ping」と一致するかどうかを確認します。一致する場合、ユーザーは「ping」コマンドを使用しようとしていることを示します。具体的なコマンドコードはif文ブロックに記述します。このパターンを、実行したい他のコマンドについても繰り返します。.

これで、「ping」コマンドコードを実装できます。

...
if (command === "ping") {
const timeTaken = Date.now() - message.createdTimestamp;
message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
}
...

ファイルを保存して終了します。.

「ping」コマンドブロックを追加します。これは、Dateオブジェクトのnewメソッドを使用して取得した現在時刻と、作成されたメッセージのタイムスタンプとの差をミリ秒単位で計算します。この計算により、メッセージの処理とボットへの「ping」にかかった時間が計算されます。.

2行目は、message定数内のreplyメソッドを使用して、ユーザーのコマンドに応答します。replyメソッドは、コマンドを実行したユーザーにpingを送信し(ユーザーに通知し、指定されたユーザーのメッセージをハイライト表示します)、その後にメソッドの第一引数として指定されたコンテンツを送信します。replyメソッドが使用する応答として、メッセージと計算されたpingを含むリテラルパターンを指定します。.

これにより、「ping」コマンドの実行が終了します。.

次のコマンドを使用してボットを実行します (index.js と同じフォルダー内)。

node index.js

これで、ボットが表示およびメッセージを送信できる任意のチャネルで「!ping」コマンドを使用し、結果として応答を取得できるようになりました。.

ユーザーコマンドを処理できるボットを作成し、最初のコマンドを実行できました。次に、sumコマンドを実行してボットの開発を続けましょう。.

ステップ4 – Sumコマンドを実行する

次に、「!sum」コマンドを実行してプログラムを拡張します。このコマンドは任意の数の引数を受け取り、それらを合計し、すべての引数の合計をユーザーに返します。.

Discord ボットがまだ実行中の場合は、CTRL + C でそのプロセスを停止できます。.

index.js ファイルを再度開きます。

nano index.js

else-ifブロックを使用して、「!sum」コマンドの実行を開始します。コマンド名pingを確認した後、コマンド名が「sum」と等しいかどうかを確認します。else-ifブロックを使用するのは、一度に1つのコマンドしか処理されないためです。つまり、プログラムがコマンド名「ping」に一致する場合、「sum」コマンドを確認する必要はありません。以下の強調表示された行をファイルに追加してください。

...
if (command === "ping") {
const timeTaken = Date.now() - message.createdTimestamp;
message.reply(`Ping! This message had a latency of ${timeTaken}ms.`);
}
else if (command === "sum") {

} 
});
...

「sum」文のコードを実行できます。「sum」文のコードは、先ほど作成したelse-ifブロック内にあります。次のコードを追加してください。

...
else if (command === "sum") {
const numArgs = args.map(x => parseFloat(x));
const sum = numArgs.reduce((counter, x) => counter += x);
message.reply(`The sum of all the arguments you provided is ${sum}!`);
}
...

引数リストに対してmapメソッドを使用し、args配列の各項目に対してparseFloat関数を適用して新しいリストを作成します。これにより、すべての項目が文字列ではなく数値である新しい配列(定数numArgsに代入されます)が作成されます。つまり、後でこれらの数値を加算することで合計を求めることができます。.

2行目では、定数numArgsに対してreduceメソッドを使用しています。このメソッドは、リスト内のすべての要素を合計する関数を提供します。numArgs内のすべての要素の合計を定数sumに代入します。.

次に、メッセージ オブジェクトの reply メソッドを使用して、ユーザーがボットに送信するすべての引数の合計を含む実際のパターンでユーザーのコマンドに応答します。.

これで「sum」コマンドの実行は終了です。次に、同じindex.jsフォルダ内にある次のコマンドでボットを実行します。

node index.js

ボットがメッセージを表示および送信できるすべてのチャネルで「!sum」コマンドを使用できるようになりました。.

以下は index.js ボット スクリプトの完全バージョンです。

const Discord = require("discord.js");
const config = require("./config.json");
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});
const prefix = "!";
client.on("messageCreate", function(message) {
if (message.author.bot) return;
if (!message.content.startsWith(prefix)) return;
const commandBody = message.content.slice(prefix.length);
const args = commandBody.split(' ');
const command = args.shift().toLowerCase();
if (command === "ping") {
const timeTaken = Date.now() - message.createdTimestamp;
message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
}
else if (command === "sum") {
const numArgs = args.map(x => parseFloat(x));
const sum = numArgs.reduce((counter, x) => counter += x);
message.reply(`The sum of all the arguments you provided is ${sum}!`);
}
});
client.login(config.BOT_TOKEN);

この時点で、sum コマンドを実行して Discord ボットを開発しました。.

結果

複数の異なるユーザーコマンドとコマンド引数を処理できるDiscordボットの実装に成功しました。ボットを拡張したい場合は、より多くのコマンドを実行したり、Discord APIのより多くの部分を試したりして、強力なDiscordボットを構築できるでしょう。.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

あなたも気に入るかもしれない