logo

Now Loading...

WEBサイト作りノウハウ WEBノウハウメモ

  • HOME
  • 記事一覧
  • PHPとYOUTUBE DATA API v3で動画のIDからサムネイルを取得する

PHPとYOUTUBE DATA API v3で動画のIDからサムネイルを取得する

カテゴリー:API関連メモ

作成日付:2020年5月13日

更新日付:2020年5月15日

YOUTUBE DATA API v3を使用して指定した動画IDのサムネイル情報を取得します。HTTPリクエストはPHPのcURLを使用します。YOUTUBE APIを使えるようにするところから実際にサムネイル情報(JSONデータ)を取得するまでのメモ

目的

YOUTUBEの動画を自分のWEBサイトでリストをしたい場合、YOUTUBE動画のサムネイルをその都度ダウンロードして画像を参照させるのは面倒だったため、 目的のYOUTUBE動画IDからサムネイル情報を取得できるようにする。

  • YOUTUBE上の任意の動画情報を取得したい
  • YOUTUBEへのAPIリクエストをPHPで実行したい

結果

Google管理コンソール上で新規のプロジェクトと、APIが有効化され、API KEYが設定された状態になる。
API KEYの設定は、API KEYを使用できる場所と使用するAPIを設定する。
その状態で自身のWebサイト上からcURLを使用してYOUTUBEにHTTPリクエストを送信する。

PHP cURLを使用したAPI実行


function get_video($url, $query = array() , $api_ref){ if ($query) $url .= ('?' . http_build_query($query, '', '&', PHP_QUERY_RFC3986)); // curl init $ch = curl_init(); // curl set url and option curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // https の場合、証明書検証をしない curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_REFERER, $api_ref); $res = curl_exec($ch); // curl end curl_close($ch); return json_decode($res); } $api_key = 作成したAPI KEY; $api_ref = 設定したリファラ; $youtube_id = 目的のYOUTUBE動画ID; $response = get_video('https://www.googleapis.com/youtube/v3/videos', array( 'key' => $api_key, 'id' => $youtube_id, // ID 'part' => 'snippet', // 取得するデータの種類 (タイトルや画像を含める場合はsnippet) 'type' => 'video', // 結果の種類 (channel,playlist,video) ), $api_ref); //サムネイル(Standardサイズ)を出力する echo $response->items[0]->snippet->thumbnails->standard->url;

方法

フロー

1googleアカウントを使用してYOUTUBE APIを有効化する。
2YOUTUBE DATA API v3を有効にする。
3APIリクエストを送るために使用するAPI KEYを作成する。
4PHPでYOUTUBE動画の動画IDを使用してサムネイルを取得する。

googleアカウントを使用してYOUTUBE APIを有効化する。

googleアカウントでGoogle Developer Consoleにログインします。

最初にGoogleでhttps://myaccount.google.com/からアカウントを作成し、 Google Developer Consolehttps://console.developers.google.com/にログインします。
次にコンソール上で新規プロジェクトの作成を行います。プロジェクトはデフォルトで作成します。

google deveroper console 1

ここでは「My Projects 50625」という空のプロジェクトが作成された。

google deveropler console new project

YOUTUBE DATA API v3を有効にする。

左メニューから「ライブラリ」を選択し、表示されるAPIライブラリから「YOUTUBE DATA API v3」を選択、有効にします。

ダッシュボードからAPIライブラリのリンクを押して移動します。

google ダッシュボード

次に「Youtube Data API v3」を選択します。

google APIライブラリ

「有効にする」を押して有効化します。

google API有効化画面

APIリクエストを送るために使用するAPI KEYを作成する。

左メニューから「認証情報」を選択、プロジェクトを作成し、API KEYの作成、設定を行います。

コンソール上の「認証情報」から「+認証情報を作成」を押して「APIキー」を選択します。

google API KEY作成

押すだけでAPI KEYが作成されます。

google API KEY作成 2

次にAPIKEYの設定を行います。キーの制限としてアプリケーションの制限とAPIの制限を設定します。

google API KEY作成 3

使用できる場所としてアプリケーションの制限を設定します、ここではHTTPリクエストを行うページが存在するドメインを設定することにします。
ここで設定する値が後にcURLで設定するリファラー設定と関連します。
正規表現で記載が可能

google API KEY作成 4

使用するAPIを制限します。今回はYOUTUBE APIを使用するため選択します。
※先にAPIの有効化を行っていないとここにはでてこない。

google API KEY作成 5

設定が終わるとコンソール上はこんな感じに見える。

google API KEY作成 6

PHPでYOUTUBE動画の動画IDを使用してサムネイルを取得する。

PHPでcURLを使用してYOUTUBEに対してHTTPリクエストを送信します。引数にYOUTUBE動画のIDを渡すことで指定の動画情報を取得できます。

自身のWebサイト(API KEY設定でリファラに登録した場所)からHTTPリクエストを行います。
今回は目的の動画の情報を取得したいため、先に動画のIDを既に取得している必要があります。
全部の文は以下のような感じで作成。


function get_video($url, $query = array() , $api_ref){ if ($query) $url .= ('?' . http_build_query($query, '', '&', PHP_QUERY_RFC3986)); // curl init $ch = curl_init(); // curl set url and option curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // https の場合、証明書検証をしない curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_REFERER, $api_ref); $res = curl_exec($ch); // curl end curl_close($ch); return json_decode($res); } $api_key = 作成したAPI KEY; $api_ref = 設定したリファラ; $youtube_id = 目的のYOUTUBE動画ID; $response = get_video('https://www.googleapis.com/youtube/v3/videos', array( 'key' => $api_key, 'id' => $youtube_id, // ID 'part' => 'snippet', // 取得するデータの種類 (タイトルや画像を含める場合はsnippet) 'type' => 'video', // 結果の種類 (channel,playlist,video) ), $api_ref); //サムネイル(Standardサイズ)を出力する echo $response->items[0]->snippet->thumbnails->standard->url;

HTTPメソッドを送るURLを作成する

以下の処理は実際はこのようなURLを作成している↓↓↓

https://www.googleapis.com/youtube/v3/videos?key=APIKEY&id=動画ID&part=snippet&type=video


if ($query) $url .= ('?' . http_build_query($query, '', '&', PHP_QUERY_RFC3986));

cURLオプション設定

CURLOPT_REFERERはAPI KEY作成で設定した値を入れる。今回使用しているオプションは以下のような感じ。
参考はhttps://www.php.net/manual/ja/function.curl-setopt.php


// curl set url and option
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // https の場合、証明書検証をしない
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_REFERER, $api_ref);
説明
CURLOPT_URL取得する URL 。curl_init() でセッションを 初期化する際に指定することも可能です。
CURLOPT_SSL_VERIFYPEERFALSE を設定すると、cURL はサーバー証明書の検証を行いません。 別の証明書を CURLOPT_CAINFO オプションで 指定するか、CURLOPT_CAPATH オプションで 証明ディレクトリを指定します。
CURLOPT_RETURNTRANSFERTRUE を設定すると、curl_exec() の返り値を 文字列で返します。通常はデータを直接出力します。
CURLOPT_REFERERHTTP リクエストで使用される “Referer: ” ヘッダの内容。
戻り値成功した場合に TRUE を、失敗した場合に FALSE を返します。

サムネイル画像URLの出力

サムネイル画像情報をピンポイントで出力している
参考はYOUTUBE動画クエリ結果で返されるJSONに戻り値のJSON情報を記載


echo $response->items[0]->snippet->thumbnails->standard->url;

参考

その他詳細

cURLでリファラ設定をしなかった場合のエラー

PHPのcURLでリファラを設定しなかった場合のエラーメッセージ、リファラを設定するか、リファラ制限を解除しろという雰囲気がでている。
curl_setopt($ch, CURLOPT_REFERER, $api_ref)を設定することで解消する。


string(555) "{ "error": { "errors": [ { "domain": "usageLimits", "reason": "ipRefererBlocked", "message": "The request did not specify any referer. Please ensure that the client is sending referer or use the API Console to remove the referer restrictions.", "extendedHelp": "https://console.developers.google.com/apis/credentials?project=129334364482" } ], "code": 403, "message": "The request did not specify any referer. Please ensure that the client is sending referer or use the API Console to remove the referer restrictions." } } " NULL

YOUTUBE動画クエリ結果で返されるJSON

PHPのcURLでHTTPリクエストをした結果として返されるJSON


stdClass Object ( [kind] => youtube#videoListResponse [etag] => xxxxxxxxxxxxxxx [items] => Array ( [0] => stdClass Object ( [kind] => youtube#video [etag] => xxxxxxxxxxxxxx [id] => YOUTUBE動画ID [snippet] => stdClass Object ( [publishedAt] => 2020-03-22T09:00:32Z [channelId] => xxxxxxxxxxx [title] => XXXXXXXXXXXXXXXXXXXX [description] => [thumbnails] => stdClass Object ( [default] => stdClass Object ( [url] => https://i.ytimg.com/vi/YOUTUBE動画ID/default.jpg [width] => 120 [height] => 90 ) [medium] => stdClass Object ( [url] => https://i.ytimg.com/vi/YOUTUBE動画ID/mqdefault.jpg [width] => 320 [height] => 180 ) [high] => stdClass Object ( [url] => https://i.ytimg.com/vi/YOUTUBE動画ID/hqdefault.jpg [width] => 480 [height] => 360 ) [standard] => stdClass Object ( [url] => https://i.ytimg.com/vi/YOUTUBE動画ID/sddefault.jpg [width] => 640 [height] => 480 ) [maxres] => stdClass Object ( [url] => https://i.ytimg.com/vi/YOUTUBE動画ID/maxresdefault.jpg [width] => 1280 [height] => 720 ) ) [channelTitle] => XXXXXXXXXxXXX [tags] => Array ( [0] => xxxxxx [1] => xxxxxx ) [categoryId] => 10 [liveBroadcastContent] => none [localized] => stdClass Object ( ) ) ) ) [pageInfo] => stdClass Object ( [totalResults] => 1 [resultsPerPage] => 1 ) )

YOUTUBE動画が存在しなかった場合で返されるJSON

動画IDを指定しなかった場合、または動画IDのURLが存在しなかった場合


stdClass Object
(
    [kind] => youtube#videoListResponse
    [etag] => 4A4yzir3y7zPgKvC8mQ3kushMZ4
    [items] => Array
        (
        )

    [pageInfo] => stdClass Object
        (
            [totalResults] => 0
            [resultsPerPage] => 0
        )

)