webapiを利用するマッシュアップがとても楽しそうだったので
youtubeAPIをphpで利用して最新の動画を取得にチャレンジしてみました。
アウトプットとしてできたのがやなちゃん関連動画をひっぱってくるAPI。
http://www.pcefan.com/test/youtube2.php
結果として、自前ではxmlを取得する所までできたけど
xmlを変数に格納して、抽出する所でギブアップ!!!
結局ネットに転がっていたphpを参考(ほとんど流用して)にして
作成しました。
http://blog.iroiro-web.com/webapi/2008/11/05/youtube-%E5%8B%95%E7%94%BB%E6%A4%9C%E7%B4%A2-api-%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB/
もう、youtubeのxmlの仕様がやたらと面倒くさいです。
他のASPのように
$xml->title->data
のように簡単に取得できるように構造化もされていなかったので
抽出を解決するのに3時間かかりました。
結論として
上記のサイトのPHPを利用させてもらって、後は自分サイト用にカスタマイズすれば
必要な情報は取り出せそうです。
また、webapi的にはyoutubeは、難易度が高かったようです(笑)
次はシンプルなリクルート系の情報とかリンクシェアとかでチャレンジしようと思います。
require_once("apiconfig.php");
require_once("apifunc.php");
$request_url = 'http://gdata.youtube.com/feeds/api/videos';
$keyword = "柳原陽一郎";
$keyword4url = urlencode($keyword);
$q = '?vq='.$keyword4url.'&orderby;=published';
$xml_result = file_get_contents($request_url.$q);
$xml_result = str_replace('openSearch:', 'openSearch', $xml_result);
$xml_result = str_replace('media:', 'media', $xml_result);
$xml_result = str_replace('yt:', 'yt', $xml_result);
$xml_result = str_replace('gd:', 'gd', $xml_result);
$xml = simplexml_load_string($xml_result);
$res['totalResults'] = $xml-openSearchtotalResults;
$res['startIndex'] = $xml->openSearchstartIndex;
$res['itemsPerPage'] = $xml->openSearchitemsPerPage;
$first = $res['startIndex'];
$last = $first + $res['itemsPerPage'] - 1;
$itemnumber = $res['itemsPerPage'];
if($last > $res['totalResults']) {
$last = $res['totalResults'];
$itemnumber = $last - $first + 1;
}
for($i=0; $i<$itemnumber; $i++) {
foreach($xml->entry[$i] as $key=>$value) {
switch($key) {
case 'id':
$item[$i]['id'] = $value;
break;
case 'published':
$item[$i]['published'] = $value;
break;
case 'updated':
$item[$i]['updated'] = $value;
break;
case 'title':
$item[$i]['title'] = $value;
break;
case 'content':
$value = htmlspecialchars($value);
$item[$i]['content'] = $value;
break;
case 'author':
$item[$i]['authorname'] = $value->name;
$item[$i]['authoruri'] = $value->uri;
break;
case 'mediagroup':
$item[$i]['keywords'] = $value->mediakeywords;
$item[$i]['thumbnail'] = $value->mediathumbnail->attributes()->url;
$item[$i]['player'] = $value->mediaplayer->attributes()->url;
$item[$i]['duration'] = $value->ytduration->attributes()->seconds;
break;
case 'ytstatistics':
$item[$i]['viewCount'] = $value->attributes()->viewCount;
$item[$i]['favoriteCount'] = $value->attributes()->favoriteCount;
break;
case 'gdrating':
$item[$i]['ratingmin'] = $value->attributes()->min;
$item[$i]['ratingmax'] = $value->attributes()->max;
$item[$i]['ratingnumRaters'] = $value->attributes()->numRaters;
$item[$i]['ratingaverage'] = $value->attributes()->average;
break;
default:
// if(stristr($key,'url')) echo "$key: $value
\n";
// else echo "$key: $value
";
break;
}
}
}
echo "
{$res['totalResults']}件マッチしました。$first ~ $last 件目
\n";echo "
- ";
- \n";
echo "{$item[$i]['title']}
\n";
echo "
\n";
echo "〔キーワード〕 {$item[$i]['keywords']}
\n";
echo "〔投稿者〕 {$item[$i]['authorname']}さん
\n";
echo "〔再生時間〕 {$item[$i]['duration']}秒 \n";
echo "〔閲覧回数〕 {$item[$i]['viewCount']}回 \n";
echo "〔お気に入り〕 {$item[$i]['favoriteCount']}件
\n";
echo "〔評価〕 {$item[$i]['ratingaverage']} \n";
echo "(評価人数: {$item[$i]['ratingnumRaters']}人)
\n";
echo "〔発行日時〕 {$item[$i]['published']} \n";
echo "〔更新日時〕 {$item[$i]['updated']}\n";
echo "
\n";
echo "
{$item[$i]['content']}
\n";
echo "
\n";
}
echo "
for($i=0; $i<$itemnumber; $i++) {
echo "
echo "
\n";
?>