見出し画像

簡単な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を作ってみましょう。

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

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

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

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

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

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

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


Glitchの準備

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

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

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

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

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

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

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

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


Bot Token の設定

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

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

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

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

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


Botをサーバーに招待する

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

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

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

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

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

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

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

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

Botのコーディング作業

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

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

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

main.js を選択します。

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で確認するとプレイ中がちゃんと表示されています。

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


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

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

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

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

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)以外のユーザーからメンションが飛んできた場合のみ返信するように条件を追加しました。

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

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


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

追加した処理は下記の通りです。
「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のページにアクセスするようにしてください。


まとめ

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

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

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

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

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


参考


この記事が気に入ったら、サポートをしてみませんか?気軽にクリエイターを支援できます。

note.user.nickname || note.user.urlname

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

よろしければTwitter等のSNSでシェアして頂けると喜びます!
44
Rocket Leagueの大会運営を行っている「Sateright」というコミュニティで活動しております。 Rocket Leagueが日本でもっと広まってほしいという願いからnoteに記事を書いていく事にしました。 これからよろしくお願いします。

コメント2件

Gulitchが5分アクセスが無いと停止するのを防ぐためにUpTime Rebootを設定してみたのですが、Glitchのコード画面にアクセスしてもBotが落ちてしまいます。起こすにはどこのURLにアクセスを投げればよいのでしょうか?
サングラスのマークがついたShowというボタンがあると思います。そのボタンを押して開かれたページのURLを指定してみてください。
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。