見出し画像

【Discord.py】WEBでロール申請システムを作る(GoogleAppsScript ×Discord.py)コミュニティサーバー向け

こんにちは、Rcatです。
最近、X(旧Twitter)のDM通知が来なくなり、チャンネルを見ていただいている方からの連絡を見逃してしまうことがあり困っています。
ということで、もうXはやめてDiscordのコミュニティサーバー立ち上げました
さて、次の問題は管理です。コミュニティサーバーなので、少なくとも権限がある人のみ発言できる等工夫が必要です。
私のサーバーも権限必須なのですが、これをいちいち私がつけるのは効率が悪いです。
そこで、BotとWEBサービスを使用した申請システムを作ることにしました。
本システムは最下部で配布しています

ちなみに参加はこちら


やること

BotWEBを使ったロール申請システムを作成します。
コミュニティサーバーは基本誰でも参加が可能なので、きちんとロール(権限)を管理する必要がありますが、それをいちいち管理者が手でやるのは大変ですし、利用者もリアルタイムで応答がある方が都合がいいです。
まずはシステム概要をご覧ください

動画はこちら

システム概要

構成要素

今回の申請システムを作成するために使用する要素は下記の通りです

  • Discord BOT
    Discord.py

  • 自宅WEBサーバー
    Flask

  • 申請WEBサーバー
    Google Apps Script

動作の流れ

  1. GoogleAppsScriptで認証情報入力

  2. GoogleAppsScriptから自宅のWEBサーバーに情報を送信

  3. WEBサーバーからDiscordのBOTに指示を出す

  4. BOTは指示された人にロールを付与する

ポイント

このシステムのポイントとしては、申請の方法がWEBになっていることです。BOTとDMでもシステムは作れますが、一字一句間違いなく打ってもらわないと申請できないので微妙です(AIとか使えば別だろうけど)。
WEBを使った申請フォームであれば、画面に従って入力するだけなので簡単に申請できます。
ただしここでさらなる問題が発生します。
自宅のサーバーにアクセスさせるのはセキュリティ的にまずいということです。具体的にはグローバルIPの流出ですね。
それを回避するために、GoogleAppsScript挟んでいます。
これを使って申請してもらい、裏で自宅のサーバーにデータを送信させることで、送信先を秘匿します。

解説(GASで申請を行う)

それでは具体的なシステム解説に移ります。
解説はシステムの動作順序と同じで行います。

まずは動作を説明します。
作成したロール申請ページにアクセスすると右記のようなページが表示されます。
ここに自分のユーザーIDと取得したい権限レベル、そしてレベルに応じたパスワードを入力して申請を行います。
ユーザーIDはPC版の場合、自身を右クリックして出てくるメニューの一番下からコピーができます。
権限レベルは高い方がより多くの情報を得られたり、質問権限が得られたりします。
パスワードについては、ご存知の通り配布データに対する権限レベルです。
このサーバーを機に、配布物の権限という概念からコンテンツの権限という概念にに変更します。
パスワードの取得方法に関してはYouTubeのチャンネル概要をご確認ください。

ファイルの構成

gasのプログラムは2つのファイルからできています。
1つ目がスクリプト本体もう1つが表示用のHTMLです。

HTML

まずはHTMLの方から見ていきましょう。
さて、こちらは見てわかる通り、申請画面の内容がそのまま書いてあるだけですね。
特に難しいことはありません。普通にフォームを使ってデータを送信しているだけです。
普通と少しだけ違うところといえば、送信ボタンがJavaScriptを使って後から入ってくるところくらいでしょうか?

これを表示すると以下のようになります。

フォーム送信後の処理

次にデータ送信後の処理を見ていきましょう。
GASでは、フォームからPOSTでデータが送信された際に、doPostという関数が反応します。
これを利用して、フォームに入力された内容を取得します。
そして、入力された内容が不正ではないかを確認し、
問題がなければ自宅サーバーへアクセスのプロセスに進みます。
そして、自宅サーバーからの応答に応じて成功の可否を表示します

自宅サーバーにデータを送信

自宅サーバーへ情報を送信して申請する関数がこちらです。
ここでのポイントは、外部へのアクセス機能を使用しているところです。
まず、最初に自宅サーバーへのアクセス情報を生成します。
次にgasの機能であるURLFetchAppを使用し、自宅サーバーへアクセスします
この時GETを使って、ユーザーIDや権限の情報を含めて送信します
ちなみにBotとの通信は別途行われるので、リアルタイムで成功の可否は判断していません。
申請サーバーへアクセスが成功した時点で、申請が成功したものとみなされます。

解説(自宅WEBサーバーで情報を受信する)

このセクションからの動画はこちら
※この動画内で配布キーワードが登場します

準備中(スキしてお待ちください)

解説(BOTを使ってロールを付与する)

準備中(スキしてお待ちください)

配布情報

下記URLよりダウンロードいただけます。
なお、入手には別途追加情報が必要です。詳しくは配布ページの説明及び利用規約をご確認ください。

https://script.google.com/macros/s/AKfycbysRqb7488rvLGPqOOhGlr0w513zIHC67BEPzJtPAKrAc4lKfDCmsB0mVL1Ha5BY5P0/exec?name=ロール申請BOT

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