前回の記事では、指定したYouTuberの動画情報を一括で取得する方法をご紹介しました。
ところが、前回の記事では指定した期間の中で、最大で50件しか一度に取得できません。今回は指定した期間の中で50件を超えた場合でも、全ての動画情報を取得する方法をご紹介します。
プログラムコード
さっそくですが、指定したYouTuberの動画情報を一括で全件取得するコードは以下になります。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | <?php // GoogleAPIライブラリを読み込む require_once (dirname(__FILE__) . '/vendor/autoload.php'); //---------------------↓パラメータ入力↓--------------------- const API_KEY = "ここに自身のAPIキー"; const CHANNEL_ID = "YouTuberのチャンネルID"; //---------------------↑パラメータ入力↑--------------------- // 動画情報のグローバル変数 $video_info = array(); // 動画の取得する範囲を指定 $stDate = date("Y-m-d", strtotime("-1 year"))."T00:00:00Z"; $edDate = date("Y-m-d")."T00:00:00Z"; // 関数の実行 searchVideos(CHANNEL_ID, "",$stDate, $edDate); // 取得結果の表示 print_r($video_info); // 認証を行う function getClient()  {     $client = new Google_Client();     $client->setApplicationName("youtube-api-test");     $client->setDeveloperKey(API_KEY);     return $client; } // チャンネルの情報を取得する. function searchVideos($id, $pageToken, $st, $ed) {     global $video_info;     $youtube = new Google_Service_YouTube(getClient());     // ここに好きなYouTubeのチャンネルIDを入れる     $params['channelId'] = $id;     $params['type'] = 'video';     $params['maxResults'] = 50;			# 最大50     $params['publishedAfter'] =  $st;	# 'YYYY-MM-DDT00:00:00Z'     $params['publishedBefore'] = $ed;	# 'YYYY-MM-DDT00:00:00Z'     $params['order'] = 'date';     $params['pageToken'] = $pageToken;  # 検索上限数を超えた残りの分     // チャンネルIDからチャンネル情報を取得(1回100クォータが消費される)     $searchResponse = $youtube->search->listSearch('snippet', $params);     // 取得したチャンネルの情報から動画IDを取得     $videos = array();     foreach ($searchResponse['items'] as $search_result) {     	if ($search_result["id"]["kind"] = "youtube#video") {     		$videos[] = $search_result["id"]["videoId"];     	}     }     // 動画情報が空白の場合は処理を終了する     if(empty($videos)){     	return;     }     // 動画IDから動画情報を取得(1回1クォータが消費される)     $listResponse = $youtube->videos->listVideos( 		'id,snippet,statistics,contentDetails', 		array('id' => implode(",", $videos)) 	);     foreach ($listResponse as $val) {      	$publishedAt = $val["snippet"]["publishedAt"];				# 動画公開日     	$title = $val["snippet"]["title"];							# タイトル     	$videoId = $val["id"];										# 動画ID     	$url = 'https://www.youtube.com/watch?v=%s'.$val["id"];		# 動画URL     	$categoryId = $val["snippet"]["categoryId"];				# カテゴリーID     	$duration = covtime($val["contentDetails"]["duration"]);	# 動画の長さ     	$viewCount = $val["statistics"]["viewCount"];				# 視聴数     	$likeCount = $val["statistics"]["likeCount"];				# いいね数     	$commentCount = $val["statistics"]["commentCount"];			# コメント数     	// 取得した動画情報を配列に格納         array_push($video_info, [$publishedAt, $title, $videoId, $url, $categoryId, $duration, $viewCount, $likeCount, $commentCount]);     }     // 指定した期間の動画情報が maxResults を超えている場合     $pageToken = $searchResponse["nextPageToken"];     if(!empty($pageToken)){     	// 次のページトークン     	return searchVideos($id, $pageToken, $st, $ed);     }     return; } function covtime($youtube_time){     if($youtube_time) {         $start = new DateTime('@0'); // Unix epoch         $start->add(new DateInterval($youtube_time));         $youtube_time = $start->format('H:i:s');     }     return $youtube_time; } ?> | 
コードの説明
nextPageToken で残りの結果を取得する
今回のポイントは以下の部分です。一度に最大 50件 までしか取得できないため、1年分の動画を取得した場合、100本の動画があっても、残り50件が取得できません。そのため、以下のように nextPageToken を取得して、再度同じ関数を呼び出しています。こうすることにより、全件取得できます。
| 1 2 3 4 5 6 | // 指定した期間の動画情報が maxResults を超えている場合 $pageToken = $searchResponse["nextPageToken"]; if(!empty($pageToken)){     // 次のページトークン     return searchVideos($id, $pageToken, $st, $ed); } | 
グローバルな配列変数に取得結果を格納する
取得した結果を配列変数に入れていますが、配列変数を関数の外で初期化しています。これは、nextPageToken を取得する際に自身の関数を再帰的に呼び出しており、関数内で変数を初期化してしまうと、最後の結果しか残らないからです。このように関数の外で初期化した変数を使用するには global キーワードを変数の前につけます。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | // 動画情報のグローバル変数 $video_info = array(); function searchVideos($id, $pageToken, $st, $ed) {     global $video_info; // グルーバル変数を宣言     //----------途中省略----------     // 取得した動画情報を配列に格納     array_push($video_info, [$publishedAt, $title, $videoId, $url, $categoryId, $duration, $viewCount, $likeCount, $commentCount]); } | 
使用方法
APIキーとチャンネルIDを記載する
以下の場所にYouTubeAPIキーと取得したいYouTuberのチャンネルを入れます。
| 1 2 3 4 5 6 | //---------------------↓パラメータ入力↓--------------------- const API_KEY = "ここに自身のAPIキー"; const CHANNEL_ID = "YouTuberのチャンネルID"; //---------------------↑パラメータ入力↑--------------------- | 
APIキーの取得方法とチャンネルIDの取得方法は以下の記事を参考にしましょう。
・APIキーの取得方法

・チャンネルIDの取得方法

取得する動画の範囲を指定する
以下の部分では取得する動画の期間を指定しています。以下の例では 1年前の今日の日付~今日の日付 までの範囲を取得しています。この部分はご自由に変更してください。また、”T00:00:00Z”を日付の後ろにつけないとエラーになります。
| 1 2 3 | // 動画の取得する範囲を指定 $stDate = date("Y-m-d", strtotime("-1 year"))."T00:00:00Z"; $edDate = date("Y-m-d")."T00:00:00Z"; | 
実行結果
ごちゃごちゃ で分かりにくいのですが、146件分(※添え字が0から始まるため)の動画情報が一度に取得できたことがわかります。

配列の中身を取り出すときは以下のようにするといいと思います。
| 1 2 3 4 5 6 7 8 9 10 11 | foreach($video_info as $val){ 	print "動画公開日	    :".$val[0]."<br>"; 	print "タイトル		:".$val[1]."<br>"; 	print "動画ID		:".$val[2]."<br>"; 	print "動画URL		:".$val[3]."<br>"; 	print "カテゴリー	    :".$val[4]."<br>"; 	print "動画の長さ	    :".$val[5]."<br>"; 	print "視聴数		:".$val[6]."<br>"; 	print "いいね数		:".$val[7]."<br>"; 	print "コメント数	    :".$val[8]."<br>"; } | 
こちらで取り出した結果は以下の画像になります。

きちんと取得できていますね!
さいごに
いかがだったでしょうか。今回は指定した期間の動画情報を一括で取得する方法をご紹介しました。
今回はPHPで作成していますが、Pythonで取得する方法は以下になります。
是非ご活用ください。
ではまた。
・以下の記事を参考にさせて頂きました。

 
  
  
  
  



コメント