Discord BOT作成メモとDiscordpy用BOTテンプレート配布

割引あり

こんにちは、Rcatです。
最近なにかとDiscordのBOTを使う機会が多いので、メモを残します。
具体的にはBOTアカウントの作り方と、discordpyを使ったPythonスクリプトでのBOTの動かし方についてです。
メモなので何かあり次第更新しますのでスキしておくといいかも。


BOT(アプリ)作成手順

BOT管理のページへアクセス
https://discord.com/developers/applications

New Applcationをクリック

名前を入力して作る

BOTにアクセスするためのトークンを作成
リセットボタンで生成できる
ばれると誰にでもBOTの制御が可能なのできちんと管理すること
今回は自分だけで使うのでPUBLIC BOTはオフ

招待用のURLを作成
OAuth2からURL Generatorをクリック
SCOPESでbotを選択

権限付与画面が現れるので必要なものにチェック

最後に最下端のURLにアクセスして、自分が管理するサーバーに追加


Discord.pyメモ

自分がやったことのうち、ちょっと複雑だったり簡単には出てこない情報まとめ

サーバーを取得する

サーバーはguildオブジェクトであり、clientオブジェクトから参加しているサーバーをリストで取得可能。
自分用の一個だけなら下記で取得できる

SERVERS = client.guilds
Server = SERVERS[0]

チャンネルを検索する

サーバー内のチャンネルリストから名前で検索可能

channel = discord.utils.get(Server.channels, name="チャンネル名")

メッセージが来たチャンネル / カテゴリ名を取得する

.name == "名前"等で分岐に使える

message.channel.name
message.channel.category.name

カテゴリの中に新規チャンネルを作る

サーバー内のカテゴリオブジェクトを取得後、テキストチャネルを新規作成する際にカテゴリを渡すことで中に入る

cat = discord.utils.get(Server.categories, name=カテゴリ名")
await Server.create_text_channel(name="てすと",category=cat )

チャンネルを削除する

チャンネルを作るのはサーバーオブジェクトからですが、削除はチャンネルオブジェクトから行います。
下記例では、名前でチャンネルオブジェクトを取得してから削除を行っています。

test = discord.utils.get(Server.channels, name="test")
await test.delete()

チャンネルを指定してメッセージを送信する

メッセージ受信時のイベントか、サーバーから直接取得したチャンネルオブジェクトを使って送信できる

#イベントの場合
message.channel.send("メッセージ")

#既存のチャンネルがある場合
channel.send("メッセージ")

送信済みメッセージを編集する

メッセージは後で編集できます。
事前にメッセージのオブジェクトを残しておくとよい
全て名前付き引数なので、"content"は必須。

msgobj = channel.send("メッセージ")
msgobj.edit(content="編集後のメッセージ")

メッセージに返信する

特定のメッセージに対して返信を行うことができます。
基本的にメッセージの送信と同じです。

message.reply("ここに返信したいテキストを入れる")

画像を添付する

sendにfile=でdiscord.Fileオブジェクトを渡すことで添付可能。
私はファイルから読むのではなく直にバイナリ使いたかったので以下でのみ試している。

send("画像付きメッセージ",file=discord.File(io.BytesIO(binary),"img.png"))

#画像付きを編集する場合は画像も貼りなおさないと消える。また、"attachments"という表現に変わる。
message.edit(content="編集後メッセージ",attachments=message.attachments)

返信されたメッセージの元のメッセージを取得する

返信されたメッセージには参照がついており、そこから元のメッセージをたどることができます。
返信されたメッセージには"reference"がついているので、そこからIDを取得後、メッセージを検索してオブジェクトを取得します。
referenceがメッセージオブジェクトであるわけではないので注意。

oldmsg = channel.fetch_message(replymsg.reference.message_id)

Discordpy 2.0以降で"discord.Intents.all()"でログインできない事象

特定の設定をしないと、以下のような感じでいつまでたってもBotがログインしないことがあります。

この記述をすると
永遠にこれ

下記画像の部分のスイッチがデフォルトだとOFFなのでONにしてください

ログインできるようになります

Discordpy用テンプレート配布

以下の記事で紹介しているBOTを作成する、またはその過程で要素の追加を行ったBOTのテンプレートを配布します。
Discordpyは便利ですが、ちょっと深いところまで操作しようとすると途端に情報が無くなってきますね…。
というわけでその辺を全て詰め込んだテンプレートです。
どんな情報が入っているかは参考記事の方をご確認ください。

配布URL

https://script.google.com/macros/s/AKfycbysRqb7488rvLGPqOOhGlr0w513zIHC67BEPzJtPAKrAc4lKfDCmsB0mVL1Ha5BY5P0/exec?name=DiscordBOT_テンプレート

ここから先は

66字

情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。