広告 Discord Python プログラミング 入門

PythonでDiscord Bot開発(あいさつBot)by discord.py

2021年4月14日

記事投稿が滞ってしまい申し訳ありません。
少しずつ更新はしていきますのでお待ちいただけると幸いです。

さて、プログラミング教育やらが各地で始まっているようですね。
その中でPythonに触れている人は結構多いのではないでしょうか?
Pythonでプログラミングをやり始めて色々作りたくなって、普段Discordを使用している人はBotを作ってみたいとなるかもしれませんね。

というわけで、今回はPythonを使用してDiscordのBot開発をしていこうと思います。
今回のテーマはあいさつBotです。
まぁ、簡単に言えば私が「おはよう」と入力するとBotが「おはようございます、○○さん」と返してくれるような簡単なBotです。
まずはこれくらい簡単なBotからやっていきましょう。

開発環境の準備

Pythonの開発環境構築は以下の記事を参考にしてください。

[st-card-ex url="https://www.dice-programming-etc.com/%e6%96%b0%e7%b1%b3%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9e%e3%83%bc%e3%81%ab%e3%82%88%e3%82%8bpython%e5%85%a5%e9%96%80-helloworld%ef%bd%9e%e7%b9%b0%e3%82%8a%e8%bf%94%e3%81%97/" target="_blank" rel="nofollow" label="" name="" bgcolor="" color="" readmore=""]

環境構築が完了したら開発に必要なライブラリをインストールしていきましょう。
ライブラリのインストールにはpipというコマンドを使用しますが、コマンドプロンプトに以下のコマンドを打っても「そんなコマンド無いよ」と言った感じのメッセージが返ってきた場合はうまくPATHが通っていないということになるのでまずはPATHが通っているか確認しましょう。

pip --version

PATHが通っていない場合は以下の記事を参考にPATHの設定をしてみてください。

[st-card-ex url="https://www.javadrive.jp/python/install/index3.html" target="_blank" rel="nofollow" label="" name="" bgcolor="" color="" readmore=""]

PATHが通っている場合は次のコマンドを入力してdiscord.pyをインストールしましょう。

pip install -U discord.py

Discordのトークンが後々必要になりますが、トークンについては以下の記事で解説していますのでそちらを参考にして下さい。

[st-card-ex url="https://www.dice-programming-etc.com/javaでdiscord-bot開発(javacord)/" target="_blank" rel="nofollow" label="" name="" bgcolor="" color="" readmore=""]

コーディング開始!

さて、簡単なBotなのでそこまでプログラミングの知識が無くても大丈夫だと思います。
Visual Studio Codeでフォルダを開いて作業をすると色々と楽なので、まずは作業用フォルダを作成して開きましょう。

フォルダーを開くを選択し、作業用フォルダを選択して開いてください。
すると以下のような画面になると思います。

赤丸で囲ったアイコンをクリックして「hello.py」というファイルを作成しましょう。
以下の内容を丸写しすれば「おはよう」と入力するとBotが「おはよう!○○さん!」と返してくれる簡単なBotが完成します。
ひとまず、丸写ししてから解説していきましょう。

import discord
import re

class Hello(discord.Client):
    
    async def on_ready(self):
        print(f'Logged on as {self.user}!')

    async def on_message(self, message):
        channel = message.channel
        if message.author != self.user:
            print(f'Message from {message.author}: {message.content}')
            if re.compile(u"おはよう").search(message.content):
                msg = f'{message.author.mention}おはよう!{message.author.name}さん!'
            elif re.compile(u"こんにちは").search(message.content):
                msg = f'{message.author.mention}こんにちは!{message.author.name}さん!'
            elif re.compile(u"こんばんは").search(message.content):
                msg = f'{message.author.mention}こんばんは!{message.author.name}さん!'

            await channel.send(msg)

client = Hello()
client.run('トークン')

トークンの部分には別記事を参考に取得したトークンを入力してください。

import discord
import re

まずここについてですが、1行目はdiscordのBotを作る上で必須となるので必ずimportしましょう。
2行目は正規表現で使用します。
正規表現については以下の記事にまとめられています。

[st-card-ex url="https://techacademy.jp/magazine/15635#:~:text=Pythonの正規表現と,行うことができます。" target="_blank" rel="nofollow" label="" name="" bgcolor="" color="" readmore=""]

class Hello(discord.Client):

これは「discordのクライアントを使用するクラスとして定義する」という意味でとらえてください。

async def on_ready(self):
    print(f'Logged on as {self.user}!')

このメソッドはbotが起動した時に実行される処理を記述します。
今回はコンソールにLogged on as ボット名!と言う感じで表示されます。
selfという部分はそのままの意味で自分自身を指します。

asyncについては非同期処理と言うものに使用しているということだけ理解していただければここでは問題ないです。

async def on_message(self, message):
    channel = message.channel
    if message.author != self.user:
        if re.compile(r"おはよう").search(message.content):
            msg = f'{message.author.mention}おはよう!{message.author.name}さん!'
        elif re.compile(r"こんにちは").search(message.content):
            msg = f'{message.author.mention}こんにちは!{message.author.name}さん!'
        elif re.compile(r"こんばんは").search(message.content):
            msg = f'{message.author.mention}こんばんは!{message.author.name}さん!'

        await channel.send(msg)

さて、本命です。

channel = message.channel

まずはここ。
ユーザーが発言をしたチャンネルを取得しています。

if message.author != self.user:

これを入れないと無限ループ的な現象に陥ってしまいます。
「メッセージを送信したのがbot自身ではない場合」という分岐をしています。
これを入れないとbotからのメッセージに対しても返信をしてしまい、さらに返信に対して返信して……の繰り返しになってしまいます。

if re.compile(r"おはよう").search(message.content):
    msg = f'{message.author.mention}おはよう!{message.author.name}さん!'
elif re.compile(r"こんにちは").search(message.content):
    msg = f'{message.author.mention}こんにちは!{message.author.name}さん!'
elif re.compile(r"こんばんは").search(message.content):
    msg = f'{message.author.mention}こんばんは!{message.author.name}さん!'

await channel.send(msg)

あえて「おはよう」以外にも返信するようにしました。
1行目は送信されてきたメッセージに「おはよう」が含まれているか否かを判別しています。
3行目は送信されてきたメッセージに「こんにちは」が含まれているか否か、
5行目は送信されてきたメッセージに「こんばんは」が含まれているか否かを判別してそれに対応したメッセージを変数msgに登録しています。
8行目でmsgに登録したメッセージを発言があったチャンネルに送信します。

message.author.mention
message.author.name

この部分ですが、1行目の方がメッセージを送信した人へのメンションを表し2行目の方はメッセージを送信した人の名前を表します。

client = Hello()
client.run('トークン')

1行目でインスタンスを作成して、2行目で実行しているイメージです。
実行する時にトークンが必要になります。
トークンについては上の方で参考記事をあげましたが、こちらにも記載しておきます。
私の書いた記事ですが参考にしていただければ幸いです。

[st-card-ex url="https://www.dice-programming-etc.com/javaでdiscord-bot開発(javacord)/" target="_blank" rel="nofollow" label="" name="" bgcolor="" color="" readmore=""]

Botを動かそう!

ということで作成したBotを動かしましょう。
トークンが入力されていることを確認して、今回作成した「hello.py」があるフォルダをコンソールで開きましょう。
そうしたらhello.pyを実行します。

cd C:\Python\hello
py hello.py

Logged on as ボット名#xxxx!  << こんな感じに表示されれば実行できています。

実際に実行した結果を載せておきますね。

こんな感じに返信をしてくれるBotができていれば成功です。
もし上手くいかない等ありましたらコメントやお問い合わせフォームからお願いします。

まとめ

お疲れ様でした。これで簡易的なBotが完成しました。
今回のBotは初歩の初歩です。ここから拡張するもよし、自分で一から作るも良しです。
当サイトでは様々な言語でDiscord Botの開発方法を紹介しています。自分にあった言語で開発してみてください。

[st-card-ex url="https://discordpy.readthedocs.io/ja/latest/index.html" target="_blank" rel="nofollow" label="" name="" bgcolor="" color="" readmore=""]

[blogcard url=https://discordpy.readthedocs.io/ja/latest/index.html]

-Discord, Python, プログラミング, 入門
-,