サンプルコードの概要
YouTube Data APIを使って、ユーザーがアップロードした動画を取得します。
これまでのサンプルコードはAPIキーを使って情報を取得していました。今回はクライアントキーとクライアントシークレットを使ってOAuthを行います。
これまでのサンプルコード一覧:Google APIの記事一覧
下準備
まずは、
をごらんください。
【PHPで】Google APIの始め方の冒頭【1】でAPIキーを取得していますが、今回はクライアントキーとクライアントシークレットが必要になります。
「APIとサービス」⇒「認証情報」⇒「+認証情報を作成」⇒「OAuthクライアントID」から取得してください。
「アプリケーションの種類」は「ウェブアプリケーション」。
「承認済みのリダイレクト URI」は、取得した動画を表示するURLを入力します。
さらに、「OAuth同意画面」をクリックします。
作成済みのアプリの「公開ステータス」を「テスト」のまま運用する場合は、テストユーザーを登録してください。
サンプルコード
<?php
if (!file_exists(__DIR__ . '/vendor/autoload.php')) {
throw new \Exception('please run "composer require google/apiclient:~2.0" in "' . __DIR__ .'"');
}
require_once __DIR__ . '/vendor/autoload.php';
if(!session_start()){
echo "<p>セッションが開始できません。</p>";
return;
}
$OAUTH2_CLIENT_ID = 'クライアントキーをここに入れる';
$OAUTH2_CLIENT_SECRET = 'クライアントシークレットをここに入れる';
$client = new Google_Client();
$client->setClientId($OAUTH2_CLIENT_ID);
$client->setClientSecret($OAUTH2_CLIENT_SECRET);
$client->setScopes('https://www.googleapis.com/auth/youtube');
$redirect = "ユーザーログイン後に取得した動画を表示させたいURL";
$client->setRedirectUri($redirect);
$youtube = new Google_Service_YouTube($client);
// Check if an auth token exists for the required scopes
$tokenSessionKey = 'token-' . $client->prepareScopes();
if (isset($_GET['code'])) {
if(strval($_SESSION['state']) !== strval($_GET['state'])) {
echo "<p>セッションが一致しません。</p>";
return;
}
$client->authenticate($_GET['code']);
$_SESSION[$tokenSessionKey] = $client->getAccessToken();
header('Location: ' . $redirect);
}
if (isset($_SESSION[$tokenSessionKey])) {
$client->setAccessToken($_SESSION[$tokenSessionKey]);
}
// Check to ensure that the access token was successfully acquired.
if ($client->getAccessToken()) {
try {
$condition = array(
'forMine' => true,
'type' => 'video',
'maxResults'=> 50
);
$html = "";
do{
$searchResponse = $youtube->search->listSearch('id,snippet', $condition);
if($searchResponse->pageInfo->totalResults === 0){
noresults($client);
continue;
}
foreach ($searchResponse['items'] as $searchResult) {
$snippet = $searchResult['snippet'];
$video_id = $searchResult["id"]["videoId"];
$thum = $snippet["thumbnails"]["high"]["url"];
$url = "https://www.youtube.com/watch?v={$video_id}";
$html .= "<a href='{$url}'>
<img class='thum' src='{$thum}' width='480' height='360'>
<p>{$snippet["title"]}</p>
</a>";
}
$condition["pageToken"] = $searchResponse["nextPageToken"];
} while($searchResponse["nextPageToken"]);
//次のページがなくなるまで繰り返す
echo $html;
$_SESSION[$tokenSessionKey] = $client->getAccessToken();
} catch (Google_Service_Exception $e) {
echo "<p>サービスエラー発生<br>".htmlspecialchars($e->getMessage()) . "</p>";
return;
} catch (Google_Exception $e) {
echo "<p>クライアントエラー発生<br>".htmlspecialchars($e->getMessage()) . "</p>";
return;
}
} elseif ($OAUTH2_CLIENT_ID == 'REPLACE_ME') {
echo "<p>プログラムを実行する前にクライアントIDをセットしてください。</p>";
return;
} else {
//ユーザーが認証していない場合
$state = mt_rand();
$client->setState($state);
$_SESSION['state'] = $state;
$authUrl = $client->createAuthUrl();
echo "<p>下のボタンをクリックして、Googleアカウントでログインしてください。<br>アップロード済みの動画を取得します。</p><a href='{$authUrl}' class=''><img src='img/button-google.png' width='191' height='46'></a>";
}
セッションについて
WordPressなどに組み込む場合、ページテンプレートから上記のサンプルコードを呼び出す事があると思います。エラーになる場合は、呼び出し元のファイルの1行目でセッションを開始してみてください。
クライアントキーとクライアントシークレットをコピペ
$OAUTH2_CLIENT_IDと$OAUTH2_CLIENT_SECRETには、「下準備」で取得したクライアントキーとクライアントシークレットをコピペしてください。
リダイレクトURLをコピペ
$redirectには、「下準備」で登録した「承認済みのリダイレクト URI」で置き換えてください。
テスト画面
テスト画面にアクセスしてみます。
ログイン前なので、サンプルコード最下部にある、ログインするためのリンクが表示されています。クリックすると、別ウィンドウでGoogleのログイン画面が表示されます。
「下準備」にて、アプリの「公開ステータス」を「テスト」のまま運用している場合、テストユーザーとして登録済みのアカウントでログインしてください。
登録してないアカウントでログインするとエラーになります。
画面に従って進めていくと、このような画面になります。
「続行」をクリックします。
さらに次の画面で「許可」をクリックします。
動画が表示されました。
ログアウト
ログアウトしたい場合は以下のようにします。
//Reset OAuth access token
$client->revokeToken();
//Destroy entire session data.
session_destroy();
//redirect page to index.php
header('Location: ' . $redirect);