discord.py入門 その1

2023/04/21に公開

はじめに

本記事では数回に分けて、discord.pyを使ったdiscord botの作り方を解説していきます。
あくまで筆者の全て独学の知識ですので、参考の一助になれば幸いです。

対象読者は以下のような方を想定しています。

  • Pythonである程度コードを書いたことがある
  • discord botを作ってみたい
  • botの作り方がよくわからない
  • Pythonを使ったことはあるが、discord.pyを使ったことがない
  • 自分で開発したbotを無料で運用したい

学べること

  • テキストコマンドの実装
  • スラッシュコマンドの実装
  • 管理機能の実装
  • コードを分割して管理する方法 (コグ)
  • 管理しやすいコードの書き方
  • 本番環境へのデプロイ方法

本記事で作るbot

本記事では、最終的に以下のような機能のbotを作成します。

  • チャンネルのメッセージを集め、テキストファイルにして保存する
  • チャット制限機能 (特定のメンバーが発言できるかを管理)
  • botの管理機能 (ログチャンネルへ情報を送信)

Step1. 準備

discord.pyのインストール

本記事では、discord.pyを使ってbotを作成します。discord.pyというのは、discordのAPIをPythonで扱いやすくしたライブラリです。Pythonで書かれている多くのbotはdiscord.pyを使っています。以下のコマンドでdiscord.pyをインストールします。

python3 -m pip install -U discord.py

# Windowsの場合
py -3 -m pip install -U discord.py

# Linux環境の場合
$ apt install libffi-dev libnacl-dev python3-dev

本記事でのコードの動作確認は全てWindows 10で行っています。

botのアカウントの作成

以下のドキュメントに従って、botのアカウントを作成します。

Botアカウント作成

「Bot」項目の「Add Bot」ボタンをクリックして、botを作成します。その際、Privileged Gateway IntentsのSERVER MEMBERS INTENTとMESSAGE CONTENT INTENTをオンにしてください。

トークンを控え、Botを自身のサーバーに導入したら準備完了です。

Step2. Botにおうむ返しをさせてみよう

作業フォルダにbot.pyを作成して、以下のコードを書きます。

from discord.ext import commands
import discord

intents = discord.Intents.default()
intents.members = True # メンバー管理の権限
intents.message_content = True # メッセージの内容を取得する権限


# Botをインスタンス化
bot = commands.Bot(
    command_prefix="$", # $コマンド名 でコマンドを実行できるようになる
    case_insensitive=True, # コマンドの大文字小文字を区別しない ($hello も $Hello も同じ!)
    intents=intents # 権限を設定
)

@bot.event
async def on_ready():
    print("Bot is ready!")


@bot.event
async def on_message(message: discord.Message):
    """メッセージをおうむ返しにする処理"""

    if message.author.bot: # ボットのメッセージは無視
        return

    await message.reply(message.content)


bot.run("TOKEN")
python bot.py

と実行して、ログにBot is ready!と表示されれば成功です。
試しに、botのサーバーに入って、"こんにちは"と送信してみましょう。botがこんにちはと返答してくれれば成功です。

解説

botのインスタンス化や、botを起動させるコードはコメントを参考にしてください。ここでは、おうむ返しを実装する上でのキーポイントとなるon_messageについて解説します。

on_messageはメッセージが送信されたときに呼び出されるイベントハンドラで、messageという引数が渡されます。このmessageには送信内容やメッセージの作者、メッセージが作成されたチャンネル等の情報が格納されています。messageは、discord.Messageというクラスのオブジェクトです。discord.Messageには、メッセージの文字を取得するcontentという属性があります。ユーザーの送信した内容をそのまま送信するだけですので、contentreplyメソッドの引数に渡しています。replyメソッドは、メッセージを送信したユーザーに対して、メッセージ送信します。

参考: discord.Message

イベントハンドラ

discordにはコマンド以外に、「イベント」という概念があります。イベントとは、discordの様々な動作をイベントとして定義したものです。例えば、メッセージが送信されたとき、メンバーがサーバーに参加したとき、などです。イベント名はon_{イベント名}として定義されていて、それぞれのイベントが発生したときに対象の関数が呼び出されます。イベントハンドラ(各イベントに対する処理)として定義するときには、@bot.eventというデコレータ(関数に機能を追加するようなもの)をつければ大丈夫です。サンプルコードでは、on_ready(botが起動したとき)とon_message(メッセージが送信されたとき)のイベントハンドラしか参照していませんが、on_guild_join(botがサーバーに参加したとき)やon_member_join(メンバーがサーバーに参加したとき)などもあります。詳しくは公式ドキュメントを参照してください。

まとめ

いかがだったでしょうか。今回はbotのセットアップとイベントについて学習しました。次回はいよいよコマンドを実装していきます。
記事の内容について、誤りや改善点があれば是非コメントをお願いします。お疲れ様でした。

次回

GitHubで編集を提案

Discussion