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

- YouTubeに動画を上げたら、Discordのサーバーにも自動で知らせたい
- 「連携」の設定を開いても、通知の項目が見つからない
- 通知用のBotをサーバーに入れずに、お金もかけずに済ませたい
DiscordとYouTubeの連携には、アカウントの接続、メンバーシップの連携、新しい動画の通知の3種類があります。
ユーザー設定の「接続」でYouTubeをつないでも、新しい動画の通知までは届きません。
通知に使うのは、外のサービスからチャンネルにメッセージを送れるWebhookです。
YouTubeはWebhookへ直接送れないため、無料のGoogle Apps Scriptで新着を確かめて送る仕組みを間に置きます。
この記事では、Webhookの作成から、コードの貼り付け、15分おきに自動で動かす設定までを順にたどります。
WebhookのURLを人に見せない理由と、Xの投稿を知らせるときの扱い方もまとめました。
目次
- 「連携」には3つの意味がある
- アカウントの接続
- メンバーシップの連携
- 新しい動画の通知
- 通知が届く仕組み
- YouTubeから新着を受け取る
- 無料で動かせる回数
- Webhookを作る
- 手順1:通知用のチャンネルを用意する
- 手順2:Webhookを作ってURLをコピーする
- WebhookのURLは人に見せない
- Apps Scriptで通知を動かす
- 手順1:プロジェクトを作る
- 手順2:YouTube Data APIを追加する
- 手順3:コードを貼り付ける
- 手順4:URLとチャンネルのハンドルを保存する
- 手順5:setupを実行して15分おきに動かす
- 動いたかを確かめる
- 新しい動画で試す
- 届かないときに見る場所
- Xの投稿は手で貼る
- よくある質問
- まとめ:初回の記録を済ませ、新しい動画の通知まで確かめる
「連携」には3つの意味がある


「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を追加する必要もありません。
通知が届く仕組み


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で通知を動かす


次に、Google Apps Scriptのプロジェクトを作り、コードを貼り付けます。
WebhookのURLはコードに書かず、プロジェクトの設定に保存します。
設定は次の5つの手順で進めます。
- プロジェクトを作る
- YouTube Data APIを追加する
- コードを貼り付ける
- URLとチャンネルのハンドルを保存する
- setupを実行して15分おきに動かす
手順1:プロジェクトを作る
Googleアカウントでログインし、次のURLを開きます。
https://script.google.com/「新しいプロジェクト」を押し、左上の「無題のプロジェクト」から名前を「Discord通知」などに変えます。
手順2:YouTube Data APIを追加する
エディタの左側にある「サービス」の横の「サービスを追加」を押します。
一覧からYouTube Data API v3を選び、「追加」を押します。
手順3:コードを貼り付ける
エディタに最初からある文字をすべて消し、次のコードを貼り付けて保存します。
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は公開せず、通知をやめるときはトリガーを削除します。



