【Part2】Pythonで簡単Discord Bot開発入門 - オウム返しボットを作ってみよう！

## はじめに

### Part1

https://qiita.com/als/items/cb078585ac212285c671#%E9%87%8D%E8%A6%81

この記事では、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-%E6%BA%96%E5%82%99%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
- [2. オウム返しをするプログラムの作成](#2-%E3%82%AA%E3%82%A6%E3%83%A0%E8%BF%94%E3%81%97%E3%82%92%E3%81%99%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E4%BD%9C%E6%88%90)
- [3. プログラムの説明](#3-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E8%AA%AC%E6%98%8E)
- [4. さいごに](#4-%E3%81%95%E3%81%84%E3%81%94%E3%81%AB)

## 1. 準備・インストール

### 1-1. 仮想環境の用意

ライブラリ等をインストールする際、環境の競合を避けるためにPythonの仮想環境を用意します。以下のコマンドで仮想環境を作成し、有効化します。

```bash
python3 -m venv <仮想環境の名前>
source <仮想環境の名前>/bin/activate
```

仮想環境を無効化するには、以下のコマンドを実行します。

```bash
deactivate
```

### 1-2. discord.pyのインストール

仮想環境内で以下のコマンドを実行し、discord.pyをインストールします。

```bash
pip install discord
```

## 2. オウム返しをするプログラムの作成

このプログラムを作成するには、[Part1](https://qiita.com/als/items/cb078585ac212285c671)で作成したアクセストークンが必要です。トークンを忘れた場合は、[Discord Developer](https://discord.com/developers/applications)から再発行してください。

以下のサンプルコードを`testbot.py`として保存します。

```python: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. 実行

以下のコマンドでプログラムを実行します。

```bash
python3 testbot.py
```

### 2-2. 実行結果

![スクリーンショット 2024-05-02 222835.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629527/e2d0fc19-ae33-8ed0-8bad-20848993e550.png)


## 3. プログラムの説明

ここからより専門的な内容に入っていきます。よくわからないって方は読み飛ばしていただいて構いません。後々Discord.pyについての解説も出そうと思います。

### 3-1. `@client.event`について

`@client.event`は、Clientオブジェクトのメソッドの一つで、受け取るイベントを登録するデコレータとして使用されます。Clientが受け取る様々なイベント（メッセージの受信、サーバー権限の変更など）は、`Client.event()`を使用して登録できます。

Clientの詳細については、[Discord.py APIリファレンス](https://discordpy.readthedocs.io/ja/latest/api.html?highlight=event#client)を参照してください。

discord.pyのAPIは、基本的にオブジェクト指向（クラス）を利用したものです。オブジェクト指向に不慣れな方には、とっつきにくいかもしれません。

### 3-2. `async def on_ready()`と`async def on_message(message)`について

これらは、`client.event`に登録したイベントです。[リファレンス](https://discordpy.readthedocs.io/ja/latest/api.html?highlight=event#event-reference)には、多くのイベントが説明されています。今回使用したのは、`discord.on_ready`（起動時に実行される関数）と`discord.on_message(message)`（メッセージの受信時に実行される関数）です。

これらの関数は、クラスメソッドとして実行されるため、再定義もしくはClientを継承してサブクラスを作成し、オーバーライドする必要があります。

### 3-3. `await message.channel.send()`について

非同期処理を行うため、`async`と`await`を使用します。`Message`クラスの詳細は、[こちら](https://discordpy.readthedocs.io/ja/latest/api.html?highlight=event#discord.Message)を参照してください。

ボットが受け取ったメッセージにそのまま返信したい場合は、`Message`クラスのメソッド`reply`を使用します。例えば、`message.reply("返信したいメッセージ")`のように記述します。

今回は、生のメッセージを送信したいので、受け取ったメッセージのテキストチャンネルを意味する`message.channel`に対して、送信メソッド`send`を使用しています。これにより、同じチャンネルにメッセージを送信することが可能です。

## 4. さいごに

Discord Botの開発には、[APIリファレンス](https://discordpy.readthedocs.io/ja/latest/api.html?highlight=event#)を読みながら進めるのが一番良い方法だと思います。ただし、リファレンスは非常に難しいので（筆者も完全には理解していませんが）、使用する機能を掻い摘んで説明していきたいと思います。

次回もDiscord Botについての記事を書く予定ですので、ぜひフォローしていただけると幸いです。また、コメント等も寄せていただければ嬉しいです！

ここまで読んでいただき、ありがとうございました！

## 参考文献

https://ja.wikipedia.org/wiki/Discord.py

https://discordpy.readthedocs.io/ja/latest/api.html