Discordボットの招待リンクは、単なるOAuth2の認可URLです。そのscopeパラメーターは、どの種類のアクセスが要求されているか(ボットアカウント、スラッシュコマンド、またはその両方)を決めます。permissionsの数値は、ボットアカウントが参加した後に何ができるかを決めます。そして、そのすべてが有効になる前に、サーバーの管理者が全体を承認しなければなりません。この2つのパラメーターを理解していれば、安全な招待リンクを作れます。完全に説明できないリンクをコピーするのとは、大きな違いがあります。

An OAuth permission checklist gets reviewed, Administrator is unticked, and the bot joins online. Permissions Kick Members Manage Messages Administrator Authorize YourBot Online

招待リンクの構造

典型的なボットの招待リンクは、次のようになります。

https://discord.com/oauth2/authorize?client_id=123456789&permissions=268446800&scope=bot%20applications.commands

  • client_id:アプリケーションの公開IDです。共有しても安全で、そのボットのすべての招待リンクに含まれています。
  • scope:要求しているアクセスの種類です。スペース区切りで指定し、URLエンコードでは%20になります。
  • permissions:要求しているすべてのサーバー権限を表す、1つの数値です。各権限の値を合計したものです。
  • guild_idとdisable_guild_select(任意):特定のサーバーを事前に選択し、選択画面をそのサーバーに固定します。サーバーごとの「ここに追加」ボタンに便利です。

「bot」スコープ

これは、実際にボットをサーバーのメンバーとして追加するものです。メンバー一覧に、横にボットのタグが付いて表示されるエントリーです。このスコープがなければ、何も参加しません。認可すべきボットアカウントが存在しないからです。

「applications.commands」スコープ

これは、アプリケーションのスラッシュコマンド、ユーザーコマンド、メッセージコマンドを登録し、そのサーバーで使えるようにします。技術的には、botスコープだけでもボットは参加できます。しかし、誰かが/と入力しても、そのボットの/コマンドは表示されません。サーバーがコマンドの登録を許可していないからです。

ほとんどの場合、両方が必要な理由

botだけで招待されたボットも、メッセージを投稿したり、自分が送ったメッセージのボタンに反応したり、スラッシュコマンドを必要としないものに応答したりできます。しかし、現代のDiscordユーザーはコマンドを期待しています。コマンドを登録できないボットは、正常に動いていても壊れているように見えます。Noxyrが生成するすべての招待リンク、そして正当なボットのほぼすべての招待リンクには、まさにその理由から両方のスコープが一緒に含まれています。

権限の数値を読み解く

メッセージの送信、ロールの管理、メンバーのキックといった各Discord権限は、ビットフィールドの中の1ビットです。2のべき乗のフラグです。招待リンクの数値は、同時に要求されているすべてのフラグの合計です。permissionsが8のリンクは、ただ1つのことを要求しています。管理者、つまりサーバーへの完全で無制限のアクセスです。よく作られた招待リンクは、Discordが提供するすべてではなく、ボットのコードが実際に使う特定のフラグだけを合計します。チケットのチャンネルを作成するためのチャンネル管理、認証用ロールのためのロール管理、レイド対策の対応のためのモデレーション操作などです。

管理者権限は要件ではなく、警告サインである理由

正当なボットのほとんどは、管理者権限を必要としません。それを要求するのは、ほぼすべての権限に同時に触れる何かに対する本当の、まれな必要性か、あるいはもっと多くの場合、手に取りやすい数字だからという理由でpermissionsが8のまま貼り付けて作られた、素早く作られたボットです。それはまた、セットアップ中にDiscordがサーバーオーナーに表示する最も恐ろしい画面でもあります。そのため、招待が完全に拒否されたり、後に権限を整理しようとする人がボットを削除したりする、よくある原因になります。認可をクリックする前に、Discordの権限計算ツールで任意の招待リンクの権限の数値を解読し、何が求められているかを正確に確認できます。

例:Noxyrの招待リンクの作り方

Noxyrは管理者権限を要求するのではなく、機能が実際に使う特定の権限から招待を作っています。チケットと認証のためのチャンネル管理とロール管理、アンチヌークの対応のためのメッセージとモデレーションの権限です。そのリスト以外は含みません。また、常にbotとapplications.commandsの両方のスコープを含んでいるため、参加した瞬間からコマンドが動きます。

その他のOAuth2スコープ

Discordは、botとapplications.commands以外にも数十個のOAuth2スコープを定義しています。その大半、たとえばidentifyやguilds.joinは、ボットの招待ではなく、「Discordでログイン」のようなWeb認証に属するもので、標準的な招待リンクには一切出てきません。見ているリンクが、botと一緒に見慣れないものを要求している場合は、認可する前にそのスコープが実際に何を許可するのかを確認する価値があります。アカウント連携も提供するサービス以外で、ボットの招待に追加のWeb認証スコープが正当に必要なケースは珍しいからです。

自分のカスタムボットの招待リンクを作る

Discord Developer Portalでアプリケーションを作成したら、OAuth2タブのURLジェネレーターが、このリンクをチェックボックスで作ってくれます。スコープでbotとapplications.commandsにチェックを入れ、ボットに必要な権限にもチェックを入れてから、結果をコピーします。URLと権限の数値を手作業で組み立てる必要はありません。

よくある質問

disable_guild_selectは何をしますか?サーバーの選択画面を、事前に選んだ1つのサーバーに固定します。そのため、特定のコミュニティ向けの招待リンクが、誤って別の場所にボットを追加するために使われることはありません。

ボットがボタンしか使わない場合でも、applications.commandsは必要ですか?すでに送ったメッセージのボタンだけなら厳密には不要です。しかし、スラッシュコマンドが関係した時点で必要になります。

後から権限の数値を変更すると、アクセスを遡って追加できますか?いいえ。すでに招待を承認したサーバーは、そのときに許可された内容を保持します。リンクを変更しても、影響するのは今後の招待だけです。既存のインストールで権限を増やすには、再招待して再承認する必要があります。

scope=botだけで十分ですか?ボットが参加するには十分です。しかし、applications.commandsを一緒に含めなければ、そのスラッシュコマンドは表示されません。

なぜDiscordは管理者権限に対して、これほど大きな警告を表示するのですか?サーバー全体への無制限のアクセスを要求しているからです。ボットの招待が要求できる中で、最も危険な単一の権限です。

自分のボットの招待を設定しますか?まずはDiscordアプリケーションの作成のガイドをご覧ください。その背後のコードを書くのを省略したい場合は、カスタムボットのドキュメントをお読みください。