Pythonで簡単なDiscord Botの作り方

追記 2019/1/23 Discordのページの仕様が変わっていたため内容を少し変更しました。
追記 2019/5/11 `discord.py`の使い方が多少変更されていたため、本記事に書かれているコードを新しいものに修正しました。@1ntegrale9さん報告ありがとうございます。 

# 今回作るもの
Discordで **「おはよう」** と入力すると **「おはようございます、"ユーザー名"さん！」** と返事をする簡単なBotを作ります。後から反応する言葉を変えたりできます。
ほとんど[公式Github](https://github.com/Rapptz/discord.py)にあるクイックスタートと同じ内容です。

# Discordとは
最近はやってるゲーマー用のチャットアプリです。Slackと少し似ていてボットが開発しやすい環境となっています。

# あらかじめやっておくこと
 * **Python3**の環境を作る
 * Pythonを書く**テキストエディタ**を入れていく

# discord.pyのダウンロード
discord.pyをpipを使ってインストールします。

```bash
python3 -m pip install -U discord.py
```

# Bot用のトークンを手に入れる
[DiscordのDeveloper](https://discordapp.com/developers/applications/me)のサイトに行って新しいBotを登録します

まず**Applications**で**Create an Application**をクリックします。
次に**NAME**に自分のボットの名前を書き、**Create**をクリックします。
![New App Picture](https://qiita-image-store.s3.amazonaws.com/0/194432/0bb1df1b-1105-09a6-0879-fba0c7e3848a.png)


左側にある**Bot**の欄に行き**Add Bot**をクリックして**Yes, do it**!
![Create a bot User Picture](https://qiita-image-store.s3.amazonaws.com/0/194432/9353e8a7-db62-c189-7095-8c8aaf1296f0.png)
![Yes do it](https://qiita-image-store.s3.amazonaws.com/0/194432/8078ee51-bbd6-959e-353b-4fac993814fc.png)


また同じページの**TOKEN**の欄に行って**Click to Reveal Token**をクリックし、**Token**確認します (これを後で使います)
![reveal token](https://qiita-image-store.s3.amazonaws.com/0/194432/78b3783a-5743-4db7-21be-360c2658746e.png)


最後に左側にある**OAuth2**の欄に行きます。
**OAuth2 URL GRNERATOR**の下にたくさんのチェックボックスがあると思うので、 **Bot** だけがチェックされた状態で、下に表示されているURLをコピーします。
![スクリーンショット 2019-01-23 15.12.09.png](https://qiita-image-store.s3.amazonaws.com/0/194432/95d5a12c-33ee-f117-c180-b409ba539069.png)

コピーしたURLに行くと、次のような画面が出てきます。
![スクリーンショット 2019-01-23 15.14.17.png](https://qiita-image-store.s3.amazonaws.com/0/194432/9e087198-d6ff-3d48-6da8-70ca6edb0afc.png)

自分のサーバーを選んで追加します。


# Botを書く
実際に書いていきましょう

まずはdiscord.pyのパッケージをインポートします

```python3
import discord

client = discord.Client()
```

次にBotがログインし準備が完了した時の処理を書きます
(コピペでもいいと思います)

```python3
@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')
```

返事をさせるためのコードを書きます

```python3
@client.event
async def on_message(message):
    # 「おはよう」で始まるか調べる
    if message.content.startswith("おはよう"):
        # 送り主がBotだった場合反応したくないので
        if client.user != message.author:
            # メッセージを書きます
            m = "おはようございます" + message.author.name + "さん！"
            # メッセージが送られてきたチャンネルへメッセージを送ります
            await message.channel.send(m)
```

最後にBotをスタートします

```python3
# token にDiscordのデベロッパサイトで取得したトークンを入れてください
client.run("token")
```

全体のコードをまとめて書くと

```python3:main.py
import discord

client = discord.Client()

@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')

@client.event
async def on_message(message):
    # 「おはよう」で始まるか調べる
    if message.content.startswith("おはよう"):
        # 送り主がBotだった場合反応したくないので
        if client.user != message.author:
            # メッセージを書きます
            m = "おはようございます" + message.author.name + "さん！"
            # メッセージが送られてきたチャンネルへメッセージを送ります
            await message.channel.send(m)

client.run("token")
```

# 実行してみよう
保存したファイルを実行してみましょう

```
$ python main.py
Logged in as
ユーザー名
ID
------
```

これが出力されれば正常に実行できていますです。

最後にDiscordに行ってBotのいるグループで「おはよう」と打つと返事が帰ってくるはずです！

# 最後に
反応する言葉や返事は簡単に変えられますが他の処理をいれようとした時は`async`になっていることを考慮してやってみてください。

# 参考
[discord.pyの公式Github](https://github.com/Rapptz/discord.py)