discord.pyを使って入退室通知botを作成してみた

discord.pyを使って入退室通知botを作成してみた

Discordでボイスチャンネル入退室時に通知する機能があったらいいな〜と思ったのでbotを作成してみました。
Clock Icon2025.02.04

こんにちは!前越です。

今回は、discord.pyを使ってボイスチャンネルの入退室を通知するbotを作成する方法をご紹介します。

Discordとは?

ゲーマー向けのテキスト+音声チャットサービスです。

https://discord.com/

Discordは、ゲーマーや開発者、趣味のコミュニティなど、様々なユーザーグループに向けたコミュニケーションツールとして知られています。ユーザーはテキスト、画像、ビデオ、そして音声を通じて交流でき、特にボイスチャンネルの機能はリアルタイムでのコミュニケーションを提供します。

https://dev.classmethod.jp/articles/discord_suggest/

なぜボイスチャンネル通知botが必要?

discordを使ってて以下のような課題がよくありました

  • どのチャンネルで誰が通話しているか分かりにくい
  • 通話が始まったタイミングを知りたい

このbotを導入することで、メンバーの入退室をテキストチャンネルで通知し、コミュニケーションをスムーズにすることができます!

環境

  • Python 3.11
  • discord.py
  • Discordアカウントとサーバーの管理権限

Discord Developer Portalでbotを作成

Discord Developer Portalにアクセス
「New Application」をクリック
スクリーンショット 2025-02-04 13.50.13
アプリケーション名を入力
スクリーンショット 2025-02-04 13.50.22
左側の「Bot」セクションで「Reset Token」をクリックしてトークンを作成
スクリーンショット 2025-02-04 13.55.21
次にbotに権限を付与します。左側「OAuth2」を選択します。

「Scope」のうち「Bot」を選択します。

スクリーンショット 2025-02-04 14.02.04
「BOT PERMISSIONS」については

  • 「View Channels」
  • 「Send Messages」
  • 「Read Messages History」
  • 「Connect」
  • 「Speak」

の5個にチェックを入れておきます。

スクリーンショット 2025-02-04 14.02.45

最後に「Generated URL」を「Copy」してアクセスしてみましょう。Botの動作確認用チャンネルを指定します。

スクリーンショット 2025-02-04 14.03.17

スクリーンショット 2025-02-04 14.16.56

discord.pyのセットアップ

まず、必要なライブラリをインストールします:

# discord.pyのインストール
pip install discord.py

コードを実装してみる

main.py 
import discord
from discord.ext import commands

YOUR_BOT_TOKEN=""
YOUR_CHANNEL_ID=

# botのインテントを設定
intents = discord.Intents.default()
intents.voice_states = True  # ボイスステータスの変更を検知するために必要

# botを初期化
bot = commands.Bot(command_prefix='!', intents=intents)

# 通知を送信するテキストチャンネルのID
NOTIFICATION_CHANNEL_ID = YOUR_CHANNEL_ID  # ここに通知を送信したいチャンネルのIDを入力

@bot.event
async def on_ready():
    print(f'{bot.user} としてログインしました')

@bot.event
async def on_voice_state_update(member, before, after):
    # 通知を送信するチャンネルを取得
    notification_channel = bot.get_channel(NOTIFICATION_CHANNEL_ID)

    # ボットの動作は無視
    if member.bot:
        return

    # ユーザーがボイスチャンネルに参加した場合
    if before.channel is None and after.channel is not None:
        await notification_channel.send(f'🎤 **{member.display_name}** が {after.channel.name} に参加しました')

    # ユーザーがボイスチャンネルから退出した場合
    elif before.channel is not None and after.channel is None:
        await notification_channel.send(f'🐮✋ **{member.display_name}** が {before.channel.name} から退出しました')

# botを実行
bot.run(YOUR_BOT_TOKEN)  # ここにボットのトークンを入力

以前までは、下記のIntentのパラメータ設定を記載していなくても動作はしていたのですが、discord.py ver2.0 (2022年)からIntentsの設定が必須になったみたいです。

# botのインテントを設定
intents = discord.Intents.default()
intents.voice_states = True  # ボイスステータスの変更を検知するために必要

# botを初期化
bot = commands.Bot(command_prefix='!', intents=intents)

https://discordpy.readthedocs.io/ja/stable/intents.html

実行してみます。

python3 main.py

Botの動作が確認できました〜!
スクリーンショット 2025-02-04 16.00.41

動画

https://youtu.be/JsLPVTgIBuU

感想

discord.pyを使用してボイスチャンネル入退室通知botを作成してみましたが、以前と比べてIntentsシステムの必須化など、仕様が変更されていることに驚きました。

コード実装自体はシンプルですが、Discord Developer Portalでのbot作成や権限設定など準備段階で苦戦すると思います。

現在はローカル環境での実行に留まっていますが、今後はAWS Lambdaを使用して24時間稼働できる環境を構築したいと考えています。

クラウド環境での運用方法については、実装でき次第また新しい記事として共有させていただければと思います〜!

参考

https://discordpy.readthedocs.io/ja/stable/intents.html

https://dev.classmethod.jp/articles/discord-bot-by-discordpy/

https://dev.classmethod.jp/articles/discord_suggest/

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新ITテクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.