PHPとYOUTUBE DATA API v3で動画のIDからサムネイルを取得する
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/にログインします。
次にコンソール上で新規プロジェクトの作成を行います。プロジェクトはデフォルトで作成します。
ここでは「My Projects 50625」という空のプロジェクトが作成された。
YOUTUBE DATA API v3を有効にする。
左メニューから「ライブラリ」を選択し、表示されるAPIライブラリから「YOUTUBE DATA API v3」を選択、有効にします。
ダッシュボードからAPIライブラリのリンクを押して移動します。
次に「Youtube Data API v3」を選択します。
「有効にする」を押して有効化します。
APIリクエストを送るために使用するAPI KEYを作成する。
左メニューから「認証情報」を選択、プロジェクトを作成し、API KEYの作成、設定を行います。
コンソール上の「認証情報」から「+認証情報を作成」を押して「APIキー」を選択します。
押すだけでAPI KEYが作成されます。
次にAPIKEYの設定を行います。キーの制限としてアプリケーションの制限とAPIの制限を設定します。
使用できる場所としてアプリケーションの制限を設定します、ここではHTTPリクエストを行うページが存在するドメインを設定することにします。
ここで設定する値が後にcURLで設定するリファラー設定と関連します。
正規表現で記載が可能
使用するAPIを制限します。今回はYOUTUBE APIを使用するため選択します。
※先にAPIの有効化を行っていないとここにはでてこない。
設定が終わるとコンソール上はこんな感じに見える。
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_VERIFYPEER | FALSE を設定すると、cURL はサーバー証明書の検証を行いません。 別の証明書を CURLOPT_CAINFO オプションで 指定するか、CURLOPT_CAPATH オプションで 証明ディレクトリを指定します。 |
CURLOPT_RETURNTRANSFER | TRUE を設定すると、curl_exec() の返り値を 文字列で返します。通常はデータを直接出力します。 |
CURLOPT_REFERER | HTTP リクエストで使用される “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
)
)