Discord ボットを作ってみる

# 環境

- Ubuntu 22.04 LTS
- Python 3.10.12
- pip 22.0.2
- discord.py 2.3.2

# Discrod 側の準備

https://discord.com/developers/applications/
こちらから「New Applicaton」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1695a98c-065d-7c03-4261-3327f852c09a.png)
名前を入れて「Create」します。それに伴いAPPLICATION ID と PUBLIC KEY が発行されますが、特に使いませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/87a12f1f-a646-c0bf-2c63-0b9f3c45fe1e.png)
Bot - TOKEN を一度Reset してから Copy し、後ほど使うのでメモなどに残しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/19c764b9-d44f-1625-08ca-76a1b221a8e6.png)
intent 設定を変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/4637e031-d18b-516e-db1b-2a647f816808.png)
最初は SERVER MEMBERS INTENT のみONにしたらうまくいかなかったので全部ONにしてみました。
変更したら save しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/fabf5232-0125-66db-1e71-14f86437fc00.png)



OAuth2 で、「bot」 と「Send Messages」をクリックして出てきたURLを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d7653faa-7985-818c-70d4-b4e632aad71b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1a3545b9-7f23-bd5a-724f-d6ee3b1c2cd8.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/b5c0b099-ca2d-8edb-e282-77a24b8c6a48.png)

対象のサーバを選び、ユーザを追加します。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/8d682b8b-18a2-f551-dd72-9280a9657181.png)

サーバに追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/71833a05-f2b2-4223-e1a1-72fe42db0bdf.png)

今回は特定のチャンネルにメッセージを流すようにするので、チャンネルIDを取得します。

Discord アプリ画面でユーザー設定を開き、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/df4b4cef-f608-a708-35c2-c9c210a8b45a.png)
開発者モードをONにします。
チャンネルを右クリックして「チャンネルIDをコピー」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/b5922f4d-a057-ce0d-2cfc-32e9b97756ac.png)


# 環境変数を設定


まずプログラムの場所を作り、.env ファイルをまず作成します。



```

$ mkdir botexample
$ cd botexample
$ vim .env
```
トークンとチャンネルを記述します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/bbe46a81-7f0f-48f5-9c4e-a3b61e798f2f.png)

# python ライブラリをインストール

```
$ sudo pip3 install discord

```
# コード

```
import discord
import os
from dotenv import load_dotenv

load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')
CHANNEL_ID = int(os.getenv('CHANNEL_ID'))

intents = discord.Intents.all()
client = discord.Client(intents=intents)

@client.event
async def on_ready():
    print('ready on')
    channel = client.get_channel(CHANNEL_ID)
    await channel.send('進捗どうですか')

client.run(TOKEN)

```



# トラブルシューティング


```
  File "/usr/local/lib/python3.10/dist-packages/discord/client.py", line 704, in connect
    raise PrivilegedIntentsRequired(exc.shard_id) from None
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.
```
intent が足りませんでした。
```
NameError: name 'channel' is not defined
```

ミスタイプしてました
```
AttributeError: 'NoneType' object has no attribute 'send'
```
最初以下のようにしていたらエラーが出ました。
```
CHANNEL_ID = int(os.getenv('CHANNEL_ID'))
```
以下のように変更しました。

```
CHANNEL_ID = os.getenv('CHANNEL_ID')
```