YouTubeLiveのイベント配信枠をAPIから作成する

この記事では、GoogleのAPIを使用してYouTubeLiveのイベント配信の枠を作成する方法を簡単に説明します。
使い道はよくわかりませんが、スプレッドシートで放送管理している人や、イベント枠を毎日何十個と作る人は、便利かもしれません。


目次

1. Google API Consoleで各種キーを発行
2. OAuth認証
3. LiveStreming APIを使ってみる
4. GASへ組み込み


1. Google API Consoleで各種キーを発行

必要なキーは「APIキー」「クライアントID」「クライアントシークレット」の3つです。

Google API Consoleを開き、
新規プロジェクト作成→APIライブラリより「YouTube Data API v3」を有効化する。
認証情報→認証情報を作成→APIキー/OAuthクライアントID この2つを作成する。
OAuthクライアントは使用アプリケーションに「その他」を選択。


こんな感じの画面になればOK。「APIキー」をどこかにコピーしておく。

更にOAuthクライアント名をクリックすると、


ここで「クライアントID」と「クライアントシークレット」が手に入るのでどこかにコピー。

OAuth同意画面から「Google API のスコープ」という欄があるので、「スコープを追加」を押し、
../auth/youtube
../auth/youtube.force-ssl
この二つを追加する。
※上でYouTube Data API v3を有効化していないと、ここでこの二つは表示されない。


こうなっていればOK。


2. OAuth認証

GASに組込む前にひとまずcURLで実行してみます。

CLIENT_ID=****
CLIENT_SECRET=****
echo "https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=$CLIENT_ID&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=https://www.googleapis.com/auth/youtube%20https://www.googleapis.com/auth/youtube.force-ssl&access_type=offline"

生成されたURLをブラウザで開きます。


イベントを生成するブランドアカウントを選ぶ。
間違えてメールアドレスのものを選んでしまったり、別のアカウントを選ばないように注意。


すると警告が出てくるので、左下の「詳細」をクリックし、


移動をクリックする。
その後も何度か確認が出てくるので全て「許可」し続ける。

全て認証が終わると、Authorization Codeが表示されるのでコピーしておく。

CLIENT_ID=****
CLIENT_SECRET=****
AUTHORIZATION_CODE=****
curl --data "code=$AUTHORIZATION_CODE" --data "client_id=$CLIENT_ID" --data "client_secret=$CLIENT_SECRET" --data "redirect_uri=ietf:wg:oauth:2.0:oob" --data "grant_type=authorization_code" --data "access_type=offline" https://www.googleapis.com/oauth2/v4/token

上手くいくとこんな感じのJSONが返ってきます。

{
    "access_token": "**.**-****-****",
    "expires_in": 3600,
    "refresh_token": "*//****-****-**",
    "scope": "https://www.googleapis.com/auth/youtube.force-ssl https://www.googleapis.com/auth/youtube",
    "token_type": "Bearer"
}

ここで生成されたAccess Tokenは60分で失効してしまうので、
何度でも生成できるようにRefresh Tokenを使います。

CLIENT_ID=****
CLIENT_SECRET=****
REFRESH_TOKEN=*//****-****-**
curl --data "refresh_token=$REFRESH_TOKEN" --data "client_id=$CLIENT_ID" --data "client_secret=$CLIENT_SECRET" --data "grant_type=refresh_token" https://www.googleapis.com/oauth2/v4/token

これでRefresh TokenからAccess Tokenを再生成できます。
Refresh Tokenは明示的に無効化させない限り、何度でも使うことができます。


3. LiveStreming APIを使ってみる

$API_KEY=****
$ACCESS_TOKEN=****
curl --request POST \
'https://www.googleapis.com/youtube/v3/liveBroadcasts?part=id,snippet,contentDetails,status&key=$API_KEY' \
--header 'Authorization: Bearer $ACCESS_TOKEN' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"scheduledStartTime": "20**-**-**T**:**:00.000Z","title": "****","status":{"privacyStatus": "private"}}' \
--compressed

これで最低限のイベント枠が生成されます。
data部分に渡すJSONのパラメーターは公式のドキュメントを参考にして下さい
かるく触った感じ、公式に乗ってなくても反映されるものが一部ありました。

{
    "snippet": {
        "scheduledStartTime": "***", // *放送開始時間(記法は 2019-11-27T22:00:00.000Z)
        "title": "***", // *放送タイトル
        "isDefaultBroadcast": false, // 今すぐ配信の設定かどうか(イベント作成の場合はfalse)
        "description": "", // 概要欄。改行は\n
        "categoryId": 20, // カテゴリー20=ゲーム(機能していない)
        "tags": "" // タグ(機能していない)
    },
    "contentDetails": {
        "enableAutoStart": true, // データ送信開始と同時にストリームも開始する
        "latencyPreference": "ultraLow", // 超低遅延モード
        "monitorStream": {
            "broadcastStreamDelayMs": 0, // 放送に遅延を与える(0秒)
            "enableMonitorStream": false // プレビューモードにするか
        },
        "enableDvr": false, // DVR
        "enableContentEncryption": false, // ストリームを暗号化
        "enableEmbed": true, // 埋め込み許可
        "recordFromStart": true, // 放送開始したら録画を開始する
        "startWithSlate": false, // ??
        "enableClosedCaptions": false, // 字幕を?
        "enableLowLatency": false, // ??
        "projection": "rectangular" // ??
    },
    "status": {
        "privacyStatus": "public" // *公開するかどうか(private/public)
    }
}

うちはこんな感じで設定しています。


4. GASへ組み込み

function createEvent(title, desc, startAt) {
    var accessToken = getToken();
    var apiKey = "*********";
    var url = "https://www.googleapis.com/youtube/v3/liveBroadcasts?part=id,snippet,contentDetails,status&key=" + apiKey;
    var headers = {
        "Authorization": "Bearer " + accessToken,
        "Accept": "application/json",
        "Content-type": "application/json"
    }
    var data = {
        "snippet": {
            "scheduledStartTime": startAt, // *放送開始時間(正しい記法は 2019-11-27T22:00:00.000Z)
            "title": title, // *放送タイトル
        },
        "status": {
            "privacyStatus": "public" // *公開するかどうか(private/public)
        }
    }

    var options = {
        "method": "post",
        "payload": JSON.stringify(data),
        "headers": headers
    };

    var resultRaw = UrlFetchApp.fetch(url, options).getContentText();
    var resultJson = JsonParse(resultRaw);
    return resultJson.id;
}

function getToken() {
    var refreshToken = "*//*****-*****";
    var clientId = "******";
    var clientSecret = "*******";

    var url = "https://www.googleapis.com/oauth2/v4/token";
    var data = "refresh_token=" + refreshToken + "&client_id=" + clientId + "&client_secret=" + clientSecret + "&grant_type=refresh_token"
    var options = {
        "method": "post",
        "payload": data,
    }

    var resultRaw = UrlFetchApp.fetch(url, options).getContentText();
    var resultJson = JsonParse(resultRaw);

    return resultJson.access_token;
}

使い方としては、管理用のスプレッドシートに日付やゲーム名を入力し、「イベント作成」の文字を消すとトリガー。
createEvent()にそれらの情報を渡してあげたら自動でイベント作成し、できたイベントのYouTubeIDをセルに書き込む。
(実際はHYPERLINKでイベント編集画面にリンクさせている)

これでイベントを作成する手間を少しだけ減らすことができた。
(DVRオフ、超低遅延モードなどの設定忘れも無くなる!)

ちなみに、とかい育ちチャンネルは基本サイマル放送(同時放送)なのですが、
そういう方は、他のプラットホーム(例えばTwitchなど)も同時に自動で枠作成してあげると、
放送準備が一気に簡単になるのでおすすめです!(⊃∪`*)


あわせて読みたい

コメントを残す