はじめに
Part1
この記事では、Python初心者でもDiscord Botの開発を始められるよう、ただし基本的な文法や開発環境の知識があることを前提に、解説していきます。最終的には、ユーザーが送信したメッセージをそのままオウム返しするシンプルなボットを作成することを目指します。
開発環境
- OS: WSL2 Ubuntu 22.04.4 LTS
- Python: バージョン3.10.12
- discord.py: バージョン2.3.2
discord.pyとは
discord.pyは、DiscordのAPIを利用できるPythonのライブラリの一つです。PyPIで公開されており、pipを使用してダウンロード・インストールが可能です。一時は開発終了が発表されましたが、2023年8月に最新バージョン2.3.2がリリースされ、現在も開発が継続されています。
目次
1. 準備・インストール
1-1. 仮想環境の用意
ライブラリ等をインストールする際、環境の競合を避けるためにPythonの仮想環境を用意します。以下のコマンドで仮想環境を作成し、有効化します。
python3 -m venv <仮想環境の名前>
source <仮想環境の名前>/bin/activate
仮想環境を無効化するには、以下のコマンドを実行します。
deactivate
1-2. discord.pyのインストール
仮想環境内で以下のコマンドを実行し、discord.pyをインストールします。
pip install discord
2. オウム返しをするプログラムの作成
このプログラムを作成するには、Part1で作成したアクセストークンが必要です。トークンを忘れた場合は、Discord Developerから再発行してください。
以下のサンプルコードをtestbot.py
として保存します。
import discord
# ボットのシークレットアクセストークン
DISCORD_TOKEN = "xxxxxxxxxxxxxxxxxxxxxxxx"
# ボットの起動時の設定
client = discord.Client(intents=discord.Intents.all())
# ボットの起動時の処理
@client.event
async def on_ready():
print('ログインしました')
# メッセージ受信時の処理
@client.event
async def on_message(message):
# メッセージ送信者がボットの場合は無視する
if message.author.bot:
return
# メッセージの内容をオウム返しする
received_message = message.content # 受信したメッセージ
print(received_message) # 受信したメッセージを出力
await message.channel.send(received_message) # 受信したメッセージを送信
return
client.run(DISCORD_TOKEN)
2-1. 実行
以下のコマンドでプログラムを実行します。
python3 testbot.py
2-2. 実行結果
3. プログラムの説明
ここからより専門的な内容に入っていきます。よくわからないって方は読み飛ばしていただいて構いません。後々Discord.pyについての解説も出そうと思います。
3-1. @client.event
について
@client.event
は、Clientオブジェクトのメソッドの一つで、受け取るイベントを登録するデコレータとして使用されます。Clientが受け取る様々なイベント(メッセージの受信、サーバー権限の変更など)は、Client.event()
を使用して登録できます。
Clientの詳細については、Discord.py APIリファレンスを参照してください。
discord.pyのAPIは、基本的にオブジェクト指向(クラス)を利用したものです。オブジェクト指向に不慣れな方には、とっつきにくいかもしれません。
3-2. async def on_ready()
とasync def on_message(message)
について
これらは、client.event
に登録したイベントです。リファレンスには、多くのイベントが説明されています。今回使用したのは、discord.on_ready
(起動時に実行される関数)とdiscord.on_message(message)
(メッセージの受信時に実行される関数)です。
これらの関数は、クラスメソッドとして実行されるため、再定義もしくはClientを継承してサブクラスを作成し、オーバーライドする必要があります。
3-3. await message.channel.send()
について
非同期処理を行うため、async
とawait
を使用します。Message
クラスの詳細は、こちらを参照してください。
ボットが受け取ったメッセージにそのまま返信したい場合は、Message
クラスのメソッドreply
を使用します。例えば、message.reply("返信したいメッセージ")
のように記述します。
今回は、生のメッセージを送信したいので、受け取ったメッセージのテキストチャンネルを意味するmessage.channel
に対して、送信メソッドsend
を使用しています。これにより、同じチャンネルにメッセージを送信することが可能です。
4. さいごに
Discord Botの開発には、APIリファレンスを読みながら進めるのが一番良い方法だと思います。ただし、リファレンスは非常に難しいので(筆者も完全には理解していませんが)、使用する機能を掻い摘んで説明していきたいと思います。
次回もDiscord Botについての記事を書く予定ですので、ぜひフォローしていただけると幸いです。また、コメント等も寄せていただければ嬉しいです!
ここまで読んでいただき、ありがとうございました!
参考文献