逆引き:メッセージ・リアクション・添付
メッセージ送信、削除、メンション、リアクションロール、添付ファイル、画像、Embed処理の詰まりどころを整理します。
この記事で分かること
- send/edit/replyの確認順
- Allowed Mentionsで通知を制御する
- 削除/一括削除の権限と制限
- 添付・Embed・画像出力の扱い
- reaction add/removeの到達確認
- cache/partial/raw eventの使い分け
コミュニティの相談ログを匿名化・一般化し、メッセージ・リアクション・添付まわりの実装相談を整理した逆引きです。
メッセージ送信・削除・メンション
send/edit/reply
send、edit、reply、Webhook送信が失敗する時の確認順です。
送信先を確認する
対象チャンネル、スレッド、Webhook、DMのどこへ送る処理なのかを先に分けます。チャンネルIDやmessage IDは公開記事に出さず、ローカルログだけで確認します。
権限と到達ログ
Send Messages、View Channel、Read Message History、Embed Links、Attach Filesなど、必要権限は操作ごとに違います。handler先頭、送信前、送信後、例外を分けて記録します。
確認ポイント
- 対象チャンネルを限定する
- Botのチャンネル権限を見る
- 返信対象messageの存在を確認する
- 例外全文を管理ログに残す
参考(公式ドキュメント)
- https://docs.discord.com/developers/resources/message
- https://docs.discord.com/developers/topics/permissions
メンションとAllowed Mentions
意図しないeveryone/role通知を避ける確認です。
通知させるかを分ける
画面にユーザー名やロール名を表示したい場合と、実際に通知を飛ばしたい場合は別です。外部入力から作った文章ではAllowed Mentionsを明示します。
外部入力をそのまま使わない
利用者が入力した文字列をそのまま送信すると、@everyone、ロールメンション、ユーザーメンションが意図せず有効になることがあります。表示用のescapeと通知用のmentionを分けます。
確認ポイント
- Allowed Mentionsを設定する
- everyone/role mentionを抑制する
- 表示用文字列をescapeする
参考(公式ドキュメント)
削除と一括削除
deleteやbulk deleteを権限、対象、制限で切り分けます。
削除できる条件を見る
削除には対象チャンネルの権限、Manage Messages、対象メッセージの状態が関係します。Bot自身の投稿だけを消すのか、利用者の投稿も扱うのかを分けます。
大量削除を雑にしない
一括削除には制限があり、古いメッセージや広すぎる範囲をまとめて消す設計は事故につながります。条件、件数、実行者、失敗件数を管理ログに残します。
確認ポイント
- 削除対象の条件を明示する
- チャンネルを限定する
- 実行前に件数を確認する
- 削除失敗を握りつぶさない
参考(公式ドキュメント)
- https://docs.discord.com/developers/resources/message
- https://docs.discord.com/developers/topics/permissions
添付・Embed・画像出力
ファイル、Embed URL、生成画像を公開できる文章へ戻す確認です。
表示方式を分ける
matplotlibなどで生成したグラフを送る場合、Discordへファイル添付するのか、外部URLをEmbedに載せるのか、本文だけを返すのかで必要権限と安全確認が変わります。
画像を記事へ入れない
スクリーンショットや添付ファイルにはToken、メール、サーバー名、外部URLが写ることがあります。websiteには画像ファイルや添付URLを入れず、ローカルで読み取った公開可能な確認手順だけを本文に戻します。
確認ポイント
- Attach Files / Embed Links権限を見る
- ファイルサイズを確認する
- 画像内の秘密情報を確認する
- 公開本文には一般化した手順を書く
参考(公式ドキュメント)
リアクションロール・ページング
reaction add/remove
reaction add/removeが届かない、対象emojiが合わない時の確認です。
イベント到達を見る
まずreaction add/removeのhandler先頭に到達しているかを確認します。対象message、対象emoji、押したユーザー、Bot自身の反応除外を分けます。
emoji比較を分ける
Unicode絵文字、カスタム絵文字、アニメーション絵文字では比較する値が違います。name、id、文字列のどれで判定しているかをログで確認します。
確認ポイント
- Bot自身を除外する
- 対象messageを限定する
- emoji name/idを確認する
- member/user取得を分ける
参考(公式ドキュメント)
cache/partial/raw event
古いメッセージや起動前メッセージのリアクションを扱う確認です。
キャッシュ前提を疑う
ライブラリは起動後に見たmessageだけをcacheしている場合があります。過去メッセージや固定メッセージを扱うならfetch、partial、raw eventのどれで補うかを決めます。
ライブラリごとの差を見る
discord.pyならraw reaction系イベント、discord.jsならpartialsやfetchの前提を確認します。過去ログのコードが現在のバージョンで同じとは限りません。
確認ポイント
- 起動後のmessageか確認する
- fetch対象を限定する
- partials/raw eventの設定を見る
- ライブラリの版を確認する
参考(公式ドキュメント)
- https://discordpy.readthedocs.io/en/stable/api.html
- https://discordjs.guide/popular-topics/reactions
リアクションロール
リアクションでロール付与/解除する機能の安全確認です。
ロール階層を見る
Botロールが対象ロールより下にあると付与できません。Manage Roles、対象ロール、対象メンバー、Botロール位置を分けて確認します。
対象を固定する
どのメッセージのどのemojiでどのロールを付けるかを設定値として持ち、広いチャンネル全体を監視対象にしないようにします。成功/失敗は管理ログに残します。
確認ポイント
- Manage Rolesを確認する
- Botロール位置を見る
- 対象message/emoji/roleを固定する
- 失敗時に理由を記録する
参考(公式ドキュメント)
- https://docs.discord.com/developers/topics/permissions
- https://docs.discord.com/developers/events/gateway
ページングUI
リアクションでページ送りするUIを現在の設計へ見直します。
状態と期限を持つ
リアクションによる前へ/次へは、誰が操作できるか、何ページ目か、timeout後どうするかを決めないと壊れやすくなります。message editの失敗も管理ログに残します。
Button/Selectへの移行を検討する
ページ送りや選択UIは、現在はButtonやSelectで実装した方が状態管理しやすい場面があります。過去ログのリアクションUIをそのまま増やさず、Interactionへの移行可否を確認します。
確認ポイント
- 操作できるユーザーを限定する
- timeout後の表示を決める
- 編集失敗を記録する
- Button/Selectで代替できるか見る
参考(公式ドキュメント)
- https://docs.discord.com/developers/interactions/message-components
- https://docs.discord.com/developers/events/gateway
添付ファイル・画像・Embed処理
ファイル添付とattachment://
ローカルファイルや生成画像をDiscordへ添付する時の確認です。
multipart送信を見る
ファイルを送る場合は、通常のcontentだけでなく、files、payload_json、attachmentsの扱いを確認します。ライブラリではFile/AttachmentBuilderなどの専用APIを使います。
Embed内画像を分ける
Embedにローカル画像を表示したい場合は、ファイルを添付し、Embed側ではattachment://filenameの形式を使う設計があります。ファイル名、拡張子、サイズ、Attach Files権限を確認します。
確認ポイント
- Attach Files権限を見る
- ファイル名を固定する
- attachment://を使うか決める
- サイズ制限を確認する
参考(公式ドキュメント)
- https://docs.discord.com/developers/reference#uploading-files
- https://docs.discord.com/developers/resources/message
- https://discordjs.guide/popular-topics/embeds
Embed画像と外部URL
外部URL、添付URL、Embed画像表示を混同しない確認です。
URLの公開範囲を見る
Embed画像に外部URLを指定する場合、そのURLがDiscordから取得できる必要があります。ログインが必要なURL、期限付きURL、削除済み添付URLは表示できないことがあります。
通知と本文を分ける
Embedの中身、message content、allowed mentions、ファイル添付は別の要素です。画像だけ届かない、本文だけ届かない、Embedだけ表示されない状態を分けます。
確認ポイント
- 外部URLが公開取得できるか
- Embed Links権限を見る
- 本文とEmbedを別々にログ化する
参考(公式ドキュメント)
画像生成・グラフ送信
matplotlibやcanvasで作った画像を送る時の確認です。
生成と送信を分ける
画像生成に失敗しているのか、保存先が違うのか、Discordへの添付で失敗しているのかを分けます。一時ファイル、Buffer/stream、ファイルパスのどれで送るかを決めます。
片付ける
一時ファイルには個人情報や集計結果が残る可能性があります。送信後に削除するか、メモリ上で扱えるならファイル保存を避けます。
確認ポイント
- 生成後に存在確認する
- ファイルサイズを見る
- 送信後のcleanupを入れる
- 画像内の秘密情報を確認する
参考(公式ドキュメント)
画像付きログの文章化
スクリーンショットや添付をwebsiteへ直接入れないための確認です。
ローカルで読む
画像や添付はローカルで内容を確認し、Token、メール、ユーザー名、サーバー名、外部URL、チャンネルIDが写っていないかを見ます。
公開本文へ戻す
画像そのもの、添付URL、ジャンプURLを載せず、読み取れた困りごとを一般的な確認手順に変換します。画像だけで判断できないものは保留し、記事を増やす根拠にしません。
確認ポイント
- 画像ファイルをwebsiteに追加しない
- 添付URLを公開しない
- 個別発言を引用しない
- 公式仕様で確認する
一次情報(公式ドキュメント)
- Discord Developer Documentation: Message Resource
- Discord Developer Documentation: Permissions
- Discord Developer Documentation: Gateway Events
- discord.py ドキュメント
- discord.js ガイド
- Discord Developer Documentation: Uploading Files
- discord.js embeds guide