【初心者必見】Youtube Data api v3 利用方法と使用制限について

Blog-Thumbnail_YouTube-01 YouTube

はじめに

こんにちは、KUDs です。

以前 KUDs が作成した Live Stream Calendar についてブログ記事で紹介しました。

そっしーの YouTube / Twitch の過去配信をLive Stream Calendarで表示「カレンダー」
そっしーの YouTube / Twitch の過去配信をLive Stream Calendarで表示「カレンダー」

上記サービスは、YouTube / Twitch の過去のライブ配信情報をカレンダー表示するものです。
紹介したブログの中でも言及していますが、こちらは YouTube 公式の API を利用しています。
その名も、YouTube Data api v3 です。

この API を使用することで、YouTube のチャンネルやビデオの検索、ビデオのアップロード、プレイリストの管理など、多岐にわたる操作が可能になります。
今回はこの API について、以下の点を解説していきます。

  • YouTube Data api v3 の始め方 (有効化方法と認証情報作成)
  • 実際の API 利用方法 (Bash / Python / Node.js でのコーディング)
  • 使用制限 (デフォルトのクォータやメソッドによる消費量の違い)

では、まず YouTube Data api v3 を有効化する手順から確認していきましょう。

YouTube Data API v3 の利用開始手順

YouTube Data API v3 を利用するには、まず GCP ※ でプロジェクトを作成し、API を有効にし、認証情報を作成する必要があります。
※ GCP: Google Cloud Platform
ここでは、その手順を詳しく説明します。

Google Cloud Platformでのプロジェクト作成

GCP コンソールへのアクセス

Google Cloud Console にアクセスし、Google アカウントでログインします。

Google Cloud Console 「無料トライアルを試す」
Google Cloud Console 「無料トライアルを試す」

アクセスすると、GCP を初めて利用する方は上記のような画面が表示されます。
ここでは、「無料トライアルを試す」必要はありません。
コンソール画面上部にある「プロジェクトの選択」をクリックしましょう。

新しいプロジェクトの作成

「プロジェクトの選択」をクリックすると以下のウィンドウが表示されます。

Google Cloud Console 「プロジェクトを選択」
Google Cloud Console 「プロジェクトを選択」

上記、「プロジェクトを選択」ウィンドウ内の「新しいプロジェクト」をクリックします。

Google Cloud Console 「新しいプロジェクト」
Google Cloud Console 「新しいプロジェクト」

上記、「新しいプロジェクト」画面が表示されるので、「プロジェクト名」を指定して「作成」します。

Google Cloud Console 「プロジェクト作成中」
Google Cloud Console 「プロジェクト作成中」

A few seconds later…

プロジェクトの選択

Google Cloud Console 「プロジェクト作成完了」
Google Cloud Console 「プロジェクト作成完了」

プロジェクトの作成が完了しました。

プロジェクトが作成されたら、「プロジェクトを選択」してアクティブにします。

YouTube Data API v3 の有効化

API ライブラリへのアクセス

プロジェクトを選択すると、以下のような画面が表示されます。

Google Cloud Console 「ダッシュボード」
Google Cloud Console 「ダッシュボード」

色々出てきますが、無視してください。

YouTube Data API v3 の検索

画面上部の検索欄で「YouTube Data API v3」と検索し、検索結果から API を選択します。

Google Cloud Console 「YouTube Data api v3 検索」
Google Cloud Console 「YouTube Data api v3 検索」

MARKETPLACE の YouTube Data API v3 (Google) を選択します。
※上記画面内の一番下です

API の有効化

以下のような YouTube Data api v3 の製品ページに遷移するはずです。

Google Cloud Console 「YouTube Data api v3 MARKETPLACE 」
Google Cloud Console 「YouTube Data api v3 MARKETPLACE 」

ここでは、「有効にする」をクリックします。

認証情報を作成 / API キーの取得

API 有効化が完了すると、「有効な API とサービス」タブで YouTube Data api v3 が表示されます。
以下のような画面が表示されるかと思います。

Google Cloud Console 「YouTube Data api v3 詳細」
Google Cloud Console 「YouTube Data api v3 詳細」

認証情報の作成

先程の画面で、「認証情報を作成」をクリックします。 ※画面右上のボタン
クリックすると以下の画面に遷移します。

Google Cloud Console 「認証情報の種類」
Google Cloud Console 「認証情報の種類」

今回は一般公開データのみアクセスするので、「一般公開データ」を選択し、「次へ」をクリックします。

Google Cloud Console 「認証情報」
Google Cloud Console 「認証情報」

API キーが表示されるので、コピーしましょう。

これで準備は完了しました!
後は API を利用するだけです!

補足: API キーのセキュリティについて

API キーは機密情報なので、安全に管理し、公開リポジトリなどにはアップロードしないようにしましょうね。
ハードコードとかもやめましょうね。
(たまに見かけるので)

また、API キーが作成されたら、不正利用を防ぐために適切な制限を設定しておくことを推奨します。
例えば、API キーを使用できる HTTP リファラーや IP アドレスを制限することが推奨されます。
今回はとりあえず API を利用するのが目標なので、一旦スルーします。

YouTube Data API v3 を実際に使ってみた

この章では、実際に API を利用してみましょう。

Bash、Python、Node.js を使用した基本的な利用法を紹介します。
今回は、KUDs が切り抜き活動をさせていただいている、そっしーの開拓地 YouTube チャンネルの最新ライブ情報を取得するケースを扱います。

Bash での簡単な利用法

Bash を使用した API リクエストは、curl コマンドを用いて行います。
以下のスクリプトは、特定のチャンネルIDに対して最新のビデオ情報を取得します。

$ API_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
$ CHANNEL_ID="UC7bsuPf841U0u3TCtf5IRrA"
$ ENDPOINT="https://www.googleapis.com/youtube/v3/search"
$ curl -G -s "$ENDPOINT" \
     --data-urlencode "key=${API_KEY}" \
     --data-urlencode "channelId=${CHANNEL_ID}" \
     --data-urlencode "part=snippet" \
     --data-urlencode "order=date" \
     --data-urlencode "maxResults=1" \
     --data-urlencode "type=video"
  • この例では、最新のビデオ 1 件に関する情報を JSON 形式で取得します。
  • API_KEY には先ほどコピーした API キーを使います。
  • CHANNEL_ID は、対象となるチャンネルの ID を指定します。
  • そっしーの開拓地 YouTube チャンネルの ID は UC7bsuPf841U0u3TCtf5IRrA です。(@yellowsossie ではないので注意)
  • ちなみに、もちろん BASH スクリプトにしていただいても動作します。

レスポンス確認

上記のコマンドを実行すると、以下のようなレスポンスが返されます。

"snippet": {
        "publishedAt": "2024-02-04T08:22:45Z",
        "channelId": "UC7bsuPf841U0u3TCtf5IRrA",
        "title": "【FF4】ファイナルファンタジーIVを今更初見プレイ 5",
        "description": "配信について一言 世代なのにこれまた初見プレイ 本日のゲーム→ファイナルファンタジーIV ...",
        "thumbnails": {
          "default": {
            "url": "https://i.ytimg.com/vi/kGOZcsJKhy8/default.jpg",
            "width": 120,
            "height": 90
          },
          "medium": {
            "url": "https://i.ytimg.com/vi/kGOZcsJKhy8/mqdefault.jpg",
            "width": 320,
            "height": 180
          },
          "high": {
            "url": "https://i.ytimg.com/vi/kGOZcsJKhy8/hqdefault.jpg",
            "width": 480,
            "height": 360
          }
        },
        "channelTitle": "そっしーの開拓地",
        "liveBroadcastContent": "none",
        "publishTime": "2024-02-04T08:22:45Z"
      }

補足: YouTube チャンネル ID について

  • YouTube チャンネル ID とは、 “UC” で始まる文字列で、特定のチャンネルを一意に識別するものです。
    • 例: UC7bsuPf841U0u3TCtf5IRrA
  • YouTube ハンドルとは、”@” で始まる文字列で、チャンネル毎に任意の値を設定できる、重複不可能なものです。
    • 例: @yellowsossie

チャンネル ID は以前は YouTube チャンネルページの URL から簡単に確認できました。
例: https://www.youtube.com/channel/UC7bsuPf841U0u3TCtf5IRrA

しかし、YouTube ハンドル (例: @yellowsossie) が 2022/11 にリリースされたことで、URL は以下の形式になりました。
例: https://www.youtube.com/@yellowsossie

ちなみに以下はリリース時の公式のブログです。(見たい人いればどうぞ)

Introducing handles: A new way to identify your YouTube channel
Discover handles, a new way for people to find YouTube channels with usernames and engage with creators and each other o...

つまり、現時点では URL からは チャンネル ID が確認できなくなってしまったのです。
そのため、現在は該当の YouTube チャンネルの画面を表示した上で、開発者ツールやソースを表示するなりして ID を確認する必要があります。
開発者ツールは F12 キー、ソース表示は Ctrl + U で可能です。

※以下は開発者ツールで確認する例です。

そっしーの開拓地 YouTube チャンネル「ID 確認」
そっしーの開拓地 YouTube チャンネル「ID 確認」

Python での実装方法

さて、先程は Bash で Curl コマンドを使用してレスポンスを確認しました。
ただ、「Python を使ってるんだけど」という方も多いと思いますので、Python の例も書いておきます。

以下は、AWS Lambda で Python 3.12 ランタイムを使用した際のコード例です。

import os
import http.client
import json
from urllib.parse import urlencode
from datetime import datetime

def lambda_handler(event, context):
    api_key = os.environ['API_KEY']
    channel_id = event['queryStringParameters']['channelId']
    params = urlencode({
        'part': 'snippet',
        'channelId': channel_id,
        'maxResults': 1,
        'type': 'video',
        'eventType': 'completed',
        'order': 'date',
        'key': api_key
    })

    conn = http.client.HTTPSConnection("www.googleapis.com")
    conn.request("GET", f"/youtube/v3/search?{params}")

    response = conn.getresponse()
    data = response.read()
    conn.close()

    items = json.loads(data.decode("utf-8"))['items']

    if items:
        latest_broadcast = items[0]
        title = latest_broadcast['snippet']['title']
        published_at = latest_broadcast['snippet']['publishTime']
        formatted_date = datetime.strptime(published_at, "%Y-%m-%dT%H:%M:%SZ").strftime('%Y%m%d %H:%M')
        message = f"直近の生配信は、{formatted_date}に配信された「{title}」です。"
    else:
        message = "直近の生配信は見つかりませんでした。"

    return {
        'statusCode': 200,
        'body': message
    }
  • API_KEY は環境変数から取得するように記載したので、適宜設定してください
  • channelId はリクエストから取得する形にしました
  • google-api-python-client ライブラリが便利ですが、レイヤー追加が面倒だったので使ってません

レスポンス確認

では、実際に以下の Event JSON でテスト実行してみましょう。

{
  "queryStringParameters": {
    "channelId": "UC7bsuPf841U0u3TCtf5IRrA"
  }
}

以下のようなレスポンスが返されました。

{
  "statusCode": 200,
  "body": "直近の生配信は、20240204 08:22に配信された「【FF4】ファイナルファンタジーIVを今更初見プレイ 5」です。"
}

問題なさそうですね。

Node.js での実装方法

「いやいや、Node.js 使ってるんだが」という方もいるかと思いましたので、Node.js の実装例も書いておきます。

以下は、AWS Lambda で Node.js 20.x ランタイムを使用した際のコード例です。

import https from 'https';

export async function handler(event) {
    const apiKey = process.env.API_KEY;
    const channelId = event.queryStringParameters.channelId;
    const url = `https://www.googleapis.com/youtube/v3/search?part=snippet&channelId=${channelId}&maxResults=1&type=video&eventType=completed&order=date&key=${apiKey}`;

    return new Promise((resolve, reject) => {
        https.get(url, (res) => {
            let data = '';
            
            res.on('data', (chunk) => {
                data += chunk;
            });
            
            res.on('end', () => {
                const response = JSON.parse(data);
                let message = "直近の生配信は見つかりませんでした。";
                if (response.items.length > 0) {
                    const latestBroadcast = response.items[0];
                    const title = latestBroadcast.snippet.title;
                    const publishedAt = new Date(latestBroadcast.snippet.publishTime);
                    const formattedDate = `${publishedAt.getFullYear()}${(publishedAt.getMonth() + 1).toString().padStart(2, '0')}${publishedAt.getDate().toString().padStart(2, '0')}`;
                    const formattedTime = `${publishedAt.getHours().toString().padStart(2, '0')}:${publishedAt.getMinutes().toString().padStart(2, '0')}`;
                    
                    message = `直近の生配信は、${formattedDate} ${formattedTime}に配信された「${title}」です。`;
                }
                resolve({
                    statusCode: 200,
                    body: message
                });
            });
        }).on('error', (e) => {
            reject(Error(e));
        });
    });
};

  • API_KEY は同じく環境変数から取得
  • channelId も同じくリクエストから取得する形にしました
  • googleapis パッケージが便利ですが、同様の理由で使わない

レスポンス確認

ではでは、同様に以下の Event JSON でテスト実行してみましょう。

{
  "queryStringParameters": {
    "channelId": "UC7bsuPf841U0u3TCtf5IRrA"
  }
}

以下のレスポンスが返されました。

{
  "statusCode": 200,
  "body": "直近の生配信は、20240204 08:22に配信された「【FF4】ファイナルファンタジーIVを今更初見プレイ 5」です。"
}

問題なさそうですね。

API クォータの管理と最適化

YouTube Data API v3 は無料で使えます。
しかし、無制限で使いたい放題と言う訳ではありません。
API の利用にはクォータ制限があります。

クォータは API の使用量を測る単位のようなもので、API をコールするたびに消費されます。
この章では、クォータの確認方法、メソッドごとのクォータ消費量の理解、および使用量を削減する方法について説明します。

クォータ状況の確認方法

こちらは Google Cloud Console から確認できます。

先程の YouTube Data api v3 の詳細画面で、「割り当てとシステム制限」を確認しましょう。

Google Cloud Console 「割り当てとシステム制限」
Google Cloud Console 「割り当てとシステム制限」

上記のように、Queries per day の現在の使用量が 300 となっていることが確認できます。
これは、API を先ほど 3 回利用したことに起因しています。
また、現時点で制限値の 3% を消費していることも確認できますね。

メソッドごとのクォータ消費量

先程、クォータが API 3 回の利用で 300 消費されていることを確認しました。
こちらは、常に 100 ずつ消費されるわけではありません。
API をどのように使用するか、言い方を替えれば、「どのメソッドを使用するか」によって変動します。

今回の例で、KUDs は以下のエンドポイントを指定していました。

"https://www.googleapis.com/youtube/v3/search"

こちらは、search.list メソッドを使用します。
search.list は各種メソッドの中でも比較的クォータ消費量が多いメソッドで、1 回の使用で 100 のコストが発生します。

詳しくは以下の公式ドキュメントをご参照ください。

YouTube Data API (v3) - Quota Calculator  |  Google for Developers

クォータ使用量の削減案

クォータ制限内で効率的にAPIを使用するための対策案です。

  • 必要なデータのみをリクエストする
    • search.list メソッドは便利ですがコストが膨らみがちです。要件によってメソッドを変えたり、リクエストに含める part パラメータを最小限に抑えることで、クォータ消費を減らすことを検討しましょう。
  • キャッシュを利用する
    • API から取得したデータを一定期間キャッシュし、同じリクエストに対してはキャッシュからデータを提供することで、不要な API コールを削減できます。
    • ただ、長期間キャッシュすることは YouTube の規約違反になるので、きちんと利用規約を確認しましょう。
  • ページングを適切に使用する
    • 大量のデータを取得する場合は、maxResults パラメータを適切に設定し、ページングを効果的に使用して、必要なデータのみを取得しましょう。
  • 上限を緩和する
    • 使用量の削減案ではないですが、そもそも使用可能な量を増やしてしまえば良いのです。
    • クォータの上限を緩和するよう Google に申請することが可能です。申請が通れば、10,000 -> 1,000,000 とか、一気に桁違いのクォータが使用可能になります
    • 申請方法は、ここに書くには少々長くなっちゃうので、後日記事にしようかと 記事にしました。興味がある方は以下をご参照ください。
【2024最新】YouTube Data APIクォータ上限緩和申請方法/注意点

さいごに

この記事では、YouTube Data API v3 の基本から始め、API の有効化、具体的な利用方法、そして API クォータの管理と最適化について解説しました。

まとめ

以下、内容のおさらいです。

  • API を使用するための前準備をしました
    • GCP でプロジェクトを作成しました
    • YouTube Data API v3を有効にしました
    • 認証情報を作成し、API キーを取得しました
      • セキュリティには気を付けましょうね
  • 実際に API を利用してみました
    • Bash、Python、Node.js での API 使用方法を確認しました
    • 実際にレスポンスを確認し、正常に利用できることを確認しました
  • API クォータについて確認しました
    • 先ほどの API 使用によってクォータが消費されていることを確認しました
    • クォータの消費量は API メソッドによって異なることを確認しました
    • クォータ消費を抑える方法について確認しました
      • 必要なデータのみをリクエストすること
      • キャッシングを利用すること
      • ページングを適切に使用すること
      • クォータの上限緩和申請をすること
        • 後日記事にします 記事にしました。

今後

おそらく、ある程度しっかり取り組もうと思っている人は必ず「クォータの上限緩和申請」を検討すると思います。
この申請、世間一般的に「ハードル高い」と思われているようですが、ちゃんと申請すれば普通に通ります。
そのあたりの申請のノウハウも後日記事にできればと思っています 記事にしました。

【2024最新】YouTube Data APIクォータ上限緩和申請方法/注意点

Twitch API に関する記事は、(そんなに需要ないかなぁ)という先入観のもと先送りにします。
需要ありそうならいつか何か書くかもです。

以上です。

コメント