Skip to content
2011/07/11 / Javelina

PHP(Zend)でYouTubeのAuthSub認証を試してみる

またしてもPHP×YouTubeのお話。以前にPHPでYouTubeの動画アップロード&削除を試してみるという記事で動画のアップロード&削除ができたのですが、そのときはClientLogin認証を使ったのでAuthSub認証も試してみることにしました。(もともとウェブアプリケーションではAuthSub認証が推奨されてる)

またまたリファレンスでお勉強してコードを書いてみました。割とリファレンスをそのままですがこんな感じになりました↓
 

<?php
session_start();
$lib = dirname(__FILE__) . "/ZendFramework/library/";//←適宜指定
set_include_path(get_include_path() . PATH_SEPARATOR . $lib);
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_YouTube');
Zend_Loader::loadClass('Zend_Gdata_AuthSub');
$userName = '**********';//ユーザー名(入れなくてもいい・・・?)
$myDeveloperKey = '******************************';//取得したデベロッパーキー

function getAuthSubRequestUrl($userName)
{
	$next = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
	$scope = 'http://gdata.youtube.com';
	$secure = false;
	$session = true;
	return Zend_Gdata_AuthSub::getAuthSubTokenUri($next, $scope, $secure, $session);
}

function getAuthSubHttpClient($developerKey)
{
	if (!isset($_SESSION['sessionToken']) && !isset($_GET['token']) ){
	return false;
	} else if (!isset($_SESSION['sessionToken']) && isset($_GET['token'])) {
	$_SESSION['sessionToken'] = Zend_Gdata_AuthSub::getAuthSubSessionToken($_GET['token']);
	}
	$httpClient = Zend_Gdata_AuthSub::getHttpClient($_SESSION['sessionToken']);
	$httpClient->setHeaders('X-GData-Key', "key=${developerKey}");
	$yt = new Zend_Gdata_YouTube($httpClient);
	return $yt;
}

if(!getAuthSubHttpClient($myDeveloperKey)){
header('Location: ' . getAuthSubRequestUrl());
exit;
}
?>

 
とりあえず認証部分はここまで。アクセス許可ページの表示をリンクではなくリダイレクトにしてみました。あとはPHPでYouTubeの動画アップロード&削除を試してみるで書いたアップロードや削除のファイルのClientLogin認証以外の部分をほとんどそのまま使えます。
アップロードの場合は続きはこのような感じ↓
 

<?php $pagesubmit = $_GET['pagesubmit'];?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<meta http-equiv="Content-Style-Type" content="text/css" /> 
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title>Youtube Upload</title>
<style type="text/css" media="screen">
html{
width:100%;
height:100%;
margin:0;
padding:0;
}
body{
width:90%;
height:auto;
margin:0 auto;
padding:20px 0;
}
p{
font-size:13px;
color:#333;
}
</style>
<?php if($pagesubmit == '1'){?>
<script type="text/javascript">
function loading(){
	document.getElementById('loading').style.display = 'block';
}
function loading_hidden(){
	document.getElementById('loading').style.display = 'none';
}
window.onload = loading_hidden;
</script>
<?php }?>
</head>
<body>
<?php
$site_url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
?>
<h1>Youtube Upload</h1>
<div>
<?php if(empty($pagesubmit)){?>
<form action="<?php echo $site_url;?>?pagesubmit=1" method="post">

<p>■動画タイトル:<br />
<input type="text" name="movie_title" value="" size="50" />
</p>

<p>カテゴリー:<br />
<select name="movie_category">
<option value="Film">映画とアニメ</option>
<option value="Autos">自動車と乗り物</option>
<option value="Music">音楽</option>
<option value="Animals">ペットと動物</option>
<option value="Sports">スポーツ</option>
<option value="Travel">旅行とイベント</option>
<option value="Games">ゲーム</option>
<option value="Comedy">コメディー</option>
<option value="People">ブログと人</option>
<option value="News">ニュースと政治</option>
<option value="Entertainment">エンターテイメント</option>
<option value="Education">教育</option>
<option value="Howto">ハウツーとスタイル</option>
<option value="Nonprofit">非営利団体と社会活動</option>
<option value="Tech">科学と技術</option>
</select>
</p>

<p>■タグ:<br />
<input type="text" name="movie_tags" size="30" /><small>※複数の場合はカンマ区切り</small>
</p>

<p>■動画説明文:<textarea name="movie_description" cols="1" rows="1" style="width:98%; height:100px; margin-top:5px;"></textarea></p>
<input value="次へ" type="submit" />

</form>
<?php }?>
<?php if($pagesubmit == '1'){?>
<?php 
$movie_title = $_POST['movie_title'];
$movie_category = $_POST['movie_category'];
$movie_tags = $_POST['movie_tags'];
$movie_description = $_POST['movie_description'];

if(empty($movie_title)){
	$movie_title = 'upload at ' . date(Y.m.j);
}

$quotation_array = array('"'=> '', "'" => '');
$movie_title =strtr($movie_title,$quotation_array);
$movie_description =strtr($movie_description,$quotation_array);

$loadingimage = 'images/loading.gif';//ローディング用画像などのパス

$yt = getAuthSubHttpClient($mydeveloperKey);
$myVideoEntry = new Zend_Gdata_YouTube_VideoEntry();

$mediaGroup = $yt->newMediaGroup();
$mediaGroup->title = $yt->newMediaTitle()->setText("{$movie_title}");
$mediaGroup->description = $yt->newMediaDescription()->setText("{$movie_description}");

$categoryScheme = 'http://gdata.youtube.com/schemas/2007/categories.cat';
$developerTagScheme = 'http://gdata.youtube.com/schemas/2007/developertags.cat';

$mediaGroup->category = array(
$yt->newMediaCategory()->setText("{$movie_category}")->setScheme($categoryScheme),
$yt->newMediaCategory()->setText('mydevelopertag')->setScheme($developerTagScheme),
$yt->newMediaCategory()->setText('anotherdevelopertag')->setScheme($developerTagScheme)
);

$mediaGroup->keywords = $yt->newMediaKeywords()->setText("{$movie_tags}");
$myVideoEntry->mediaGroup = $mediaGroup;
$tokenHandlerUrl = 'http://gdata.youtube.com/action/GetUploadToken';
$tokenArray = $yt->getFormUploadToken($myVideoEntry, $tokenHandlerUrl);
$tokenValue = $tokenArray['token'];
$postUrl = $tokenArray['url'];
?>
<div>
<form action="<?php echo $postUrl;?>?nexturl=<?php echo $site_url;?>?pagesubmit=2" method="post" enctype="multipart/form-data">
<p>■アップロードする動画ファイルを選択:</p>
<p>
<input name="file" type="file" />
<input value="アップロード" type="submit" onClick="return loading()" />
</p>
<input name="token" type="hidden" value="<?php echo $tokenValue;?>"/>
</form>
</div>

<div id="loading" style="display:none; width:100%; text-align:center; color:#666; margin:0; padding:30px 0 0 0;">
<img src="<?php echo $loadingimage;?>" border="0" alt="" style="width:48px; height:48px; margin:0 auto;" /><br />&nbsp;<br />
<strong>Youtubeにアップロード中</strong><br />&nbsp;<br />
※この処理には時間がかかります。少々お待ち下さい。
</div>
<?php }?>
<?php if($pagesubmit == '2'){?>
<?php
$movie_id = $_GET['id'];
$movie_url = 'http://www.youtube.com/watch?v=' . $movie_id;
?>
<h2>動画のアップロードが完了しました。</h2>
<p>ID : <?php echo $movie_id;?></p>
<p>URL : <?php echo $movie_url;?></p>
<p><a href="<?php echo $movie_url;?>" target="_blank">≫動画を確認</a><p>
<p style="padding-top:20px;"><a href="<?php echo $site_url;?>">≪戻る</a><p>
<?php }?>
</div>
</body>
</html>

 
試してみたところちゃんと動きました!
こっちのがセキュアだし以前作った一覧表示プラグインもAuthSub認証にした方がいいかな・・・?と思ったんですが、考えてみるとAuthSub認証にしてしまうと結局YouTubeにログインすることになってしまうので、鑑賞用と投稿用でアカウント分けてる場合は結局面倒くさいことになりそう。という訳で見送り~
 

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。