はじめに
Discordサーバーで友人とYouTubeの動画を共有していると、「この曲いいね!」「あとで聴きたい」となることがよくあります。
しかし、共有された動画をいちいちYouTubeのプレイリストに手動で追加するのは面倒…
そこで、Discordの指定チャンネルに投稿されたYouTube URLを自動的にYouTubeプレイリストに追加するBotを作成しました。
本記事では、このBotの機能紹介と構築手順を解説します。
機能
- 指定チャンネルに投稿されたYouTube/YouTube Music URLを自動検出
- YouTubeプレイリストへ自動追加
- 重複チェック(同じ動画は追加しない)
- 複数チャンネルの監視に対応
- Bot起動時に過去メッセージをスキャン
- 起動/停止/スキャン完了時のDiscord通知
- ログ出力(通常ログ + デバッグログ、日次ローテーション)
必要要件
- Python 3.9以上
- Discord Bot Token
- Google Cloud Project(YouTube Data API v3)
- Linux環境(systemdでデーモン化する場合)
構築手順
1. Discord Botの作成
Discord Developer Portal にアクセスし、Botを作成します。
- 「New Application」をクリックし、アプリケーションを作成
- 左メニューの「Bot」を選択
- 「Reset Token」をクリックしてBot Tokenを取得(後で使用)
- 「MESSAGE CONTENT INTENT」を有効化
- 左メニューの「OAuth2」→「URL Generator」を選択
- SCOPESで「bot」を選択
- BOT PERMISSIONSで以下を選択:
- Read Messages/View Channels
- Send Messages
- Read Message History
- 生成されたURLでBotをサーバーに招待
2. Google Cloud Projectの設定
Google Cloud Console でYouTube Data APIを有効化します。
- 新しいプロジェクトを作成
- 「APIとサービス」→「ライブラリ」から「YouTube Data API v3」を有効化
- 「APIとサービス」→「認証情報」→「認証情報を作成」→「OAuthクライアントID」
- アプリケーションの種類:「デスクトップアプリ」を選択
- 作成後、JSONをダウンロード →
client_secret.jsonとして保存
3. DiscordチャンネルIDの取得
- Discordの設定 → 詳細設定 → 「開発者モード」を有効化
- 監視したいチャンネルを右クリック → 「チャンネルIDをコピー」
4. YouTubeプレイリストIDの取得
YouTubeでプレイリストを作成または開き、URLの list= 以降の文字列を取得します。
例: https://www.youtube.com/playlist?list=PLxxxxxxxx
→ プレイリストID: PLxxxxxxxx
5. Botのデプロイ
# リポジトリをクローン
git clone https://github.com/yourusername/discord-youtube-bot.git
# 任意のディレクトリに配置
sudo mkdir -p /opt/bot
sudo cp -r discord-youtube-bot /opt/bot/
cd /opt/bot/discord-youtube-bot
# 依存パッケージをインストール
pip3 install -r requirements.txt
6. 設定ファイルの作成
# サンプルファイルをコピー
cp config.yaml.example config.yaml
cp client_secret.json.example client_secret.json
config.yaml を編集します。
discord:
bot_token: "YOUR_DISCORD_BOT_TOKEN"
target_channel_ids:
- 1234567890123456789 # 監視対象のチャンネルID
youtube:
playlist_id: "YOUR_YOUTUBE_PLAYLIST_ID"
client_secret.json は、Google Cloud Consoleからダウンロードした認証情報JSONの内容で上書きします。
7. YouTube API初回認証
python3 bot.py
初回起動時、ブラウザが開いてGoogleアカウントの認証を求められます。
認証後、token.pickle が生成され、以降は自動認証されます。
ヘッドレスサーバーの場合は、ローカルPCで認証を行い、生成された token.pickle をサーバーに転送してください。
8. systemdサービスの設定
youtube-bot.service をコピーしてパスを編集します。
sudo cp youtube-bot.service /etc/systemd/system/
sudo vi /etc/systemd/system/youtube-bot.service
以下の2箇所を実際のインストールパスに変更します。
WorkingDirectory=/path/to/discord-youtube-bot
ExecStart=/usr/bin/python3 /path/to/discord-youtube-bot/bot.py
サービスを有効化・起動します。
sudo systemctl daemon-reload
sudo systemctl enable youtube-bot.service
sudo systemctl start youtube-bot.service
9. 動作確認
# サービスステータス確認
sudo systemctl status youtube-bot.service
# ログ確認
tail -f /opt/bot/discord-youtube-bot/logs/bot.log
Discordチャンネルに以下のメッセージが表示されれば成功です。
🟢 YouTube Playlist Bot が起動しました。
✅ 過去メッセージのスキャンが完了しました。
プレイリスト内の動画数: XX件
設定項目一覧
設定は全て config.yaml で管理します。メインスクリプト(bot.py)の編集は不要です。
| セクション | キー | 説明 | デフォルト |
|---|---|---|---|
| discord | bot_token | Discord Bot Token | - |
| discord | target_channel_ids | 監視対象チャンネルID(配列) | - |
| youtube | playlist_id | 追加先プレイリストID | - |
| bot | history_scan_limit | 起動時スキャン件数(0で全件) | 0 |
| bot | notify_on_success | 成功時Discord通知 | true |
| bot | notify_on_error | エラー時Discord通知 | false |
| bot | notify_on_start | Bot起動時Discord通知 | true |
| bot | notify_on_stop | Bot停止時Discord通知 | true |
| bot | notify_on_scan_complete | スキャン完了時Discord通知 | true |
| logging | log_directory | ログディレクトリ | logs |
| logging | retention_days | ログ保持日数 | 7 |
ログについて
ログは logs/ ディレクトリに出力されます(起動時に自動作成)。
| ファイル | 内容 |
|---|---|
| bot.log | 通常ログ(INFO以上) |
| debug.log | デバッグログ(DEBUG以上、全て) |
| bot-YYYYMMDD.log | ローテーション済み通常ログ |
| debug-YYYYMMDD.log | ローテーション済みデバッグログ |
設定した保持日数を超えた古いログは自動削除されます。
動作例
YouTube URLを投稿すると、Botが自動的にプレイリストに追加して通知します。
[ユーザー] https://www.youtube.com/watch?v=xxxxxxxxx
[Bot] 動画「〇〇〇〇」をプレイリストに追加しました!
URL: https://www.youtube.com/playlist?list=PLxxxxxxxx
同じ動画を再度投稿しても、重複チェックにより追加されません。
# ログ出力
ビデオID xxxxxxxxx は既にプレイリストに存在します。
まとめ
Discordに投稿されたYouTube URLを自動的にプレイリストに追加するBotを作成しました。
主なポイント
-
設定の外部化:
config.yamlで全設定を管理、メインスクリプトの編集不要 - 複数チャンネル対応: 複数のDiscordサーバー/チャンネルを同時に監視可能
- ログ機能: 通常ログとデバッグログを分離、日次ローテーションと自動削除
- 通知機能: Bot起動/停止/スキャン完了をDiscordに通知
友人とYouTubeの動画を共有する際に、手動でプレイリストに追加する手間がなくなり、とても便利になりました。
ソースコードはGitHubで公開しています。