Discord ボットの作り方 Node.js版 2023年1月現在の方法

N予備校アドベントカレンダーの @rabeneko さんの記事で、授業などで使用している Slack無料プラン は 90日 でログが消えてしまうため、Discord に移行しようという記事がありました。
https://qiita.com/rabeneko/items/5e3d0f960e67cea77904

これに伴(ともな)い、移行期間中に Discord と Slack の間をつなぐボット(いわゆるリレーボット)を作成しました。
↓ こんなやつです。
![スクリーンショット 2022-12-16 15.31.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212903/1ba23389-935e-feb0-89d6-644381a7531a.png)

というわけで、Node.js で Discord ボットの作り方を解説します。
また、使用するライブラリである discord.js がバージョンによって書き方が違いすぎるため、過去の解説記事が参考にならなかったので、あらためて 2023年1月現在の作り方を残したいと思います。
**（この記事で使用している doscord.js のバージョンは 14.7.1 です。）**


# ① Node.js を用意する

これはいくつか方法があります。

パソコンに慣れていない方は、[Node.js の公式インストールページ](https://nodejs.org/ja/download/)
から、 LTS 版を選択してダウンロード & インストールを行います。
![スクリーンショット 2022-12-16 15.46.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212903/5c938c41-d457-5c60-55f7-ba632c78d508.png)

パソコンに慣れている方は、Mac なら Homebrew 経由で nvm をインストール、Windows なら Chocolatey を使ってインストールするで良いです。

＊Node.jsバージョンは 16.9.0 以上を使用してください。discord.jsがそれ以上のバージョンを必要としているためです。

何かしらのコンソール画面で(Macならターミナルなど、WindowsならPowershellなど)

```
node --version
```

が動作すれば OK。

# ② Discordの開発者ページ

[Discordの開発者ページ](https://discord.com/developers/applications) からボットのアプリケーション登録を行いましょう。
[Discordの開発者ダッシュボード](https://discord.com/developers/applications) にアクセスして、Discordのアカウントでログインしてください。

### ②-1 アプリケーション登録とトークンの取得

「Applications」 → 「New Applivcation」 のボタンをクリック
![スクリーンショット 2022-12-16 17.36.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212903/ab11c864-735d-cbcc-6fd9-b5aa4c27ff83.png)

アプリケーション(ボット)の名前を入力してから、「Create」のボタンをクリック
![スクリーンショット 2022-12-16 17.38.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212903/80a5e35b-2882-4bad-da63-c0401eebf974.png)

「Bot」のタブを選択し、「Add Bot」のボタンをクリック
![スクリーンショット 2022-12-16 17.44.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212903/6524d01b-721e-9d65-3ec0-5282198c8d24.png)
確認ダイヤログが出ますので「Yes, do it!」を選択
![スクリーンショット 2022-12-16 17.40.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212903/849285ee-617d-dae7-f75c-a6bd3f8ed32f.png)

ボットの名前やアイコンの設定はここでできます。
できたら、「Reset Token」のボタンをクリックしてトークンを作成してください。
![スクリーンショット 2022-12-16 17.45.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212903/8a79d8d8-6dbf-3088-bba8-0d286ef8b2e8.png)

トークンが作成・表示されたら、コードで使うので Copy して控えておきます。
![スクリーンショット 2022-12-16 17.46.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212903/3ee3a1b8-a57d-9a87-e86e-40bd4f58cce6.png)

下にスクロールし、「MESSAGE CONTENT INTENT」のスイッチを ON に設定してください。これは、投稿されたメッセージをボットも取得できるようにする権限です。
ON のできたら、「Save Change」の緑色のボタンをクリックします。
![スクリーンショット 2022-12-16 17.48.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212903/0d27d4e7-f2b2-751b-7d40-3073323a83fb.png)

### ②-2ボットをDiscordのギルドに追加

今度は、ボットを目的のギルドに追加していきます。

左のタブから「OAuth2」を選択します。
「scops」から「bot」を選択します。
![スクリーンショット 2022-12-16 21.54.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212903/a4b6d3e1-a258-15ab-a443-20c583e1dddb.png)

下にスクロールして権限設定を行います。
作りたい機能によって権限を付けます、ここでは、「Read Message/View Channels」と「Send Message」にチェックを付けて、下に発行される「GENERATED URL」をコピーしてアクセスします。
![スクリーンショット 2022-12-16 21.54.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212903/b92f299e-ef79-7d19-8218-8669eccfc79d.png)

「サーバーに追加」の箇所で追加したいギルドを選択して「はい」　のボタンをクリック
![スクリーンショット 2022-12-16 21.55.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212903/f9d1a303-b072-e1e8-5df3-34e57216b1d6.png)

与える権限のチェックボックスにチェックし、「認証」のボタンをクリック
![スクリーンショット 2022-12-16 21.55.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212903/4bc3306d-373d-6076-ac4a-f9fe315040ab.png)

CAPTCHAの確認ダイヤログを行います。
![スクリーンショット 2022-12-16 21.55.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212903/a65ebb76-35c2-f092-7920-8aa338db8b22.png)

これで OK


# ③ プログラムを書く

ボット用のプロジェクトを作成し、エディタで開こう

```
mkdir bot_test
cd bot_test
yarn init
```

使用するライブラリは [discord.js](https://discord.js.org/#/) です。
このライブラリが、バージョンによって書き方が違ったりして、過去の記事などに掲載されているコードが動かなかったりなど破壊的な更新があったことが、この記事を書こうと思ったきっかけです。
**（この記事で使用している doscord.js のバージョンは 14.7.1 です。）**

また、[公式のサンプルコード](https://discord.js.org/#/docs/discord.js/main/general/welcome) も、チャットボットが作りたいのに、いきなり Discord のコマンド（？）に対するリアクションの仕方が解説されているという上級者向けであったので、チャットボットの作り方を解説します。

ライブラリを追加します。

```
yarn add discord.js
```

index.js ファイルを作成し、コードを書いていきましょう。
![スクリーンショット 2022-12-16 18.01.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212903/543f9f00-df2f-3794-96b9-23606f656b84.png)

チャットに反応して「こんにちは」だったら、「こんにちわ！」と返すプログラムは下記のようになります。

```js
const { Client, GatewayIntentBits } = require('discord.js');

const client = new Client(
  { intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.MessageContent
    ]
  }
);

client.on('messageCreate', message => {
  if(message.author.bot) return; //BOTのメッセージには反応しない

  if(message.content === "こんにちわ") {
    message.channel.send("こんにちわ！");
  }
});

client.on('ready', () => {
  console.log('ボットが起動したよ');
});
client.login("ボットトークンをここに設定してください");
```

### 動作させる

コンソール画面でコマンドを実行する

```
node index.js
```

会話したいチャンネルにボットを招待して会話をしよう。
![スクリーンショット 2022-12-16 21.57.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212903/aafc976b-c9aa-4be3-91b7-bcbd548e007c.png)
動いた✨



### コード解説
コード解説しますと。

```js
const { Client, GatewayIntentBits } = require('discord.js');
```
では、discord.jsのライブラリを読み込んでいます。

```
const client = new Client(
  { intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.MessageContent
    ]
  }
);
```
上記では、ボットの権限を設定し、ボット用の変数を初期化しています。
[権限の詳細はこちらのページ(英語)](https://discord-api-types.dev/api/discord-api-types-v10/enum/GatewayIntentBits) に詳細が記載されています。

```js
client.on('messageCreate', message => {
  if(message.author.bot) return; //BOTのメッセージには反応しない

  if(message.content === "こんにちわ") {
    message.channel.send("こんにちわ！");
  }
});
```
上記では、チャットメッセージが送られてきた時の動作を書いています。
ボットが検知するする [イベントの一覧はこちらのページ(英語)](https://discord.js.org/#/docs/discord.js/main/typedef/Events) に詳細が記載されています。

また、チャットメッセージに関する情報が入っている [Message変数の詳細はこちらのページ(英語)](https://discord.js.org/#/docs/discord.js/main/class/Message) に詳細が記載されています。
例えば、 `message.author` には投稿者のデータが入っており `message.author.username` で投稿者の名前が取得できます。
`message.content` で投稿された文章が取得できます。

`message.channel.send()` では、投稿されたチャンネルに発言をします。

```js
client.on('ready', () => {
  console.log('ボットが起動したよ');
});
client.login("ボットトークンをここに設定してください");
```

上記では、ボットの起動をおこなっています。
`login()` 関数の括弧内には開発者ページで取得したトークンを実際に設定してください。（本当はGit管理外のファイルに記載することが望ましいです）

`client.on('ready' ,関数)` では、ボットが起動できたことを確認するために、準備ができたらログを出力していますが、この３行は無くても大丈夫です。


以上です。
[公式ドキュメント](https://discord.js.org/#/docs/discord.js/main/general/welcome) は英語で目的の機能の詳細を探すのが難しいかもしれませんが、慣れてくるとなんとなく見つけられるようになりますw

それは、楽しいボットライフを！