技術メモ

プログラミングとか電子工作とか

YouTuber(VTuber)さんのライブ配信予定をGoogleカレンダーと自動同期する

自分は二次元おたくでありますが故、VTuberさんのライブ配信などを見ながら作業することがぼちぼちあります。
基本アーカイブ勢ではあるのですが、晩酌配信のような配信はリアルタイムで楽しみたいなぁというモチベーションがあります。
可能であればその予定がGoogleカレンダーに入っていると嬉しいです。

というわけで、YouTube上の特定チャンネルの予定をGoogleカレンダーに登録するスクリプトを書いていきます。
「プログラミングとか知らねえよ!」って方でもコピペすればたぶんできると思います。
とはいえ基本はパソコンで作業する用に書いてますのでスマホのみの方は参考程度に・・・

まずは例でも見て下さい。(みる時間によっては何も入ってないかも)

calendar.google.com

このカレンダーのiCal形式URLは https://calendar.google.com/calendar/ical/0fb4lch7recm0p1oktj9k6rh28%40group.calendar.google.com/public/basic.ics となっています。
もし自分のカレンダーに取り込んでみたい、という方は上記URLを「URLで追加する」を参照しながら追加してみて下さい。

※ただし、上記のカレンダーの動作を保証するものでは御座いませんので何卒・・・

この記事では上記のカレンダーを自分で作成する方法を紹介します。
例に雪花ラミィさんを取り上げているのは、完全に自分の趣味です。
(朝活で定期的に枠が立ってて確認しやすいので)

必要情報を揃える

なにはともあれ必要な情報を集めるところからです。
まずはチャンネルのIDが必要になるので、カレンダーに表示したいチャンネルを開きます。

f:id:ysmn_deus:20200819172945p:plain
kawaii

参考: Lamy Ch. 雪花ラミィ - YouTube

雪花ラミィさんのチャンネルのURLが https://www.youtube.com/channel/UCFKOVgVbGmX65RxO3EtH3iw となっています。このURLの最後にある UCFKOVgVbGmX65RxO3EtH3iw がチャンネルのIDです。

他にはYouTube Data APIを利用する為のキーが必要なのですが、コレに関しては後述します。

Googleアカウント

そもそもアカウントがない人がこの記事を見てることは少ないと思いますが、もし持っていなければ作成して下さい。
作成する方法は解説しませんが、こちらが参考になるかと。

office-hack.com

カレンダーを作成するアカウント

「カレンダーを公開していろんな人に共有したい!」という人は新規作成して、そのアカウントでカレンダーを作成することをオススメします。

f:id:ysmn_deus:20200819171800j:plain
共有したカレンダーには作成者の名前が表示される

YouTube Data APIAPIキーを作成する

別記事にまとめました。とりあえずこれは実行して下さい。

www.tech-note.info

更新するカレンダーを新規作成する

基本的に自動で予定が更新されるようにしますが、最初は手動でカレンダーをつくってあげる必要があります。
まずは一個作りましょう。Googleカレンダーを作成するアカウントにログインした状態でGoogleカレンダーのページを開きます。

f:id:ysmn_deus:20200819185246p:plain

左下の「他のカレンダー」と書かれた右にある「+」から「新しいカレンダーを作成」をクリックします。

f:id:ysmn_deus:20200819185623p:plain

「新しいカレンダーを作成」というページに移動します。「名前」に適当な名前を付けて「カレンダーを作成」をクリックします。
ここでは「雪花ラミィ配信予定」としました。
作成が完了したらブラウザ下部に「作成が完了しました」と表示されます。ページが自動で移動しないので、前のページに戻りましょう。

カレンダーIDをひかえておく

後に「カレンダーID」が必要になってきますので、それを確認します。
Googleカレンダーのページに先ほど追加した名前でカレンダーが追加されていると思いますので、そちらの右側に出てくる設定アイコンをクリックすると「設定と共有」という項目が出てきます。

f:id:ysmn_deus:20200819191509p:plain

f:id:ysmn_deus:20200819191359p:plain

カレンダーの設定画面に移動した後に、スクロール(もしくは左にある目次から移動)すると「カレンダーの統合」という項目があると思います。

f:id:ysmn_deus:20200820014429p:plain

そこにある「カレンダーID」と書かれた下にあるメールアドレスみたいなのがカレンダーIDです。
ここでは 0fb4lch7recm0p1oktj9k6rh28@group.calendar.google.com が該当します。
これを記録しておいて下さい。あとで使います。

Google Apps Scriptで自動同期する

こっからちょっとプログラミング要素が入りますが、最悪コピペでいいとは思います。

Google Apps Scriptのコンソール

GoogleカレンダーからスクリプトをくっつけたりできないのでGoogle Apps Scriptのコンソールにプロジェクトを作成して自動実行します。
なんのこっちゃ?という方はとりあえず下記の流れに沿って操作して下さい。

まずは下記のURLからコンソールを開きます。

www.google.com

このとき、先ほどカレンダーを作成したアカウントでログインされていることを確認して下さい。
別のアカウントからでは基本うまくいきません。

f:id:ysmn_deus:20200819190029p:plain

「Start Scripting」と書かれたボタンをクリックします。
Google Apps Scriptのコンソールに移動します。

f:id:ysmn_deus:20200819192843p:plain

新規プロジェクトの作成

自動でスケジュールを更新するプログラムを実行するプロジェクトを作成します。
左上の「新しいプロジェクト」と書かれたボタンをクリックします。

f:id:ysmn_deus:20200819193044p:plain

とりあえず後で修正が必要になったときに見つけやすい用に名前は付けておきます。
左上の「無題のプロジェクト」と書かれた箇所をクリックして、名前を変更します。
とりあえず自分は YouTube Live Calendar Sync としました。

f:id:ysmn_deus:20200819193400p:plain

OK押して更新すると名前が変わってると思います。

f:id:ysmn_deus:20200819193411p:plain

コーディング

詳しいことはさておきコードをはっつけておきます。

いつのまにV8実行できるようになってたんやお前

一応挙動について説明

上記のスクリプト

  1. 実行されるとYouTube Data APIからチャンネルに登録されている動画を「作成された」時間順でソートして25件取得する
  2. 上記で取得したものから、配信予定のものだけを選択(アーカイブとかは除外)
  3. 上記で選別した動画情報を取得
  4. 上記の情報からカレンダー上に予定を作成

て感じです。

変更するところ

一番上の

const APIKEY = '[APIキー]'

の箇所を、「YouTube Data APIのAPIキーを作成する」で作成したAPIキーに書き換えます。
次に

const CAKENDAR = {
  'UCFKOVgVbGmX65RxO3EtH3iw': '0fb4lch7recm0p1oktj9k6rh28@group.calendar.google.com', // 雪花ラミィ
}

UCFKOVgVbGmX65RxO3EtH3iw の箇所を「必要情報を揃える」でひかえてあるチャンネルIDに、 0fb4lch7recm0p1oktj9k6rh28@group.calendar.google.com の箇所を「カレンダーIDをひかえておく」でひかえておいたカレンダーIDにします。

複数チャンネルに対応する場合

上記のスクリプトを複数チャンネルに対応させる場合、新しくプロジェクトを作成してもいいですが

const CAKENDAR = {
  'UCFKOVgVbGmX65RxO3EtH3iw': '0fb4lch7recm0p1oktj9k6rh28@group.calendar.google.com', // 雪花ラミィ
}

の箇所に追加しても動くようにしています。
例えば

const CAKENDAR = {
  'UCFKOVgVbGmX65RxO3EtH3iw': '0fb4lch7recm0p1oktj9k6rh28@group.calendar.google.com', // 雪花ラミィ
  '[チャンネルID]': '[カレンダーID]', // 新しく追加したカレンダー
}

というように、何個も追加できます。
ただし、増やしすぎるとクォータ制限に引っかかるので「クォータ(使用量)のお話」を確認して下さい。

試しに実行してみる

コードができたら試しに実行してみましょう。
上側のボタンの虫マークの隣の項目「関数を選択」から「run」を選びます。

f:id:ysmn_deus:20200820011816p:plain

f:id:ysmn_deus:20200820011827p:plain

「run」が選択できると、三角形マークが押せるようになるので、押してみます。

f:id:ysmn_deus:20200820011840p:plain

スクリプトを実行すると認証が要るよ!(Authorization required)と表示されます。

f:id:ysmn_deus:20200819195136p:plain

「認証を許可」を押して次に進みます。

f:id:ysmn_deus:20200819195450p:plain

カレンダーを作成したアカウントを選択します。
ヤバそうな表示がでますが無視します。ヤバイのはあなたの作ったスクリプトです。
(心配な人はアカウントを分けて下さい。私が悪意のあるスーパーハッカーだったとしても、乗っ取れるのはその新しく作ったアカウントだけです。)

無視するには左下の詳細を押して

f:id:ysmn_deus:20200819195744p:plain

自分の作ったプロジェクト名の書かれた「(安全ではないページ)に移動」をクリックします。

f:id:ysmn_deus:20200819200159p:plain

一応この操作の説明をしておきますと、今作成しているプログラムがGoogleアカウントのカレンダーなどを変更していいかどうかの許可を確認しています。
右の方にあるiの○をクリックすると詳細が表示されます。気になる方は見てみると良いと思います。

とりあえず問題無ければ「許可」をクリックします。
ここまでで何か警告っぽいものが出なければ、とりあえず実行できてるはずです。
カレンダーを確認してみて下さい。

f:id:ysmn_deus:20200820012151p:plain

ライバーさんの立ててる配信予定が入っていればとりあえず問題無いと思います。

定期実行の設定

スクリプトは上記でOKですが、毎回自分で実行していてはめんどくさいこと極まりないです。
上記のスクリプトを自動で実行するように設定しておきます。

Google Apps Scriptで書いたスクリプトは標準機能で定期実行できます。
コードの編集画面にある実行ボタンの左にある時計アイコンをクリックします。

f:id:ysmn_deus:20200820092749p:plain

初めて起動するときはなんか出てきますが「ダッシュボードを表示」でモーダルを閉じます。

f:id:ysmn_deus:20200820092849p:plain

f:id:ysmn_deus:20200820093028p:plain

右下にある「トリガーを追加」ボタンを押してトリガーを追加します。

f:id:ysmn_deus:20200820093917p:plain

色々設定できます。
実行する関数は「run」を選択しといてもらえれば、後は適当に。デフォルトでは1時間おきに更新するような設定になっていますが、もし15分や30分などより細かく更新したい場合は「時間ベースのトリガーのタイプを選択」から「分ベースのタイマー」を選択して、「時間の間隔を選択(分)」を任意の分数にしてください。
時間を短くする場合はAPIの使用量制限があるので、しつこいようですが「クォータ(使用量)のお話」をご参照ください。

時間を設定できたら「保存」でトリガーを追加します。

f:id:ysmn_deus:20200820094531p:plain

こんな感じでトリガーが追加できていれば定期実行の設定完了です。
あとはGoogleさんが勝手に自動でカレンダーを更新してくれます。

更新のタイミング

1時間で設定した方は「12:00」に実行されそうなものですが、結構実行時間はまちまちです。
たぶんトリガーを設定したタイミングが10:15だと、次回実行されるのが11:15とかそんな感じになります。
まぁ、実行時間は目安だと思っといて下さい。

カレンダーを共有する

上記で作成したカレンダーを共有してライバーさんの配信を布教したい欲求もでてくると思います。
そういうときはGoogleカレンダーの共有機能を利用しましょう。
ここでは、iCal形式の公開URLを共有する方法を利用します。

一般公開の設定を行う

URL事態は既に生成されているのですが、一般公開できる設定をしていないと他の方は取り込めません。
なのでまずは一般公開できるように設定を変更します。

まずは該当カレンダーの設定画面を表示します。
カレンダーIDを確認したページです。

f:id:ysmn_deus:20200819191359p:plain

このページの「アクセス権限」を確認します。

f:id:ysmn_deus:20200820013412p:plain

該当項目の左側にあるチェックボックスをクリックしてチェックを入れます。

f:id:ysmn_deus:20200820013500p:plain

警告が出ますのでOKを押します。
これでOKです。もう少し下にスクロールして「iCal形式の公開URL」と書かれた箇所を確認します。

f:id:ysmn_deus:20200820013739p:plain

このURLでカレンダーを共有します。
このURLで追加された場合、閲覧しているユーザーは編集できないので悪戯などの被害は基本的に考慮しなくて良いかと思います。

共有リンクで共有する

上記の「アクセス権限」という項目の下に「共有可能なリンクを取得」というボタンがあります。

f:id:ysmn_deus:20200820113119p:plain

これをクリックするとURLが出てきますので、このURLにアクセスするとログインしているユーザーのGoogleカレンダーにカレンダーが追加されます。
一般的にこちらの方が楽だと思います。

URLで追加する

自分のGoogleカレンダーiCal形式のURLで追加する場合は、「他のカレンダー」の「+」ボタンから追加します。

f:id:ysmn_deus:20200820014022p:plain

「URLで追加」という項目があるので、そちらをクリックします。

f:id:ysmn_deus:20200820014137p:plain

先ほどの「iCal形式の公開URL」と書かれた箇所にあったURLを入力し、「カレンダーを追加」をクリックします。

これでOKだと思います。

注意点

クォータ(使用量)のお話

YouTube Data APIはなんぼでも使い放題というわけではなく、1ユーザーあたりに割り当てられた使用量みたいなものがあります。
いろんな制限があるのですが、関係するものとしては「1日あたり10,000ユニット」という制限が該当すると思います。
('ω')。o(????????????)という感じだと思いますが、先ほど紹介したスクリプトではおおよそ1チャンネルあたり100ユニットを消費するような仕組みになっておりますので、例えば1チャンネルを15分刻みで更新チェックすると

100 * 96(一日1440分 -> 96回)= 9600

となり、9600ユニット消費します。なので結構ギリギリです。(このユニットは毎日リセットされるので、一日あたりを考えればいいです。)
なので、2チャンネルを先ほどのスクリプトで処理すると、単純に2倍になるのでお昼のどこかでスクリプトが動かなくなります。

考えられる対策としては

  1. 更新頻度を下げる(30分で2チャンネル、1時間で4チャンネル、など)
  2. ユーザーを分ける(1ユーザー1カレンダーなど)

といった対応が考えられると思います。
ただし、ユーザーを分けるというのはGoogleの定めた制約を回避するためのサブアカウント作成と見なされる可能性があるので、基本的には前者をオススメ致します。
複数チャンネルの同期を考えている方は参考にしてみて下さい。

APIそのもののエラーの可能性

この記事で紹介した方法は基本「YouTube Data API」に依存しています。
なので、いわゆる枠バグのような現象が発生するライブに関してはもしかするとカレンダーに同期されない可能性があります。
本当にみたいライバーさんであれば、Twitterなど他媒体のチェックも欠かさないようにしましょうね。

公開カレンダー

一応自分が運用してるカレンダーを貼っておきます。
お好きにどうぞ。
(1時間に1回更新です)