1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

参考にした記事

この記事を書いたモチベーション

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

1) アプリケーションの作成

https://discord.com/developers/applications
にアクセスして、New Applicationのボタンをクリックする

1_New_Application.png

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

2_Create_An_Application.png

3) MESSAGE CONTENT INTENTを有効にする

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

3_Bot_Settings.png

4) Tokenを取得する

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

4_Reset_Token.png
4-2_Reset_Token.png

5) BotをDiscordサーバーに登録する

OAuth2>URL Generatorメニューで
・SCOPES:botをチェック

5_Add_Bot.png

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

5-2_Add_Bot.png

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

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

5-4_Add_Bot.png

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

5-5_Add_Bot.png

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

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

5-8_Add_Bot.png

6) Pythonダウンロード&インストール

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

11) デプロイ

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

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?