DiscordとYouTubeを連携する。新しい動画をWebhookで自動通知

青と紫の照明に照らされた卓上マイクの実写写真を背景に、「YouTubeの新着を/自動で通知」と記したサムネイル
  • YouTubeに動画を上げたら、Discordのサーバーにも自動で知らせたい
  • 「連携」の設定を開いても、通知の項目が見つからない
  • 通知用のBotをサーバーに入れずに、お金もかけずに済ませたい

DiscordとYouTubeの連携には、アカウントの接続、メンバーシップの連携、新しい動画の通知の3種類があります。

ユーザー設定の「接続」でYouTubeをつないでも、新しい動画の通知までは届きません。

通知に使うのは、外のサービスからチャンネルにメッセージを送れるWebhookです。

YouTubeはWebhookへ直接送れないため、無料のGoogle Apps Scriptで新着を確かめて送る仕組みを間に置きます。

この記事では、Webhookの作成から、コードの貼り付け、15分おきに自動で動かす設定までを順にたどります。

WebhookのURLを人に見せない理由と、Xの投稿を知らせるときの扱い方もまとめました。

目次
  1. 「連携」には3つの意味がある
  2. アカウントの接続
  3. メンバーシップの連携
  4. 新しい動画の通知
  5. 通知が届く仕組み
  6. YouTubeから新着を受け取る
  7. 無料で動かせる回数
  8. Webhookを作る
  9. 手順1:通知用のチャンネルを用意する
  10. 手順2:Webhookを作ってURLをコピーする
  11. WebhookのURLは人に見せない
  12. Apps Scriptで通知を動かす
  13. 手順1:プロジェクトを作る
  14. 手順2:YouTube Data APIを追加する
  15. 手順3:コードを貼り付ける
  16. 手順4:URLとチャンネルのハンドルを保存する
  17. 手順5:setupを実行して15分おきに動かす
  18. 動いたかを確かめる
  19. 新しい動画で試す
  20. 届かないときに見る場所
  21. Xの投稿は手で貼る
  22. よくある質問
  23. まとめ:初回の記録を済ませ、新しい動画の通知まで確かめる

「連携」には3つの意味がある

「連携」の3つの意味の比較図。アカウントの接続:ユーザー設定の接続、自分のYouTubeを登録。メンバーシップ:YouTubeパートナー向け、ロールが自動で付く。新着動画の通知:誰でも使える、Webhookで投稿。「連携」の3つの意味の比較図。アカウントの接続:ユーザー設定の接続、自分のYouTubeを登録。メンバーシップ:YouTubeパートナー向け、ロールが自動で付く。新着動画の通知:誰でも使える、Webhookで投稿。

「DiscordとYouTubeの連携」と呼ばれる設定は、目的の違う3つに分かれます。

新しい動画を知らせたいなら、使うのは3つ目のWebhookです。

3つの違いは次のとおりです。

  • アカウントの接続
  • メンバーシップの連携
  • 新しい動画の通知

アカウントの接続

PCの「ユーザー設定」→「接続」でYouTubeのタイルを選ぶと、自分のDiscordアカウントにYouTubeのアカウントをつなげます。

これは、メンバーシップの特典として用意されたサーバーに入るための準備で、サーバーへの通知は送られません。

メンバーシップの連携

チャンネルメンバーシップを有効にしているYouTubeパートナーは、YouTubeのチャンネルをDiscordのサーバーに連携できます。

連携すると、YouTubeのメンバー向けのロールが自動で作られ、メンバーシップに入った人に付きます。

このロールはYouTubeの連携が管理するため、手作業でメンバーに付けたり外したりはできません。

新しい動画の通知

Discordのヘルプでは、YouTubeはWebhookへ直接送れないサービスとして挙げられています。

そこで、YouTubeの新着を確かめてWebhookへ送る仕組みを、Google Apps Scriptで用意します。

Googleアカウントがあれば無料で使え、サーバーにBotを追加する必要もありません。

通知が届く仕組み

通知が届く流れの図。1.スクリプトが動く(15分おき)、2.新しい動画を探す(アップロード一覧)、3.Webhookに送る(動画のURL)、4.チャンネルに表示(通知用チャンネル)の順に進む。通知が届く流れの図。1.スクリプトが動く(15分おき)、2.新しい動画を探す(アップロード一覧)、3.Webhookに送る(動画のURL)、4.チャンネルに表示(通知用チャンネル)の順に進む。

Google Apps Scriptは、Googleのサーバーの上でJavaScriptを動かせるサービスです。

決まった間隔でスクリプトを動かせるので、自分のパソコンを起動しておかなくても通知が届きます。

仕組みで知っておきたいのは次の2つです。

  • YouTubeから新着を受け取る
  • 無料で動かせる回数

YouTubeから新着を受け取る

YouTubeのチャンネルには、公開した動画が並ぶアップロードの再生リストがあります。

スクリプトは、YouTube Data APIでこの再生リストの新しい5本を読み、公開状態が「公開」の動画だけを取り出します。

前回までに知らせた動画のIDを覚えておき、まだ知らせていない動画だけをWebhookに送ります。

無料で動かせる回数

YouTube Data APIは、1日あたり10,000ユニットまで無料で使え、一覧を読む操作は1回につき1ユニットです。

15分おきに2回ずつ読むと1日192ユニットなので、上限には届きません。

Apps Script側も、個人のGoogleアカウントで外部への送信は1日20,000回、時間で動かす処理の合計は1日90分まで使えます。

Webhookを作る

最初に、通知を受け取るチャンネルにWebhookを作ります。

Webhookを作るには、そのサーバーで「ウェブフックの管理」の権限が要ります。

次の2つの手順で作り、URLの扱いも説明します。

  • 手順1:通知用のチャンネルを用意する
  • 手順2:Webhookを作ってURLをコピーする
  • WebhookのURLは人に見せない

手順1:通知用のチャンネルを用意する

通知だけが流れるテキストチャンネルを作ると、会話の中で動画の知らせが埋もれません。

一般メンバーの「メッセージを送信」を拒否しておけば、通知と雑談が混ざらないチャンネルになります。

チャンネルの作り方はチャンネルの作り方、権限の付け方は権限の設定で説明しています。

手順2:Webhookを作ってURLをコピーする

「サーバー設定」を開き、「連携サービス」から「ウェブフックを作成」を押します。

作られたWebhookを開き、名前を「YouTube通知」などに変え、投稿先に手順1のチャンネルを選びます。

「ウェブフックURLをコピー」を押すと、送信先のURLがコピーされます。

WebhookのURLは人に見せない

Webhookは、URLを知っていれば誰でも、ログインなしでそのチャンネルに投稿できる仕組みです。

スクリーンショットやチャット、公開した文書にURLを載せないでください。

漏れたときは、「連携サービス」の一覧からそのWebhookを削除し、新しく作り直してURLを入れ替えます。

Apps Scriptで通知を動かす

Apps Scriptの準備の図。1.プロジェクトを作る(新しいプロジェクト)、2.YouTubeを追加する(サービスを追加)、3.URLとハンドルを保存(スクリプト プロパティ)、4.setupを実行する(15分おきに起動)の順に進む。Apps Scriptの準備の図。1.プロジェクトを作る(新しいプロジェクト)、2.YouTubeを追加する(サービスを追加)、3.URLとハンドルを保存(スクリプト プロパティ)、4.setupを実行する(15分おきに起動)の順に進む。

次に、Google Apps Scriptのプロジェクトを作り、コードを貼り付けます。

WebhookのURLはコードに書かず、プロジェクトの設定に保存します。

設定は次の5つの手順で進めます。

  1. プロジェクトを作る
  2. YouTube Data APIを追加する
  3. コードを貼り付ける
  4. URLとチャンネルのハンドルを保存する
  5. setupを実行して15分おきに動かす

手順1:プロジェクトを作る

Googleアカウントでログインし、次のURLを開きます。

https://script.google.com/

「新しいプロジェクト」を押し、左上の「無題のプロジェクト」から名前を「Discord通知」などに変えます。

手順2:YouTube Data APIを追加する

エディタの左側にある「サービス」の横の「サービスを追加」を押します。

一覧からYouTube Data API v3を選び、「追加」を押します。

手順3:コードを貼り付ける

エディタに最初からある文字をすべて消し、次のコードを貼り付けて保存します。

コード.gs
const props = PropertiesService.getScriptProperties();

function checkUploads() {
  const webhookUrl = props.getProperty('WEBHOOK_URL');
  const handle = props.getProperty('YOUTUBE_HANDLE');
  const channel = YouTube.Channels.list('contentDetails', { forHandle: handle }).items[0];
  const uploads = channel.contentDetails.relatedPlaylists.uploads;
  const res = YouTube.PlaylistItems.list('snippet,status', { playlistId: uploads, maxResults: 5 });
  const videos = res.items.filter(item => item.status.privacyStatus === 'public');
  const saved = props.getProperty('SEEN');

  if (saved === null) {
    props.setProperty('SEEN', JSON.stringify(videos.map(v => v.snippet.resourceId.videoId)));
    return;
  }

  const seen = JSON.parse(saved);
  const fresh = videos.filter(v => !seen.includes(v.snippet.resourceId.videoId)).reverse();
  for (const v of fresh) {
    const id = v.snippet.resourceId.videoId;
    UrlFetchApp.fetch(webhookUrl, {
      method: 'post',
      contentType: 'application/json',
      payload: JSON.stringify({
        content: '新しい動画を公開しました:' + v.snippet.title + '\nhttps://www.youtube.com/watch?v=' + id,
        allowed_mentions: { parse: [] }
      })
    });
    seen.push(id);
  }
  props.setProperty('SEEN', JSON.stringify(seen.slice(-50)));
}

function setup() {
  ScriptApp.newTrigger('checkUploads').timeBased().everyMinutes(15).create();
}

allowed_mentionsの行は、動画のタイトルに@everyoneが含まれていても、メンションとして鳴らさないための設定です。

知らせた動画のIDは、最新の50件だけを残します。

手順4:URLとチャンネルのハンドルを保存する

左側の「プロジェクトの設定」を開き、「スクリプト プロパティを追加」を押します。

プロパティにWEBHOOK_URL、値にWebhookのURLを入れ、もう1つYOUTUBE_HANDLEに@から始まるチャンネルのハンドルを入れて保存します。

スクリプト プロパティは、そのスクリプトを使うすべての人と共有されるので、プロジェクトはほかの人と共有しません。

手順5:setupを実行して15分おきに動かす

エディタ上部で実行する関数にsetupを選び、実行のボタンを押します。

初回はGoogleアカウントへのアクセスの承認を求められるので、自分のアカウントを選んで許可します。

左側の「トリガー」を開き、checkUploadsが15分おきに動く設定が1つだけあれば準備は終わりです。

setupを2回実行するとトリガーが2つになり、同じ動画が二重に届くので、増えたほうを削除します。

動いたかを確かめる

最初の実行では、いま公開されている動画を覚えるだけで、通知は送りません。

古い動画が一斉に流れないようにするためで、次に公開した動画から通知が届きます。

確かめ方と注意点は次の3つです。

  • 新しい動画で試す
  • 届かないときに見る場所
  • Xの投稿は手で貼る

新しい動画で試す

動画を公開して15分ほど待ち、通知用のチャンネルに動画のタイトルとURLが投稿されるかを見ます。

トリガーの実行時刻は少しずれることがあり、公開から投稿まで15分より長くかかる日もあります。

届かないときに見る場所

左側のメニューの「実行」を開くと、checkUploadsが動いた記録と、失敗したときのエラーが表示されます。

Cannot read properties of undefinedのエラーで止まっているなら、YOUTUBE_HANDLEのハンドルが違います。

送信の行で止まっているなら、WebhookのURLが古いか、Webhookが削除されています。

Xの投稿は手で貼る

Xの投稿を自動で取り出すには、利用量に応じて料金がかかるX APIのクレジットが必要です。

お金をかけずに回すなら、Xに投稿したあと、その投稿のURLを通知用のチャンネルに自分で貼ります。

告知のたびに全員へ通知を鳴らしたくない場合は、@silentの使い方も役に立ちます。

よくある質問

ライブ配信の開始も知らせられますか。

このコードは、アップロードの再生リストに並んだ公開済みの動画を知らせる仕組みです。

配信の開始の瞬間を知らせる処理は入れていないので、配信は告知のメッセージを自分で投稿します。

止めたいときはどうしますか。

Apps Scriptの「トリガー」でcheckUploadsのトリガーを削除すれば、通知は止まります。

もう使わないなら、Discordの「連携サービス」でWebhookも削除しておきます。

まとめ:初回の記録を済ませ、新しい動画の通知まで確かめる

新着動画の通知は、YouTubeアカウントの接続だけでは届きません。

Webhookを送信先にして、Apps Scriptで15分おきに新着を調べる仕組みを作ります。

最初の実行は公開済み動画を記録するだけで、通知を送りません。

その実行が済んでから公開した動画で、DiscordへタイトルとURLが届くかを確認しましょう。

トリガーは1つだけにし、届かなければApps Scriptの実行履歴からエラーを調べます。

WebhookのURLは公開せず、通知をやめるときはトリガーを削除します。