メインコンテンツへスキップ

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にアクセスして、自分が管理するサーバーに追加

プライベートアプリケーションはデフォルトの認証リンクを持つことはできません の対策

いつからか、急にこんな表記が出るようになりました

画像

具体的には、設定でパブリックをOFFにすると出ます

画像

InstallationからInstall LinkをNoneにする

画像


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

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

画像

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

画像

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

画像

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用テンプレート配布

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

最新テンプレート紹介

本テンプレートをベースにAIを使ったコマンド実行テンプレートを実装した次期型テンプレートです。
こちらもご検討ください

配布URL

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

 
 
モノづくりが趣味。 "売ってないなら自分で作ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワーク 全部やります。 記事執筆はAI不使用。 ご連絡や利用規約はプロフィール記事参照。

あなたへのおすすめ