Discord Botの作り方 超初心者向け #01

# はじめに
※このシリーズは自分がものすごく暇なため記載していくQiitaです。
本記事は#00を読んだことを前提として進めますので
もし読んでない人は一度読んでから来てください
(わかる人はこのまま見てもらってもいいと思います)

# 使用環境 (特に気にしなくていいです)
エディター VisualStudio Code
ランタイム Python 3.12.4

# 今回の目標
メッセージを読み取ってこだまするBotを作る

#イメージ手順
Bot起動
↓
メッセージ受信
↓
内容取得
↓
メッセージ送信

## 手順1 Try
前回VisualStudio CodeとPythonを実行する環境を導入し、
DiscordBotのトークンを取得しました
ここからは簡単にコードの意味を説明しながら書いていきます

VisualStudioを開いて左上のタブ"ファイル"を押して"新しいファイル"をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793169/e18857b7-0f76-88b7-44c2-9d31bb47b4e6.png)
このような空白のファイルができればOKです

細かく説明しても多分分かりにくいのでコードに説明を含めようと思います
```py
import discord #discord.pyを読み込む

token = "ここにdiscordで取得したトークンを入れる" #変数tokenに =" "の内容を入れる

intents = discord.Intents.all() #変数intentsに discord.Intents.all()をいれる
client = discord.Client(intents=intents) #変数client に discor((((省略))))

#通常なら
#この辺りに
#処理するコードを
#入れます

client.run(token) #botを実行するときのコード intentsをdiscord.Clientに入れたものにtokenを入れてrun(実行)
```
このコードはとりあえずdiscord botを起動するコードです
何かを処理するコードなどは入れておらず最小限での場合です
=>つまりれらのコードはどんなBotであっても必ず含める必要があるということです

そのうち慣れるので深く考えず"こういうものなんだなっ"と思っててください

実行してみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793169/20b8a834-6ed2-4cc5-027d-2b4367f47cb9.png)
このように表示されたら成功です！
Next Step!

## 手順2 メッセージを受信
discordのeventについて簡単に説明します
discord上で行われたアクション(メッセージ受信,メンバーの参加,その他すべて)を検知して、
それをスタートとしてプログラムを実行するためにeventというものが存在します

Scratchなどでいう"🚩が押されたとき"というやつです(知らなかったらｽｲﾏｾﾝ)
それの"メッセージが送信されたとき"がdiscord.pyにありますので
メッセージが送信されたときに表示するコードを書いてみます！
```py
import discord #discord.pyを読み込む

token = "ここにdiscordで取得したトークンを入れる" #変数tokenに =" "の内容を入れる

intents = discord.Intents.all() #変数intentsに discord.Intents.all()をいれる
client = discord.Client(intents=intents) #変数client に discor((((省略))))

@client.event #Discordのイベント
async def on_message(message): #on_message(メッセージを受信したとき~)
    print("メッセージを受信しました") #表示

client.run(token) #botを実行するときのコード intentsをdiscord.Clientに入れたものにtokenを入れてrun(実行)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793169/6beb9414-a538-6d49-57b2-08aeb9bee85c.png)
メッセージを送信するとこのようになります!

## 手順3 メッセージを送信
受信したチャンネルに対してメッセージを送ってみましょう

メッセージを送信する際に必要なのはchannelというものが必要になります
このchannelはチャンネルidなどから取得することもできますが、
メッセージを受信した際は受信内容からchannelを取得できます

> メッセージからchannelの取得
メッセージを受信したとき "message"というものが渡されます
この中には送信者の名前,id,場所,その他いろいろが含まれています
channelを取得するのは簡単で
message.channel
だけでOK

取得したメッセージで送信します
```python
await message.channel.send("受信しました!")
```
このコードをprint()があった部分に上書きします
これで実行してみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793169/eebe5414-bb9a-ff10-40f3-af3dd2932882.png)
このようにー、、

普通に忘れていました
これはbot自身が送信したメッセージを受信して再度送信したということですね

これを防ぐにはこのようなコードでbotかどうかを判断しないといけません
```python
@client.event #Discordのイベント
async def on_message(message): #on_message(メッセージを受信したとき~)
    if message.author == client.user: # 送信者がbot自身かどうかを調べる
        return # キャンセル
    await message.channel.send("受信しました!")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793169/1e940f61-3523-b41a-aa31-dab3d0a82abb.png)
完璧です！

## 手順4 受信したメッセージを取得して送信
先ほども言いましたがon_messageで渡される"message"には様々な情報が含まれています

> messageからメッセージ内容を取得
"message.content"
だけでOK!

```python
@client.event #Discordのイベント
async def on_message(message): #on_message(メッセージを受信したとき~)
    if message.author == client.user: # 送信者がbot自身かどうかを調べる
        return # キャンセル
    print(message.content) #message.contentを表示
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793169/430bd3d6-f8de-dce3-3349-e5cd6b2bc102.png)
これを先ほど説明した送信するコードに入れてみましょう

```python
@client.event #Discordのイベント
async def on_message(message): #on_message(メッセージを受信したとき~)
    if message.author == client.user: # 送信者がbot自身かどうかを調べる
        return # キャンセル
    await message.channel.send(message.content) # message.contentをmessage.channelに送信
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793169/a9a12f1f-917e-6ab4-11b1-27124cd1960c.png)

# まとめ
Discord botはいうほど難しくありません
すべて意味があったり、確実に入れないと聞けない決まった文があったり様々です！

今のところ同じ内容を返すこだまbotですが、どんどん面白くなっていくので
次を楽しみにしててください!(1日1記事頑張ってる最中です👍)

**Developer Hub**
プログラマー達があつまるコミュニティを作成中！
https://discord.gg/kp9rVqJsn9