YouTube Data API v3を利用して、アップロード動画一覧を取得する

YouTube Data APIを使ってチャンネルにアップロードされた動画一覧を取得するには、

  1. APIリクエストを行うオブジェクトを作成
  2. 対象チャンネルの uploads プレイリストIDを取得
  3. uploads プレイリストIDを指定してリスト内の動画情報を取得

を行う必要がある。

APIリクエストを行うオブジェクトの作成は次のように行う。


require_once '/path/to/google-api-php-client/vendor/autoload.php';

// 1. APIリクエストを行うオブジェクトを作成

$client = new Google_Client();
$client->setDeveloperKey("_YOUR_API_KEY_");
$youtube = new Google_Service_YouTube($client);

Google_Client オブジェクトを作成して、APIキーをセットする。メソッド名が setDeveloperKey となっていて紛らわしいが、普通にAPIキーをセットすれば良い。

APIキーは、Google Cloud Platform の "API とサービス" → "認証情報" ページに移動して、"認証情報を作成" ボタンをクリックして、プルダウンメニューから "API キー" を選択すれば作成できる。

作成した Google_Client オブジェクトを使って、Google_Service_YouTube オブジェクトを作成する。Google_Service_YouTube オブジェクトを利用すると、YouTubeサービスが提供する機能をAPI経由で操作できるようになる。


次に、対象チャンネルの uploads プレイリストIDを取得する。


// 2. "uploads" リストのIDを取得

// https://www.youtube.com/channel/UCrXUsMBcfTVqwAS7DKg9C0Q
$channelId = "UCrXUsMBcfTVqwAS7DKg9C0Q"; // YouTube Japan
$response = $youtube->channels->listChannels('contentDetails', ['id' => $channelId]);

$item = $response['items'][0];
$uploadsListId = $item['contentDetails']['relatedPlaylists']['uploads'];

対象チャンネルの uploads プレイリスト情報を取得するには、そのチャンネルのチャンネルIDを指定してAPIリクエストを送る必要がある。

チャンネルIDとは、チャンネルURLの末尾の英数字から成る文字列のことで、例えば、

https://www.youtube.com/channel/UCrXUsMBcfTVqwAS7DKg9C0Q

というURLの場合、UCrXUsMBcfTVqwAS7DKg9C0Q がチャンネルIDとなる。

APIレスポンスに含める channel リソースのプロパティには contentDetails、フィルタのパラメータにはチャンネルIDを指定し、$youtube->channels->listChannels() でリクエストを実行する。

レスポンスとして返ってきた channel リソースには contentDetails.relatedPlaylists.uploads プロパティが含まれていて、そのプロパティの値が uploads リストのIDに該当する。

参考:
チャンネル URL について - YouTube ヘルプ
Channels: list | YouTube Data API | Google Developers
Channels | YouTube Data API | Google Developers # channelsリソースの形式と各プロパティの説明


最後に、uploads プレイリストIDを指定してプレイリスト内の動画情報を取得する。


// 3. "uploads" リスト内のアイテムを取得

$pageToken = "";

$params = [
  'playlistId' => $uploadsListId,
  'maxResults' => 10
];

do {
  $response = $youtube->playlistItems->listPlaylistItems('snippet', $params);

  foreach ($response['items'] as $item)
  {
    $snippet = $item['snippet'];

    echo "videoId: {$snippet['resourceId']['videoId']}\n";
    // https://www.youtube.com/watch?v={$snippet['resourceId']['videoId']}

    echo "title: {$snippet['title']}\n";
    echo "publishedAt: {$snippet['publishedAt']}\n";

    echo "----\n";
  }

  echo "\n";
  echo "nextPageToken: {$response['nextPageToken']}\n";
  echo "prevPageToken: {$response['prevPageToken']}\n";
  echo "totalResults: {$response['pageInfo']['totalResults']}\n";
  echo "resultsPerPage: {$response['pageInfo']['resultsPerPage']}\n";
  echo "\n";

  $pageToken = $response['nextPageToken'];
  $params['pageToken'] = $pageToken;

  sleep(1);
} while (!empty($pageToken));

APIレスポンスに含める playlistItem リソースのプロパティに snippet を指定して $youtube->playlistItems->listPlaylistItems() でリクエストを行い、プレイリスト内のアイテム(この場合は動画の情報)を取得する。

その際、APIリクエストのフィルタのパラメータは下記のように設定する。


$params = [
  'playlistId' => $uploadsListId,
  'maxResults' => 10
];

playlistId パラメータにプレイリストID、maxResults パラメータには、APIレスポンスに含める playlistItems リソースのアイテム数を指定する。デフォルト値は 5 で、最大 50 まで指定できる。

2ページ目以降など特定のページの結果を取得するには、pageToken を指定する。pageToken には、APIレスポンスに含まれている nextPageTokenprevPageToken の値を指定する。pageToken に何も指定しないと1ページ目の結果が返される。


$params = [
  'playlistId' => $uploadsListId,
  'maxResults' => 10,
  'pageToken' => $pageToken
];

maxResults に10を指定した場合、リクエスト毎に最大10件のアイテムが返ってくる。各アイテムは snippet プロパティを持ち、このプロパティを参照することで、アイテムの基本情報(動画ID、動画タイトル、追加日時など)を取得できる。

参考:
PlaylistItems: list | YouTube Data API | Google Developers
PlaylistItems | YouTube Data API | Google Developers # playlistItemsリソースの形式と各プロパティの説明