見出し画像

簡単なDiscord Botの作り方(初心者向け)

最近DiscordのBotに関する相談を受けることが増えてきました。
Botを作るというのは未経験の人にとっては難しい印象があるのかもしれません。ですが、作りは結構単純なので、やってみるとそんなに難しくはないというのが実感できると思います。
とはいえ、実際問題としてプログラミングに関する最低限の知識を持たずに作っていくというのは無理があります。
そういう人は、Progateが大変分かりやすい内容になっていますので、まずはこちらで学習してみてはいかがでしょうか。


Botで何ができるのか

結論から言えばその人のスキル次第で何でもできてしまいます。
ただし、プログラミングに慣れていない人が初めから難しいことに挑戦するのはなかなかハードルが高いと思います。
最初は、初心者向けの解説でありがちなテキストチャンネルにメッセージを送信する程度のものから始めることをオススメします。

プログラムを書く → 動いた → 嬉しい

実際に作っていく上で、このサイクルは非常に大切だと思います。
なぜなら、自分の書いたプログラムが動いたときに喜びを感じられないと、モチベーションが保ちづらいからです。
だから、簡単な機能から始めていき徐々にステップアップしていったほうが良いと思います。
難しいことをしようとした結果、挫折してやめてしまうのが一番もったいないです。
「Botを作ること」自体はそんなに難しくないのですから。

話がずれてきたので、Botで何ができるのか、事例をいくつか紹介します。
ここに載せている機能はほんの一部にしか過ぎないので、他の機能についても知りたい人は各自で調べてみてください。
(というか、私自身が勉強不足で全然把握できていないです。)

■サーバーの管理
役職の管理(追加・編集・削除)
チャンネルの管理(追加・編集・削除)
リージョンの変更
■ユーザー関連
役職の追加・剥奪
ニックネームの設定
サーバーに参加した日付の取得
アバター画像のURL取得
リアクションをつけたユーザーを取得
キック・BAN
■テキストチャンネル関連
メッセージ送信
メンションをつけて送信
メッセージをピン留め
メッセージ削除
ファイル送信
■ボイスチャンネル関連
音楽を流す
ボイスチャンネルに入室中のユーザーを取得
入室中のユーザーを別のボイスチャンネルに移動させる


プログラミング言語の選定

プログラミング未経験の人にとってプログラミング言語の選択は悩ましい。Discord Botは様々な言語、ライブラリで開発することができます。
他にも色々ありますが、有名どころはざっとこんな感じでしょうか。

discord.js(JavaScript)
discord.py(Python)
Discord.Net(C#)
DiscordGo(Go)
Discord4J(Java)
discordrb(Ruby)

私の例を出すと、
RLエンジョイ部の「disco」というBotはdiscordrb(Ruby)
RLAの大会運営用Botはdiscord.js(JavaScript)
を使用しています。

最初はRubyで書きたいからdiscordrb
今はJavaScriptで書きたいからdiscord.js
を選択しました。

ほかに、discord.py(Python)Discord.Net(C#)で簡単なBotを作ったこともあります。
私の場合は普段使わない言語で書いてみたいという興味本位な理由ですので、あまり参考にはならないと思いますが・・・。

基本的には自分の好きな言語で選択して良いと思いますが、人気で選ぶならdiscord.js(JavaScript)discord.py(Python)のどちらかになります。
人気がある=情報量が多いということです。当たり前ですが、わからないことを調べる際に情報量が多い方が解決しやすい傾向にあります。
そのあたりを考慮して選んでもらえたらと思います。

この記事では便宜上、discord.jsを使用して説明していきますので、他の言語、ライブラリを使用される方は一部参考にならない部分があります。ご了承ください。

それでは前置きが長くなりましたが、Botを作る過程の解説に入ります。


Botアカウントの作成

まずはBotのDiscordアカウントを用意してください。

下記のリンクにアクセスします。

New Application をクリックしてBotを作ってみましょう。

画像1

Botにつけたい名前を入力して Create をクリック。

画像2

APP ICON をクリックしてアイコンを設定。

画像3

アイコンを設定したら緑色のボタン Save Changes をクリックして保存します。

画像4

保存が完了すると緑色のメッセージが出ます。

画像5

次にBotの設定をしていきましょう。
SETTINGSの ①Bot から ②Add Bot をクリックしてBotを追加します。

画像6

なんか出てきますがとりあえず Yes, do it!

画像7

これでBotのアカウント作成は完了しました。
後ほどこのページを使うので、できればこの状態で残しておいて次の作業からは別タブで作業していきましょう。

画像8


Glitchの準備

(※discord.jsを使用しない方は読み飛ばしてください)

無料で簡単にBotを動かすためにGlitchを使います。

下記のリンクにアクセスします。

Sign in で好きなログイン方法を選択してください。

画像9

既に作成済みのアプリケーションを複製します。
(GlitchにはRemixという機能があり、他人が公開しているアプリケーションを複製して、そこから自分のオリジナルのアプリケーションを作っていくことができます。)

下記のリンクにアクセスします。(作成者の方ありがとうございます!)

右下の Remix your own をクリック。

画像10

するとこのような画面に切り替わるので、ここからBot開発を始めることができます。

画像11


Bot Token の設定

(※discord.jsを使用しない方は読み飛ばしてください)

最初に .env を選択します。

画像12

DISCORD_BOT_TOKEN にBotのTokenを設定します。
DiscordのBotアカウントを作成したページ(Discord Developer Portal)に戻ります。
SETTINGS の Bot にある TOKEN の Copy ボタンをクリックします。

画像13

そして .env DISCORD_BOT_TOKEN に貼り付けます。

画像14

これでBot Tokenの設定は完了です。


Botをサーバーに招待する

再びDiscordのBotアカウントを作成したページ(Discord Developer Portal)に戻ります。
今度は SETTINGS の OAuth2 を選択します。

画像15

OAuth2 URL GENERATOR の bot にチェックを入れます。

画像16

次に、BOT PERMISSIONS の 管理者 にチェックを入れます。
(Botに管理者権限を渡したくない場合はチェックを入れなくて良いですが、各権限を厳密に設定しておかないと、Botの権限が足りなくて動かないという事態に陥りますので、そのあたりは注意が必要です。)

画像17

チェックを入れ終わったらURL横の Copy ボタンをクリックします。
そして、コピーしたURLにアクセスするとBotの招待ページに飛べるはずです。

画像18

招待するサーバーを選択して 認証 ボタンをクリックします。

あなたがロボットではないことを証明しましょう!

画像19

これで自分のBotをサーバーに招待するところまで完了しました。

画像20

あとはBotの中身を作っていくだけです。

Botのコーディング作業

(※discord.jsを使用しない方は読み飛ばしてください)

いよいよプログラムを書いていきましょう。

コーディングというのはプログラムのソースコードを書くという意味

main.js を選択します。

画像21

Remix元のアプリケーションのソースコードが確認できます。

先頭の部分はGlitch用の内容なので特に気にしなくて良いです。
触らずにそのまま残しましょう。

// Response for Uptime Robot
const http = require('http');
http.createServer(function(request, response)
{
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Discord bot is active now \n');
}).listen(3000);


この部分はBotの準備が完了したタイミング(ready)で、Botに何かをさせたいときに使います。

client.on('ready', message =>
{
  console.log('bot is ready!');
});

1行追加して、Botの準備が完了したら 〇〇をプレイ中 を表示させましょう。

client.on('ready', message =>
{
  client.user.setPresence({ game: { name: 'with discord.js' } });  
  console.log('bot is ready!');
});

Discordで確認するとプレイ中がちゃんと表示されています。

画像22

setPresence に関する情報が気になる人は下記のページを確認してください。


次に、この部分は誰かがチャットを送信したタイミング(message)で、Botに何かをさせたいときに使います。

client.on('message', message =>
{
  if(message.isMemberMentioned(client.user))
  {
    message.reply( '呼びましたか?' );
    return;
  }
});

ここに書かれている内容は、Botにメンションが飛んできたときに「呼びましたか?」と返事をしてくれる処理です。
実際に動かしてみると分かりやすいので、Botへチャットでメンションを飛ばしてみましょう。

画像23

今度はユーザーが送信してきたメッセージをオウム返しするように「呼びましたか?」の部分を書き換えます。

client.on('message', message =>
{
  if(message.isMemberMentioned(client.user) && message.author != client.user)
  {
    message.reply(message.content);
    return;
  }
});

「message.content」で送信されたメッセージの内容が取れるので「呼びましたか?」の箇所を置き換えています。
また、if に下記の条件を入れておかないと自分自身に対して無限にメンションを飛ばすことになります。

message.author != client.user

そのため、自分(Bot)以外のユーザーからメンションが飛んできた場合のみ返信するように条件を追加しました。

実際に動かすとこのようになります。

画像24

打ち込んだ内容がそっくりそのまま返ってきていることが分かります。


最後にテキストチャンネルを作るコマンドを作りましょう。
先ほど書き換えた処理の直後で構いません。

画像25

追加した処理は下記の通りです。
「addch チャンネル名」のように入力されたらテキストチャンネルを作成する機能となっています。

if(message.content.startsWith('addch ')) {
  
  var channelName = message.content.replace(/^addch /, ''); 
  
  message.guild.createChannel(channelName);
  return;
}


if(message.content.startsWith('addch '))

「addch 」から始まるメッセージが入力されたらこの処理に入るようにしています。それを調べるために startsWith を使用してチェックします。


var channelName = message.content.replace(/^addch /, '');

これは replace で正規表現を使い、先頭の「addch 」を取り除きます。
その結果を「channelName」という変数に入れています。


message.guild.createChannel(channelName);

ここでテキストチャンネルを作成する処理を呼び出しています。

もしボイスチャンネルを作りたければ、

message.guild.createChannel(channelName, 'voice');

となります。
詳しくは下記のページで確認してください。


Glitchのスリープについて

(※Glitchを使用しない方は読み飛ばしてください)

Glitchは5分間アクセスがないとスリープ状態になります。
Botのステータスを常時オンラインに維持したい場合は、UptimeRobot等で定期的にGlitchのBotのページにアクセスするようにしてください。

Uptime Robotの使い方について解説します。

まずはSign-upでアカウントを作りましょう。

画像26


プランはFree Plan(無料)で十分です。
Free PlanのSign Upを選択してください。

画像27


名前、メールアドレス、パスワードを入力して、私はロボットではありませんにチェックを入れます。
海外のサイトですので、名前は英語表記のほうが良いかもしれません。
すべて完了したらSign-upを押しましょう。

画像28


確認メールが送信されますので、メールの受信箱を確認しましょう。

画像29


メールを受信したら、「アカウントをアクティベートしてください」と書かれていますので、リンクをクリックしてアクティベートしましょう。

画像30


これでアカウントの作成は完了です。
右上のLoginからログインしましょう。

画像31


登録したメールアドレスとパスワードを入力します。
Remember meにチェックを入れておくと1ヶ月間はログイン情報が保持されます。
ログインを省略したい場合はチェックを入れておくと便利ですが、他の人がそのPC等を使用してアクセスする場合も自動的にログインされてしまいますので、その辺は注意が必要です。
入力が済んだらLoginを押しましょう。

画像32


ログインするとダッシュボード画面が開かれます。
Add New Monitorを押して作成したbotを追加しましょう。

画像33


まず、Monitor TypeのHTTP(s)を選択します。

画像34


入力項目が増えました。

画像35

【Friendly Name】
名前です。分かりやすければ何でも構いません。

【URL】
GlitchのbotのURLを設定します。
botのコーディング作業をしていた画面の上部にある「Show」から「In a New Window」を選択します。
新しいタブで開かれたページのURLをここに設定してください。

画像36

画像37

【Monitoring Interval】
監視のインターバル時間です。
デフォルトの5分のままでOKです。


右側のメールアドレスはアラートメールの設定です。
botのページにアクセスできない場合はメールでお知らせしてくれます。
チェックを入れないとMonitorを作成できませんので、チェックを入れてください。
ここまで済んだらCreate Monitorをクリックします。

画像38


正常に終了したら以下の緑色のメッセージが表示されますので、Closeを押して入力フォームを閉じてください。

画像39


ダッシュボードの一覧に作成したMonitorが追加されました。
選択してみましょう。

画像40


Current Statusで現在のbotの稼働状態を確認できます。
Upと表示されていますので、正常に稼働していることが分かります。

画像41


以上がUptime Robotの使い方の流れとなります。
Uptime Robotが5分ごとにbotのページにアクセスしてくれますので、Glitchのスリープを回避できます。
それにより、botを24時間稼働させることができるようになります。

まとめ

「簡単なDiscord Botの作り方」というタイトルなので、簡単にしか説明していませんが、Discordのチャットでカードゲームが出来るBotがあったり、色々調べてみると面白いBotがたくさん出てきます。

Botはアイデア次第です。他のBotからヒントをもらいながら自分だけのBotを作って頂けたらなと思います。

今回は discord.js(JavaScript) での説明になりましたが、どのライブラリを選択したとしても、結局は自分で調べながら作っていくことになります。
ライブラリのドキュメント、ソース、Google先生をフル活用して開発するのが基本スタイルです。

分からないことはとことん調べる!

これに尽きます。調べる癖 をつけて 調べる力 をつけましょう。


参考


この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
note.user.nickname || note.user.urlname

サポートでの収入はRocket Leagueの大会運営に活用させていただきます。Botや開発予定のWebシステムのサーバー費用、その他運営活動で発生する出費に充てる予定です。

励みになります!
151
Rocket Leagueの大会運営を行っている「Sateright」というコミュニティで活動しております。 Rocket Leagueが日本でもっと広まってほしいという願いからnoteに記事を書いていく事にしました。 これからよろしくお願いします。

こちらでもピックアップされています

note編集部お気に入りマガジン
note編集部お気に入りマガジン
  • 17259本

様々なジャンルでnote編集部がおすすめしている記事をまとめていきます。

コメント (13)
@yuta0801 さん
remix元のpackage.jsonを確認しましたが、"latest"になっていますので最新(現在だとv12.0.2)がインストールされそうですね。もしかしたら3/4時点では"latest"が指定されていなかったということでしょうか。確認不足で申し訳ないです。
当記事内で紹介しているdiscord.jsのドキュメントのリンク先も"stable"にしておりますので、ドキュメントの内容も最新バージョンに追従する形となっているはずです。
前確認したときもlatestが指定されていましたが、実際にインストールされていたバージョンは11.4なので、おそらくpackage.jsonにかかれているバージョンではなく、それ"latest"が解決されたとき(最初にdiscord.jsが追加されたとき)のバージョンがremix後も引き継がれているみたいです(package.jsonからdiscord.jsの行を一度消してから追加したり、latestを^12.0.2に置き換えれば最新のバージョンに変えられました)
それから今確認したところなぜか、main.jsの15行目のconsole.logであった場所が.logになっていて構文エラーを引き起こしていますね
(500文字の制限に収まらなかったので別コメントにて)
v12に更新する場合は、記事内にv12に変更されたAPIがいくつか紹介されているのでっ更新したほうがよいかもです
setPresence({ game: { name: 'with discord.js' } }) → setPresence({ activity: { name: 'with discord.js' } })
isMemberMentioned(client.user) → mentions.has(client.user)
guild.createChannel(channelName) → guild.channels.create(channelName)
オウム返しの時メンション無しで返してくるようにしたい時ってどうすればいいんですかね?
誰か理解してるかた教えてください!
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。