discord.pyでエコーBotを作る（message.contentが空になる問題も解決）

# 参考にした記事
https://gafuburo.net/how-to-discordbot/

https://qiita.com/Nnse/items/0c131023f07828449090

# この記事を書いたモチベーション
DiscordのAPIに以前パーミッション回りの変更があったらしく、
ググって見つかった記事だと、その辺りの取り扱いが古いやり方になっていたので、
令和5年最新版のやり方を残しておきたいというのが理由です。

# 1) アプリケーションの作成
https://discord.com/developers/applications
にアクセスして、New Applicationのボタンをクリックする

![1_New_Application.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184997/699b2d36-1381-0756-a082-29beeb4e5fb4.png)

# 2) アプリケーションの名前を入力する

![2_Create_An_Application.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184997/c03f3c9d-b6c5-3ba6-3fab-b9dc7223f21a.png)

# 3) MESSAGE CONTENT INTENTを有効にする
BotメニューからMESSAGE CONTENT INTENTのスイッチをONにする
Save Changesボタンをクリックする

![3_Bot_Settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184997/91c1c0dd-2acf-923f-8092-87a1722acb45.png)

# 4) Tokenを取得する
BotメニューからReset Tokenボタンをクリックする
Yes, do it!ボタンをクリックする
表示されたTokenを控えておく

![4_Reset_Token.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184997/c89800b0-5b21-a971-5f07-e6129e6a023c.png)
![4-2_Reset_Token.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184997/3f44ecd2-dc00-7f15-4056-7267cc61269e.png)

# 5) BotをDiscordサーバーに登録する
OAuth2>URL Generatorメニューで
・SCOPES：botをチェック

![5_Add_Bot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184997/8c2dfc3d-72ed-3702-e011-e7ea6eaf89dc.png)

・BOT PERMISSIONS：Read Messages/View Channels、Send Messagesをチェック

![5-2_Add_Bot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184997/ecd87bc9-5d09-cf60-d1ad-6e48d892dff2.png)

・GENERATED URLのCOPYボタンをクリックする

コピーしたURLをブラウザの別窓で開く
Botを追加するDiscordサーバを選ぶ

![5-4_Add_Bot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184997/8a426fbc-150e-25cb-5e64-9065dd06ee85.png)

Botに与えるパーミッションを確認する

![5-5_Add_Bot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184997/1274cc9e-9b95-f48d-e9d4-35dbf99eaae1.png)

ここで余分なパーミッションを与えないことはサーバを守る上で非常に重要。

人間であることを証明する
BotがDiscordサーバに登録された

![5-8_Add_Bot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184997/faaf13a4-15ce-6231-28fe-04788e910c24.png)

# 6) Pythonダウンロード＆インストール
https://www.python.org/downloads/

# 7) Discord.pyのインストール
```
py -3 -m pip install -U discord.py
```

# 8) Botアプリの作成
下記をdiscord_bot.pyとして保存する
Tokenは、4)の手順で控えたもの
Channel IDは、チャンネルを表示したときのURLの末尾の数字です
https://discord.com/channels/xxx/yyy
ならyyyの部分

```discord_bot.py
import discord

TOKEN = '[Your Token]'
CHANNELID = [Your Channel ID]

intents = discord.Intents.default()
intents.message_content=True
client = discord.Client(intents=intents)

@client.event
async def on_ready():
    print('ログインしました')

@client.event
async def on_message(message):
    if not message.author.bot:
        channel = client.get_channel(CHANNELID)
        await channel.send(message.content)

client.run(TOKEN)
```

discord.Intents.all()
を使うようになっている記事が多数見つかりますが、
3)と5)で設定したパーミッション設定だとパーミッション不足でエラーになります。

```
discord.errors.PrivilegedIntentsRequired: Shard ID None is requesting privileged intents that have not been explicitly enabled in the developer portal. It is recommended to go to https://discord.com/developers/applications/ and explicitly enable the privileged intents within your application's page. If this is not possible, then consider disabling the privileged intents instead.
```

恐らく、3)のINTENTの設定ですべてONにすればいけるような気がしますが、
不要なパーミッションは付与しないに越したことはありません。

# 9) Botを動かす
```
python discord_bot.py
```

こんな感じの表示が出ればOK

```
>python discord_bot.py
[2023-09-03 10:09:50] [INFO    ] discord.client: logging in using static token
[2023-09-03 10:09:51] [INFO    ] discord.gateway: Shard ID None has connected to Gateway (Session ID: xxx).
ログインしました
```

# 10) Botの動作を試す
動きましたね

![9_Echo_Bot_Completed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184997/15f22c53-7b5b-cd85-bc44-f637f57e7210.png)

# 11) デプロイ
一時的にBotのテストをする場合は、PC上で動かすのでも良いのですが、
運用に乗せようと思ったら、24時間稼働のサーバに乗せる必要があります。
試しにEC2サーバ立ててアプリ動かしてみたら普通に動いたので、なんらかサーバがあればよいようです。

昔はHerokuの無料枠が使えたのですが、
Herokuも含めて、時間貸しだと0.005$/hourといった感じでしょうか。
自分が見て回った感じだと、Amazon Lightsailの3.5$/moが一番安いような気がします。
それかEC2を年契約するとか、長期割引を効かせるともっと安くなるかも。