pycordでdiscordbotを作る


# はじめに
discord botを作りたいと思った時に、pythonで実装したいと思ったのですが、discord.pyが2021年8月に開発が停止しているということで、代わりにそのフォークとなる[pycord](https://pycord.dev/)で実装してみることにしました
今回は、botがチャットで反応してくれる簡単なbotを実装しようと思います


# 環境
- Python 3.12.2
- py-cord 2.5.0

# botアカウントの作成
まず、[discord developer portal](https://discord.com/developers/applications)でbotアカウントを作成します。

![スクリーンショット 2024-05-03 14.50.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/4506ba88-21ee-c22e-0cee-8a9b3455bb5d.png)

右上のNew Applicationをクリックしてbotの名前を入力します
今回は"pycord test"とします

![スクリーンショット 2024-05-03 14.52.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/df49696a-348c-dfa8-6c3f-95a008defda7.png)

botの名前を入力する欄の下にあるチェックリストにチェックを入れ、Createボタンを押したらアカウントの作成はokです

# botのアカウントの設定
アカウントを作ったら下の画面になると思います

![スクリーンショット 2024-05-03 14.57.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/3085c9ee-da13-d248-bb04-b34821cb5728.png)

左のサイドバーからBotを選択して、

![スクリーンショット 2024-05-03 14.59.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/807dcc9c-f428-20ce-702b-3930f599555a.png)

下の方にあるReset Tokenでトークンを発行してください

:::note
#### トークンとは？
botにおける、ユーザーIDとパスワードにあたる文字列のことです

:::

:::note warn
発行したトークンは必ずメモをしてください
:::


トークンを発行したら、下にスクロールすると出てくるPrivileged Gateway Intentsのチェック欄３つにチェックを入れてください

![スクリーンショット 2024-05-03 15.07.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/6eee833d-f938-9f64-a5fb-96edfe3dd560.png)

:::note
#### Privileged Gateway Intentsとは
discordの高度な機能にアクセスするための設定です
それぞれにチェックを入れると以下のことができるようになる（と言われています）
- PRESENCE_INTENT
サーバーのユーザーステータスを取得できます
- SERVER_MEMBERS_INTENT
サーバーのメンバーに関する情報の取得、ロールの取得などできます
- MESSAGE CONTENT INTENT
サーバーに送信されたメッセージの取得
:::

:::note warn
これにチェックを入れないとbotの機能に制限がかかるため、一応全てチェック入れておくといいと思います
:::

# botをサーバーに参加させる

左サイドバーのOAuth2をクリックして、下の方にスクロールすると下の画像のようなOAuth2 URL Generatorというチェック欄が出てくると思います。この中にあるbotにチェックを入れます。

![スクリーンショット 2024-05-03 15.25.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/e87956d1-64de-5d51-a73a-8c559b2b7100.png)

:::note
#### OAuth(オーオース)とは
アプリケーションやサービスが、ユーザーの許可を得て、特定の情報にアクセスするなどの行動をするための認証プロトコル
:::

さらに下にスクロールすると、botの権限をどうするかBOT PERMISSIONSで設定できるので設定しましょう。今回はAdministratorに設定します。

:::note warn
今回はめんどくさいので全権限を付与できるAdministratorにしています
特定の権限を付与だけをしたい場合は、権限を個別に選択してください
:::

![スクリーンショット 2024-05-03 15.39.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/d20efad9-a5be-6428-2fc8-cbf889493537.png)

下のGENERATED URLにURLが出てくるので、それをコピーしてネットで検索をかけましょう
すると、下の画面が出てくるので、どんどんはいを押していきましょう(今回は自分で作ったサーバーにぶち込んでいます）

![スクリーンショット 2024-05-03 15.46.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/a91f19db-4928-58a5-d019-e6344618734f.png)

![スクリーンショット 2024-05-03 15.47.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/db2e96d5-a7de-a643-6cf1-0bbf766b163c.png)

この画面に来たら、botのサーバーへの招待は完了です
![スクリーンショット 2024-05-03 15.47.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/34b7ed2e-021c-bad7-4b0a-0f10179598e5.png)

:::note warn
一応、導入したサーバーに招待がしっかりされているか確認しましょう
:::

![スクリーンショット 2024-05-03 15.49.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/090fbf01-8784-b490-4774-9c3924b07ef9.png)


# 実際にコードを書いていく

ここからコーディングしていきます
まず、pycordをインストールします
```
pip install py-cord
```

まず実行ファイルmain.pyを作成してコードを書いていきます

```
import discord

# アクセストークンを設定
TOKEN = "YOUR_ACCESS_TOKEN" 

#インテントを取得
intents = discord.Intents.all()

#botの設定
bot = discord.Bot(intents=intents)

#起動するとターミナルに表示
@bot.event
async def on_ready():
    print("ready!")

# pycordがメッセージを受け取ったら実行されるイベントハンドラ
@bot.event
async def on_message(message: discord.Message):
    
    # メッセージが"hello"だった場合、"Hello!"と返信する
    if message.content == 'hello':
        await message.reply("Hello!")

#botの起動
bot.run(TOKEN)
```
このコードはメッセージで "hello"と打ったら、botがhelloと返してくれるようになっています

:::note 
@とついている部分はデコレータというものです
すでにある関数に処理の追加が出来るものです
（自分はこれを知らなかったので、書いておきます）
:::

:::note alert
on_messageは[イベントハンドラ](https://docs.pycord.dev/en/stable/api/events.html)なので、メソッド名を変更をすると、思うような動作をしません
:::

# botを起動してみる
ターミナルで以下のコードを実行すると、botを起動することができます

```
 python main.py
```
disocord上で実際動かしてみると

![スクリーンショット 2024-05-03 17.14.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/dcd532fe-6421-b450-6e43-682cd822b99e.png)

ちゃんと実行されました！


# 最後に
pycordはdiscord.pyからフォークされているのもあって、discord.pyのドキュメントに書いてあるコードが動くことがあります

discord botをpycordで作る際はそちらも参考にしてみてください（それでもわからなかった時はgpt使いました、、、）