【PHP】YouTube の URL から動画データを取得する

YouTube の URL から動画データ(タイトル、チャンネル名、投稿日時、サムネイル)などを取得する方法について説明します。
ざっくり手順は以下の通りです。
- URL から 動画の ID を取得する
- 動画 ID から YouTube Data API を用いて、動画データを取得する
まずは URL から 動画の ID を取得する方法です。これは preg_match で実現できます。
$video_url = "動画のURL";
preg_match('/(http(s|):|)\/\/(www\.|)yout(.*?)\/(embed\/|watch.*?v=|)([a-z_A-Z0-9\-]{11})/i', $video_url, $results);
$video_id = $results[6];
次に YouTube Data API を用いて、動画 ID から動画データを取得します。YouTube Data API の取得方法については、他にも詳しいページがあるので割愛しますが、Google Cloud Platform にアクセスして、アカウントにログイン後、API を有効化すれば取得できます。(API にはアクセスする IP アドレスなどに制限を設けておくとよいと思います。)なお取得できるデータ数は1日につき動画1万本までです(参考)。
動画データの取得は、以下のようにして file_get_contents から JSON 形式で取得できます。
$api_key ="APIキー";
$api_url = "https://www.googleapis.com/youtube/v3/videos?id=$video_id&key=$api_key&part=snippet";
$youtube_json = file_get_contents($api_url);
JSON をデコードして、foreach で回せば、以下のように動画データを取得できます。動画の投稿日時は、GMT(グリニッジ標準時)となっています。
$get_youtube_data = json_decode($youtube_json, true);
foreach((array)$get_youtube_data['items'] as $key => $temp_youtube_data){
$video_title = $temp_youtube_data['snippet']['title'];
$video_thumbnail = $temp_youtube_data['snippet']['thumbnails']['high']['url'];
$channel_name = 'YouTube ('.$temp_youtube_data['snippet']['channelTitle'].')';
$temp_publishedAt = $temp_youtube_data['snippet']['publishedAt'];
$video_publishedAt_GMT = new DateTime($temp_publishedAt);
}
実行環境が WordPress であれば、以下のようにタイムゾーンを直すのもありかと思います。
$video_publishedAt = new DateTime($temp_publishedAt, new DateTimeZone(get_option('timezone_string')));
まとめると以下のようになります。
$video_url = "動画のURL";
if((strpos($video_url, 'https://www.youtube.com') !== false) || (strpos($video_url, 'https://youtu.be') !== false)){
preg_match('/(http(s|):|)\/\/(www\.|)yout(.*?)\/(embed\/|watch.*?v=|)([a-z_A-Z0-9\-]{11})/i', $video_url, $results);
$video_id = $results[6];
$api_key = "APIキー";
$api_url = "https://www.googleapis.com/youtube/v3/videos?id=$video_id&key=$api_key&part=snippet";
$youtube_json = file_get_contents($api_url);
if($youtube_json){
$get_youtube_data = json_decode($youtube_json, true);
foreach((array)$get_youtube_data['items'] as $key => $temp_youtube_data){
$video_title = $temp_youtube_data['snippet']['title'];
$video_thumbnail = $temp_youtube_data['snippet']['thumbnails']['high']['url'];
$channel_name = 'YouTube ('.$temp_youtube_data['snippet']['channelTitle'].')';
$temp_publishedAt = $temp_youtube_data['snippet']['publishedAt'];
$video_publishedAt_GMT = new DateTime($temp_publishedAt);
$video_publishedAt = new DateTime($temp_publishedAt, new DateTimeZone(get_option('timezone_string')));
}
}
}
ちょっと宣伝
当サイトは WordPress 自作テーマを使った海外旅ブログ/YouTube まとめサイトとなっています。トップページに地図がありますが、地名を押すと画像が開き、画像を押すと関連記事一覧(クリック数順)が開きます。記事数が多い国ほど赤く、地名もその国で記事が多い都市の文字が大きくなるようにしています。ぜひ覗いてみてください。
当サイトで海外旅ブログを執筆することも可能です(もちろん無料です)! また既にブログをお持ちの方も、当サイトからリンクを貼ることができるようになっています。パントレ開発部までお気軽にお問い合わせください。
パントレ開発部