Discordサーバーを運営していると、
「誰が入ってきたのか」「誰が抜けたのか」を把握したい場面が多いです。
この記事では、Discord.jsを使って、入退室を自動で通知するBotの作り方を
初心者でも理解できるように解説します。
この記事でできること
- Discord.jsの基本的な構文がわかる
- Embed(埋め込み)の使い方がわかる
- メンバー参加時に通知を送る
- メンバー退出時に通知を送る
事前準備
Botを作成する
まずはDiscordDeveloper Portalにアクセスして、Botを作成しましょう!

初めて使用する場合はこのような画面になると思いますので普段使用しているDiscordアカウントでログインしてください。

ログインすることができたらこのような画面になると思いますので右上にあるNew Applicationと書かれたボタンをクリックし、アプリケーション名(適当でOK)を入力し、利用規約に同意して、Createしてください。
注意:ここから先、ページを日本語に翻訳すると、ほぼ確実にエラーが発生しますので、翻訳しないでください。

今回、アプリケーション名はテスト用BOTにしてみました。アプリケーション名は後から変更することができますで、ご安心ください。
左側のサイドメニューから、OAuth2を選択し、下にスクロール。以下の画面のように設定してください。
追記:View Channelsにもチェックを入れてください。

画質がガビガビなので補足(汗)
ScopesはBot、Bot PermissionsはView Channels、Send Messages、Embed Linksにチェックを入れてください
一番下にあるGenerated URLをコピーし、ブラウザで開いてください。

Botを追加したいサーバーを選択し、認証してください。

Botを追加することができました。次からはいよいよプログラムを書いていきます!
Botのプログラム
ということでいよいよBotのプログラムを作成していきましょう!今回はVSCodeというテキストエディタを使用します。
最低限のVSCodeやJavaScriptの知識がある前提で話を進めますので操作方法がわからない方はその都度調べてください。

まずは適当なフォルダを作成してターミナルから以下のコマンドを実行してください。
npm init -y
npm install discord.js dotenv
ファイル構成は以下の通りです。
root/
├─ index.js
├─ .env
全体のプログラム
全体のプログラムです。解説は次の章で行いますのでまずはコピペして下さい。
index.js
require("dotenv").config();
const { Client, GatewayIntentBits, EmbedBuilder } = require("discord.js");
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMembers
]
});
client.once("ready", () => {
console.log(`ログインしました: ${client.user.tag}`);
});
client.on("guildMemberAdd", member => {
const channel = member.guild.channels.cache.get(process.env.CHANNEL_ID);
if (!channel) return;
const embed = new EmbedBuilder()
.setColor(0x57F287)
.setTitle("メンバー参加")
.setDescription(`**${member.user.tag}** さんが参加しました`)
.setThumbnail(member.user.displayAvatarURL())
.setFooter({ text: `現在の人数:${member.guild.memberCount}人` })
.setTimestamp();
channel.send({ embeds: [embed] });
});
client.on("guildMemberRemove", member => {
const channel = member.guild.channels.cache.get(process.env.CHANNEL_ID);
if (!channel) return;
const embed = new EmbedBuilder()
.setColor(0xED4245)
.setTitle("メンバー退出")
.setDescription(`**${member.user.tag}** さんが退出しました`)
.setThumbnail(member.user.displayAvatarURL())
.setFooter({ text: `現在の人数:${member.guild.memberCount}人` })
.setTimestamp();
channel.send({ embeds: [embed] });
});
client.login(process.env.DISCORD_TOKEN);
config.json
DISCORD_TOKEN=XXXX
CHANNEL_ID=YYYY
XXXXの部分はDiscordDeveloper Portalで取得したTOKENを張り付けてください
TOKENの取得方法
左側のメニューからBotタブに移動し、Reset TOKENを押す。パスワードを入力してOKを押す。TOKENをコピーし、プログラムのYYYYの部分に張り付ける。

Discord Developer Portal の「Bot」タブで
Minified React error #130 が表示される場合、
Discord側のWeb UIの不具合が発生しています。
キャッシュの消去、シークレットモード(inPrivate)、
別ブラウザでのアクセスを試してください。
YYYYの部分は入退出メッセージを送信したいチャンネルのIDを張り付けてください
CHANNEL_IDの取得方法
左側のメニューからOauth2タブに移動し、Client IDをコピーし、プログラムのYYYYの部分に張り付ける。

TOKENとCHANNEL_IDが設定できたら以下のコマンドをターミナルから実行してください。(index.jsがある階層で)
node index.js
すると以下のようなエラーが発生すると思います。
error: new Error("Used disallowed intents")
^
Error: Used disallowed intents
---略---
at TLSSocket.emit (node:events:530:35)
at node:net:337:12
at TCP.done (node:_tls_wrap:657:7)
Node.js v20.12.2
エラーの文言を見てわかる通りこのBotを使用するためにはインテントを有効化する必要があります。

DiscordDeveloper Portalの左側のメニューからBotタブに移動し、Private Gateway IntentsからServer Member Intentsをオンにし、下のSave Changeをクリックしてください。
解説
プログラムの解説です。
index.js
require("dotenv").config();
.env(環境変数)を読み込むプログラムです。
const { Client, GatewayIntentBits, EmbedBuilder } = require("discord.js");
discord.jsを読み込むプログラムです。
それぞれ以下のような機能を持っています。
| Client | discord.jsの基本的な機能を読み込む |
| GatewayIntentBits | インテント(先ほどオンにしたもの)の設定用 |
| EmbedBuilder | Embed(埋め込みメッセージ)を送信するために |
const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers ]});
Botが何を知って良いかを決めます
それぞれ以下のような理由で使用しています。
| Guilds | サーバーに関する情報を扱うため |
| GuildMember | サーバーへの入退室を検知するため |
client.once("ready", () => { console.log(`ログインしました: ${client.user.tag}`);});
ザックリ解説すると、Botがオンラインになった時に一度だけ実行されます。
今回はコンソールにBotの名前を出力してみました。例)テスト用Bot#1234
client.on("guildMemberAdd", member => {
guildMemberAddはその名の通り、メンバー参加時に発火します。memberに、参加したメンバーの情報が入ります。
const channel = member.guild.channels.cache.get(process.env.CHANNEL_ID);
入退室を通知するチャンネルを環境変数から取得します。
- member.guild 参加したサーバー
- channels.cache サーバー内のチャンネル一覧
- get(ID) 指定したチャンネルを取得
if (!channel) return;
チャンネルが存在しなかった場合に、エラーが発生するのを防止します。
const embed = new EmbedBuilder()
Embed(埋め込み)を作成することができます。
.setColor(0x57F287)
.setTitle("メンバー参加")
.setDescription(`**${member.user.tag}** さんが参加しました`)
.setThumbnail(member.user.displayAvatarURL())
.setFooter({ text: `現在の人数:${member.guild.memberCount}人` })
.setTimestamp();
作成したEmbedの設定です。
少し解説をすると、member.user.displayAvatarURL()でユーザーのアイコンを取得できます。setThumbnailを用いることで画像を表示できます。この2つは併用することが非常に多いです。
channel.send({ embeds: [embed] });
作成したEmbedを送信するコードです。配列になっているので、複数のEmbedを送信することも可能です。
client.on("guildMemberRemove", member => {
...
guildMemberRemoveはメンバーが退出した時に発火します。
続きはほぼ同じです。
client.login(process.env.DISCORD_TOKEN);
環境変数からTOKENを取得して、Botを起動します。
テスト
Botがオンラインになりました。実際に機能するか確かめてみましょう!

メンバーが参加すると、、、メンバーが退出すると、、、

まとめ
分からないことがありましたら、コメントをお願いいたします!分かることは基本答えていこうと思います!それではまた次回の記事で~

コメント