🤖

YouTube配信や動画投稿をDiscordに通知するGASを作ったよ。

2024/02/21に公開
3

概要

この仕組みではDiscordの特定のチャンネルにYouTubeチャンネルの動画投稿や配信情報を通知することができます。
YouTube自体にも通知機能はありますがDiscordチャンネルに通知することで複数名で話題を共有でき、コミュニティを盛り上げる助けになるのではないかと考えて作ってみました。

大まかな処理の流れ

以下に大まかな流れを記載します。後述するチャンネルアイコンの取得などについては触れていません。

  1. トリガーによってGASが起動する
  2. YouTubeチャンネルのRSSフィードからVideoIdを取得する
  3. スプレッドシートにVideoIdがない場合はYouTube Data APIのVideos: listを実行し取得した情報をスプレッドシートに記録し、Discordへ通知を行います。
  4. スプレッドシートにVideoIdがある場合で記録されたレコードが配信予定もしくは配信中の場合に、RSSフィードのアップデート時刻がスプレッドシートに記録された時刻と異なる場合は配信状態の変更か配信予定時刻の変更かタイトル変更かを判定し最新情報をスプレッドシートに記録し、Discordへ通知を行います。

どんな通知がされるか?

こんな感じで動画投稿や配信予定が通知されます。それ以外にも配信中や配信完了したタイミングで通知されます。

コードはこちら

使い方含めて詳しく書いています。
https://github.com/tatsumin39/youtube-to-discord-notifier

こだわったポイント

Discord通知の時のアイコン

Discordに通知する際のBotのアイコンをそのYouTubeチャンネルのアイコンとすることで識別性を高めています。
これはYouTube Data APIのChannels: listにて取得しています。

苦労したポイント

API使用量の調節

YouTube Data APIは1日あたりの使用量は10,000まで利用できます。
今回は行なっていませんが検索リクエストの場合は1回あたり使用量が100と多く、Video: listやChannels: listは1回あたり使用量が1と少なかったのでまだよかったのですがコードを作成し始めたころはRSSフィードで取得したVideoIdに対して毎回APIを実行していたため1日で使用量が8,000近く上昇してしまいました。
大まかな処理の流れで記載しているように最小限のAPI実行となるように調整することでかなり落ち着いた数値で推移するようになりました。

スプレッドシート検索時の処理速度

この仕組みではスプレッドシートに情報が蓄積されます。記事執筆時で通知対象として38チャンネルを指定し1週間ほど運用していますがその間に追加されたレコードは100件弱あります。
当初はVideoIdがスプレッドシートにあるかを検索する際に1件1件検索していました。試しにスプレッドシートにダミーデータを登録して1万件近い状態で実施したところ明らかに処理に時間がかかることがわかりました。そこでVideoIdのカラムのデータを配列に格納し、indexOfで検索することで大幅に処理速度を向上することができました。

今後のアップデート構想

以下のようなことを考えています。

  • 配信30分前になったら通知する機能の追加
  • 配信終了時の通知時にアーカイブ動画の長さ情報の追加
  • Discordスラッシュコマンドによる情報取得機能の追加

現在は配信予定の通知から実際の配信開始まで時間がある場合に忘れがちになることがあります。30分前に通知を行うかスラッシュコマンドで30分以内、1時間以内のような指定をして呼び出すような仕組みがあるといいかもしれません。
もしくはDiscord上で新たなチャンネルを用意し特定条件で通知先を分けるという処理を行うという方法も考えられます。

ユーザーの利用の仕方やニーズをよく観察して決めていきたいと思います。

GitHubで編集を提案

Discussion

あざっちあざっち

試しに使ってみましたがいいですね これ
こちらがShortsの通知は必要ない環境なので、動画の種類で通知の有無を変更できるとさらに便利ですね’

yettestyettest

これを実行すると、(手動)
"無効な日付 "undefined" がformatDate関数に渡されました。"
というエラーが出るのですがどのように改善したらよいでしょうか。
よろしければお教えください。
なお、YouTubeから情報を取得しspredsheetに転記する、というのは手動でなければ動作します(←これもよくわからない)
なおログは一つも表示されていないので、かなり早期のものだと思われます。