Discordに入室通知botを追加してみる

Discord サーバーで通話チャンネルに入室した際に通知してくれるだけのBotを導入したのでメモ
Google Cloud Platform の Always Free 枠にて、現状 (2024.06.21時点)無料で運用可能です


参考:
Discord Botアカウント初期設定ガイド for Developer #discord - Qiita
Not Found - クロスパワークラウドブログ
GCPの無料枠でVMインスタンスを作成 #GoogleCloud - Qiita




1 - Discord Botの準備

1 Discord Developer Portal (https://discord.com/developers/applications) を開きログイン

2 「New Application」をクリックし、アプリケーション名を入力して作成
作成後、My Applicationsから該当のアプリを選択し編集画面へ

3 左側メニューの「Bot」をクリックし、「Add Bot」をクリックしてBotを作成

4 「Reset Token」をクリックしてBotのトークンを取得し、安全な場所にメモ・保存
後から読み返すことができないので注意

5 さらに左側メニューの「OAuth2」をクリック

  • 「Redirects」の欄に以下の通り入力

https://discord.com/oauth2/authorized
  • 「OAuth2 URL Generator」を以下の通り構成
    SCOPES
    [ bot / guilds / voice / presences.read ]

    SELECT REDIRECT URL
    [ https://discord.com/oauth2/authorized ]

    PERMISSIONS
    [ View Channels / Manage Channels / Send Messages / Read Message History / Connect ]

    INTEGRATION TYPE
    [ Guild Install ]

  • 上記全て入力し、GENERATED URLにURLが表示されたのを確認する

6 「Copy」を選択してブラウザでURLを開き、接続したいチャンネルを選択し、接続



2 - Google Cloud Platform (GCP) アカウントの作成と準備

Google Cloudの無料枠はこちらから確認できます(2024.6.21現在)
無料トライアルと無料枠 | Google Cloud

1 Google アカウントを使用して、Google Cloud Platform(以下GCP)アカウントを作成
GCP コンソール (https://console.cloud.google.com/) にログイン

2 新しいプロジェクトを作成する
プロジェクト名を入力し、必要に応じてプロジェクト ID を編集

3 作成したプロジェクトを選択

4 Compute Engine の設定
(この際にクレジットカードの設定を要求されるので設定が必要)

5 GCP コンソールのメニューから「Compute Engine」→「VM インスタンス」を選択し、「インスタンスを作成」をクリック

6 以下の設定でインスタンスを構成:

  • 名前:任意の名前を入力(例:「discord」)

  • リージョン:us-west1 などのAlways Free対応リージョンを選択
    ※無料で使用できるのは
    [ オレゴン:us-west1 / アイオワ:us-central1 / サウスカロライナ:us-east1 ]の3つ(2024.6.21現在)

  • ゾーン:自動選択
    us-west1でa, b, cの3つがあるが、どれを選んでも問題ない

  • マシンの構成: E2
    無料なのはE2のみのため

  • マシンタイプ: e2-micro (vCPU 2個、メモリ 1 GB)
    ※デフォルトだとマシンタイプが異なるものが選択されているので注意!

  • ブートディスク
    OS: Debian
    バージョン: GNU/Linux xx (最新版あたりを選択)
    サイズ: 20 ~ 30 (30まで無料なので30で良さそう)

  • ファイアウォール:HTTPSトラフィックを許可するにチェックを入れる

7 詳細オプションを開いて、更にネットワーキングを開く

  • [ネットワークインターフェイス]内のグレーになっている
    default default(xx.xx.xx.xx/xx) の ∨ をクリックし「ネットワークインターフェースの編集」を表示させる

8 「”外部”IPv4アドレス」の欄をクリックして「静的外部IPアドレスを予約」を選択し、適当な名前をつける(例:webserver-nic)
 
※再起動するたびにIPアドレスが変動することの対策
    ※内部IPv4に静的アドレスを予約すると課金される可能性があるため、エフェメラル(自動)のままにする

9 可用性ポリシー内の「VMプロビジョニングモデル」を「標準」のまま、「VMプロビジョニングモデルの詳細設定」を開き、「ホストメンテナンス時」の欄を「VMインスタンスを移行(推奨)」に変更
※インスタンスを Spot VM として設定すると、Always Free 枠の対象外となるため

10 「作成」をクリックしてインスタンスを作成



3 - 仮想環境構築とSSH接続

※以降、この文のように行全体がコードブロックで囲われたものはSSHセッション内にペーストし、enterで実行することを想定しています
※また、コードブロックで囲われたものは指定がない限り差し替え等の処理は行わないこと

VMインスタンスの一覧で、作成したインスタンスの「SSH」ボタンをクリックし、ブラウザウィンドウでSSHセッションを開く

接続したら以下のコマンドを実行

1 必要なパッケージをインストール:

sudo apt update
sudo apt install -y python3-venv python3-pip

2 仮想環境を作成:

python3 -m venv discord_bot_env

3 仮想環境をアクティベートする:

source discord_bot_env/bin/activate

4 仮想環境内で必要なライブラリをインストールする:

pip install discord.py python-dotenv requests



4 - チャンネルのIDを調べる

Discordの各チャンネルを右クリックして「リンクをコピー」でリンクを取得するとhttps://discord.com/channels/サーバーID/チャンネルID
という構造になっており、簡単にチャンネルIDを取得できます
面倒であればこの工程は省いてURLからチャンネルIDを取得し、次の「
5 - 入室を通知する」へ進んでください

1 SSHセッションで以下を実行し.env ファイルを生成

nano .env


2 以下を入力し保存:
※macの場合Ctrl+X → Y → Enter 
※ 取得したトークン には「1 - Discord Botの準備」で取得したBOTのトークンを差し替える

DISCORD_TOKEN=取得したトークン


3 channel_id.py ファイルを作成:

nano channel_id.py


4 以下の内容を貼り付け保存:

import os
import discord
from dotenv import load_dotenv

load_dotenv()
DISCORD_TOKEN = os.getenv("DISCORD_TOKEN")

intents = discord.Intents.default()
intents.guilds = True
intents.message_content = True
client = discord.Client(intents=intents)

@client.event
async def on_ready():
    print(f'{client.user} がDiscordに接続しました!')
    if len(client.guilds) == 0:
        print("ボットはどのサーバーにも所属していません。")
    else:
        for guild in client.guilds:
            print(f"Guild: {guild.name} (ID: {guild.id})")
            for channel in guild.channels:
                print(f"- {channel.name} (ID: {channel.id}, Type: {channel.type})")

client.run(DISCORD_TOKEN)

5 以下を入力し実行することで、チャンネルIDの一覧が表示される:

    python channel_id.py

監視したいボイスチャンネルと通知先のテキストチャンネルのIDをメモ

6 メモしたら ctrl+C で戻る



5 - 入室を通知する

1 .env を以下で開く

nano .env

2 ファイルを編集して以下のように書き換える:

取得したトークン には「1 - Discord Botの準備」で取得したBOTのトークンを差し替える
監視したいボイスチャンネルのID には「4 - チャンネルのIDを調べる」で取得した、監視したいボイスチャンネルのIDを差し替える
通知を送信したいテキストチャンネルのID には「4 - チャンネルのIDを調べる」で取得した、通知を送信したいテキストチャンネルのIDを差し替える

DISCORD_TOKEN=取得したトークン
VOICE_CHANNEL_ID=監視したいボイスチャンネルのID
TEXT_CHANNEL_ID=通知を送信したいテキストチャンネルのID

3 以下を入力し bot_text_channel.py ファイルを作成:

nano bot_text_channel.py

4 以下の内容を貼り付け保存:

import os
import discord
from dotenv import load_dotenv

load_dotenv()
DISCORD_TOKEN = os.getenv("DISCORD_TOKEN")
VOICE_CHANNEL_ID = int(os.getenv("VOICE_CHANNEL_ID"))
TEXT_CHANNEL_ID = int(os.getenv("TEXT_CHANNEL_ID"))

intents = discord.Intents.default()
intents.voice_states = True
intents.message_content = True
client = discord.Client(intents=intents)

@client.event
async def on_ready():
    print(f'{client.user} がDiscordに接続しました!')
    print(f'BOTは以下のサーバーに参加しています:')
    for guild in client.guilds:
        print(f'- {guild.name} (id: {guild.id})')
    
    voice_channel = client.get_channel(VOICE_CHANNEL_ID)
    text_channel = client.get_channel(TEXT_CHANNEL_ID)
    
    if voice_channel:
        print(f'監視中のボイスチャンネル: {voice_channel.name}')
    else:
        print(f'ID {VOICE_CHANNEL_ID} のボイスチャンネルが見つかりませんでした')
    
    if text_channel:
        print(f'通知を送信するチャンネル: {text_channel.name}')
    else:
        print(f'ID {TEXT_CHANNEL_ID} のテキストチャンネルが見つかりませんでした')

@client.event
async def on_voice_state_update(member, before, after):
    if before.channel != after.channel:
        if after.channel and after.channel.id == VOICE_CHANNEL_ID:
            text_channel = client.get_channel(TEXT_CHANNEL_ID)
            if text_channel:
                await text_channel.send(f'**{member.name}** さんがボイスチャンネル **{after.channel.name}** に参加しました')

client.run(DISCORD_TOKEN)



6 - Botの実行

1. VM インスタンスのセッションが切れても Bot が動作し続けるように、screenを使用して常時稼動させる

sudo apt-get update
sudo apt-get install screen
screen -S discord_bot
source discord_bot_env/bin/activate

※画面上ではこれまでの入力がいったん消えたように見えますが仕様です

2. 以下のコマンドでBotを起動:

python bot_text_channel.py

サーバーのメンバーにDiscord Developer Portal で作成したbotが追加されていることを確認する

3. ブラウザごと閉じるまたはデタッチ
※macの場合Ctrl+X → Y → Enter 

この記事が気に入ったらサポートをしてみませんか?