サンプルデモ
下記は、私のPicasa Album、「高知旅行」の中から、新着6枚を表示させたものです。サムネイルサイズとオリジナルサイズ、それぞれのサイズを指定して、画像URLを取得することができます。
Googleが提供する写真共有サービスのPicasa。Google+と連動していることでも有名です。今回は、このPicasaのAPIを利用して、写真を指定したり検索したりして取得する方法を説明します。なお、このAPIは2010年以降、更新されてなく、一部パラメータが正常に動きません。
下記は、私のPicasa Album、「高知旅行」の中から、新着6枚を表示させたものです。サムネイルサイズとオリジナルサイズ、それぞれのサイズを指定して、画像URLを取得することができます。
それでは早速、Picasaから写真を取得してみましょう。開発者登録や、APIキーなどは必要ありません。内容が膨大なので、ところどころを抜粋して、最低限の方法を説明しています。さらに詳しい内容を知りたい場合は、公式のドキュメントをご参考下さい。
下記がベースとなるエンドポイントです。これ以降に紹介するURLは、ベースの後に続けて下さいね。
GET https://picasaweb.google.com/data/feed/api
取得方法によって、URLを組み立てて下さい。
{userID}
にユーザーIDを指定することで、そのユーザーの全てのアルバムの中から写真を取得する。{userID}
にユーザーID、{albumID}
にアルバムIDを指定することで、特定のアルバムに含まれる写真を取得する。{keyword}
にキーワードを指定することで、Picasa全体から写真を検索することができる。指定できる主なパラメータは下記の通りです。
xml
だが、json
を指定すれば、JSONにできる。true
を指定することで、取得するデータに、改行やインデントを付けてみやすくできる。プログラム作成中の確認に便利なパラメータ。c
を付けると切り取り形式、u
を付けるとアスペクト比を維持したリサイズとなる。32
、48
、64
、72
、94
、104
、110
、128
、144
、150
、160
、200
、220
、288
、320
、400
、512
、576
、640
、720
、800
、912
、1024
、1152
、1280
、1440
、1600
imgmax
と同様。この章では、リクエスト成功時に取得できるそれぞれのデータを紹介します。写真のデータは->feed->entry
の中に配列形式で含まれています。オリジナル画像はentry->{'media$group'}->{'media$content'}
、サムネイル画像はentry->{'media$group'}->{'media$thumbnail'}
の中に、その情報が含まれています。
JSON
{"version":"1.0","encoding":"UTF-8","feed":{"xmlns":"http://www.w3.org/2005/Atom","xmlns$openSearch":"http://a9.com/-/spec/opensearchrss/1.0/","xmlns$gphoto":"http://schemas.google.com/photos/2007","xmlns$exif":"http://schemas.google.com/photos/exif/2007","xmlns$media":"http://search.yahoo.com/mrss/","xmlns$georss":"http://www.georss.org/georss","xmlns$gml":"http://www.opengis.net/gml","id":{"$t":"https://picasaweb.google.com/data/feed/api/user/114918692417332410369/albumid/6067907905774112945"},"updated":{"$t":"2015-03-03T09:11:54.456Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/photos/2007#album"}],"title":{"$t":"高知県旅行","type":"text"},"subtitle":{"$t":"","type":"text"},"rights":{"$t":"public","type":"text"},"icon":{"$t":"https://lh3.googleusercontent.com/-JmN3Sh0VYj8/VDWKF1VzULE/AAAAAAAAFiQ/FZP-S_H2frs/s160-c/KOXssI.jpg"},"link":[{"rel":"http://schemas.google.com/g/2005#feed","type":"application/atom+xml","href":"https://picasaweb.google.com/data/feed/api/user/114918692417332410369/albumid/6067907905774112945?alt=json"},{"rel":"alternate","type":"text/html","href":"https://picasaweb.google.com/114918692417332410369/KOXssI"},{"rel":"http://schemas.google.com/photos/2007#slideshow","type":"application/x-shockwave-flash","href":"https://photos.gstatic.com/media/slideshow.swf?host=picasaweb.google.com&RGB=0x000000&feed=https://picasaweb.google.com/data/feed/api/user/114918692417332410369/albumid/6067907905774112945?alt%3Drss"},{"rel":"http://schemas.google.com/photos/2007#report","type":"text/html","href":"https://picasaweb.google.com/lh/reportAbuse?uname=114918692417332410369&aid=6067907905774112945"},{"rel":"self","type":"application/atom+xml","href":"https://picasaweb.google.com/data/feed/api/user/114918692417332410369/albumid/6067907905774112945?alt=json&start-index=1&max-results=2&kind=photo&imgmax=600c&thumbsize=160"},{"rel":"next","type":"application/atom+xml","href":"https://picasaweb.google.com/data/feed/api/user/114918692417332410369/albumid/6067907905774112945?alt=json&start-index=3&max-results=2&kind=photo&imgmax=600c&thumbsize=160"}],"author":[{"name":{"$t":"Yuta Arai"},"uri":{"$t":"https://picasaweb.google.com/114918692417332410369"}}],"generator":{"$t":"Picasaweb","version":"1.00","uri":"http://picasaweb.google.com/"},"openSearch$totalResults":{"$t":20},"openSearch$startIndex":{"$t":1},"openSearch$itemsPerPage":{"$t":2},"gphoto$id":{"$t":"6067907905774112945"},"gphoto$name":{"$t":"KOXssI"},"gphoto$location":{"$t":""},"gphoto$access":{"$t":"public"},"gphoto$timestamp":{"$t":"1412794903000"},"gphoto$numphotos":{"$t":20},"gphoto$user":{"$t":"114918692417332410369"},"gphoto$nickname":{"$t":"Yuta Arai"},"gphoto$allowPrints":{"$t":"true"},"gphoto$allowDownloads":{"$t":"true"},"entry":[{"id":{"$t":"https://picasaweb.google.com/data/entry/api/user/114918692417332410369/albumid/6067907905774112945/photoid/6067908500331755362?alt=json"},"published":{"$t":"2014-10-08T19:04:01.000Z"},"updated":{"$t":"2014-10-08T19:06:34.011Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/photos/2007#photo"}],"title":{"$t":"IMG_5276.JPG","type":"text"},"summary":{"$t":"はりまや橋","type":"text"},"content":{"type":"image/jpeg","src":"https://lh3.googleusercontent.com/-dtOEIUHh590/VDWKocPY92I/AAAAAAAAFck/FFYLDN6n2zo/s600-c/IMG_5276.JPG"},"link":[{"rel":"http://schemas.google.com/g/2005#feed","type":"application/atom+xml","href":"https://picasaweb.google.com/data/feed/api/user/114918692417332410369/albumid/6067907905774112945/photoid/6067908500331755362?alt=json"},{"rel":"alternate","type":"text/html","href":"https://picasaweb.google.com/114918692417332410369/KOXssI#6067908500331755362"},{"rel":"http://schemas.google.com/photos/2007#canonical","type":"text/html","href":"https://picasaweb.google.com/lh/photo/-gHJXf24kuObD2XZvlzUGNMTjNZETYmyPJy0liipFm0"},{"rel":"self","type":"application/atom+xml","href":"https://picasaweb.google.com/data/entry/api/user/114918692417332410369/albumid/6067907905774112945/photoid/6067908500331755362?alt=json"},{"rel":"http://schemas.google.com/photos/2007#report","type":"text/html","href":"https://picasaweb.google.com/lh/reportAbuse?uname=114918692417332410369&aid=6067907905774112945&iid=6067908500331755362"}],"gphoto$id":{"$t":"6067908500331755362"},"gphoto$version":{"$t":"4"},"gphoto$position":{"$t":42.0},"gphoto$albumid":{"$t":"6067907905774112945"},"gphoto$access":{"$t":"public"},"gphoto$width":{"$t":"2048"},"gphoto$height":{"$t":"1536"},"gphoto$size":{"$t":"975406"},"gphoto$client":{"$t":"es-pc-add-photos"},"gphoto$checksum":{"$t":""},"gphoto$timestamp":{"$t":"1409269094000"},"gphoto$imageVersion":{"$t":"5577"},"gphoto$commentingEnabled":{"$t":"true"},"gphoto$commentCount":{"$t":0},"gphoto$streamId":[{"$t":"shared_group_6067908500331755362"}],"gphoto$license":{"$t":"ALL_RIGHTS_RESERVED","id":0,"name":"著作権をすべて留保する","url":""},"gphoto$shapes":{"faces":"done"},"exif$tags":{"exif$fstop":{"$t":"2.4"},"exif$make":{"$t":"Apple"},"exif$model":{"$t":"iPhone 5"},"exif$exposure":{"$t":"0.0067114094"},"exif$flash":{"$t":"false"},"exif$focallength":{"$t":"4.12"},"exif$iso":{"$t":"50"},"exif$time":{"$t":"1409301494000"},"exif$imageUniqueID":{"$t":"cfb4828a08f09bcb0000000000000000"}},"media$group":{"media$content":[{"url":"https://lh3.googleusercontent.com/-dtOEIUHh590/VDWKocPY92I/AAAAAAAAFck/FFYLDN6n2zo/s600-c/IMG_5276.JPG","height":600,"width":600,"type":"image/jpeg","medium":"image"}],"media$credit":[{"$t":"Yuta Arai"}],"media$description":{"$t":"はりまや橋","type":"plain"},"media$keywords":{},"media$thumbnail":[{"url":"https://lh3.googleusercontent.com/-dtOEIUHh590/VDWKocPY92I/AAAAAAAAFck/FFYLDN6n2zo/s160-c/IMG_5276.JPG","height":160,"width":160}],"media$title":{"$t":"IMG_5276.JPG","type":"plain"}},"georss$where":{"gml$Point":{"gml$pos":{"$t":"33.5600083 133.5426944"}}}},{"id":{"$t":"https://picasaweb.google.com/data/entry/api/user/114918692417332410369/albumid/6067907905774112945/photoid/6067908530824189058?alt=json"},"published":{"$t":"2014-10-08T19:04:08.000Z"},"updated":{"$t":"2015-03-03T09:11:54.456Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/photos/2007#photo"}],"title":{"$t":"IMG_5279.JPG","type":"text"},"summary":{"$t":"はりまや橋のそばにあったアンパンマンの石像。","type":"text"},"content":{"type":"image/jpeg","src":"https://lh4.googleusercontent.com/-GaFllA770qk/VDWKqN1WlII/AAAAAAAAFcw/3wO_iZJoAWA/s600-c/IMG_5279.JPG"},"link":[{"rel":"http://schemas.google.com/g/2005#feed","type":"application/atom+xml","href":"https://picasaweb.google.com/data/feed/api/user/114918692417332410369/albumid/6067907905774112945/photoid/6067908530824189058?alt=json"},{"rel":"alternate","type":"text/html","href":"https://picasaweb.google.com/114918692417332410369/KOXssI#6067908530824189058"},{"rel":"http://schemas.google.com/photos/2007#canonical","type":"text/html","href":"https://picasaweb.google.com/lh/photo/_rUUxcQed6D_bVk9MqbEeNMTjNZETYmyPJy0liipFm0"},{"rel":"self","type":"application/atom+xml","href":"https://picasaweb.google.com/data/entry/api/user/114918692417332410369/albumid/6067907905774112945/photoid/6067908530824189058?alt=json"},{"rel":"http://schemas.google.com/photos/2007#report","type":"text/html","href":"https://picasaweb.google.com/lh/reportAbuse?uname=114918692417332410369&aid=6067907905774112945&iid=6067908530824189058"}],"gphoto$id":{"$t":"6067908530824189058"},"gphoto$version":{"$t":"4"},"gphoto$position":{"$t":43.0},"gphoto$albumid":{"$t":"6067907905774112945"},"gphoto$access":{"$t":"public"},"gphoto$width":{"$t":"2048"},"gphoto$height":{"$t":"1536"},"gphoto$size":{"$t":"965607"},"gphoto$client":{"$t":"es-pc-add-photos"},"gphoto$checksum":{"$t":""},"gphoto$timestamp":{"$t":"1409269139000"},"gphoto$imageVersion":{"$t":"5580"},"gphoto$commentingEnabled":{"$t":"true"},"gphoto$commentCount":{"$t":0},"gphoto$streamId":[{"$t":"shared_group_6067908530824189058"}],"gphoto$license":{"$t":"ALL_RIGHTS_RESERVED","id":0,"name":"著作権をすべて留保する","url":""},"gphoto$shapes":{"faces":"done"},"exif$tags":{"exif$fstop":{"$t":"2.4"},"exif$make":{"$t":"Apple"},"exif$model":{"$t":"iPhone 5"},"exif$exposure":{"$t":"0.0024937657"},"exif$flash":{"$t":"false"},"exif$focallength":{"$t":"4.12"},"exif$iso":{"$t":"50"},"exif$time":{"$t":"1409301539000"},"exif$imageUniqueID":{"$t":"08fce77c8f6cb25d0000000000000000"}},"media$group":{"media$content":[{"url":"https://lh4.googleusercontent.com/-GaFllA770qk/VDWKqN1WlII/AAAAAAAAFcw/3wO_iZJoAWA/s600-c/IMG_5279.JPG","height":600,"width":600,"type":"image/jpeg","medium":"image"}],"media$credit":[{"$t":"Yuta Arai"}],"media$description":{"$t":"はりまや橋のそばにあったアンパンマンの石像。","type":"plain"},"media$keywords":{},"media$thumbnail":[{"url":"https://lh4.googleusercontent.com/-GaFllA770qk/VDWKqN1WlII/AAAAAAAAFcw/3wO_iZJoAWA/s160-c/IMG_5279.JPG","height":160,"width":160}],"media$title":{"$t":"IMG_5279.JPG","type":"plain"}},"georss$where":{"gml$Point":{"gml$pos":{"$t":"33.5598249 133.5428611"}}}}]}}
これまでを踏まえて、コードを実装してみましょう。取得できるデータは膨大ですが、しなければいけないことは多くありません。例えば、データを取得し、シンプルに写真だけを表示させるまでの処理は、下記の通りとなります。プロパティ名に特殊な文字($)が含まれる点にご注意下さい。
PHP
<?php
// リクエストURL
$request_url = 'https://picasaweb.google.com/data/feed/api/user/114918692417332410369?alt=json' ;
// [$xml]にデータを取得する
$curl = curl_init() ;
curl_setopt( $curl , CURLOPT_URL , $request_url ) ;
curl_setopt( $curl , CURLOPT_HEADER, 1 ) ;
curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ; // 証明書の検証を行わない
curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ; // curl_execの結果を文字列で返す
curl_setopt( $curl , CURLOPT_TIMEOUT , 5 ) ; // タイムアウトの秒数
$res1 = curl_exec( $curl ) ;
$res2 = curl_getinfo( $curl ) ;
curl_close( $curl ) ;
// 取得したデータ
$json = substr( $res1, $res2['header_size'] ) ; // 取得したデータ(JSONなど)
$header = substr( $res1, 0, $res2['header_size'] ) ; // レスポンスヘッダー (検証に利用したい場合にどうぞ)
// JSONをオブジェクトに変換する
$obj = json_decode( $json ) ;
// HTML用
$html = '' ;
// HTMLを作成
$html .= '<h2>実行結果</h2>' ;
$html .= '<p>下記の通り、写真を取得しました。</p>' ;
// 結果をリスト形式で出力
$html .= '<ul style="overflow:hidden; margin:2em 0 0; padding:0; list-style-type:none;">' ;
// HTMLを形成
foreach( $obj->feed->entry as $val )
{
// 各データ
$org = $val->{ 'media$group' }->{ 'media$content' }[0]->url ; // オリジナル画像
$thumb = $val->{ 'media$group' }->{ 'media$thumbnail' }[0]->url ; // サムネイル画像
// [LI]を形成
$html .= '<li style="float:left; margin:1px; padding:0;">' ;
$html .= '<a href="' . $org . '" target="_blank">' ;
$html .= '<img src="' . $thumb . '" alt="写真" style="max-width:100%; height:auto; border:0; vertical-align:bottom;">' ;
$html .= '</a>' ;
$html .= '</li>' ;
}
$html .= '</ul>' ;
// 取得したデータ
$html .= '<h2>取得したデータ</h2>' ;
$html .= '<p>下記のデータを取得できました。</p>' ;
$html .= '<h3>JSONに変換後</h3>' ;
$html .= '<p><textarea rows="8">' . $json . '</textarea></p>' ;
$html .= '<h3>レスポンスヘッダー</h3>' ;
$html .= '<p><textarea rows="8">' . $header . '</textarea></p>' ;
?>
<?php
// ブラウザに[$html]を出力 (HTMLのヘッダーとフッターを付けましょう)
echo $html ;
?>
この記事で説明してきた内容を踏まえて、写真を取得して、表示するためのプログラムを配布します。動作確認にご利用下さい。
ファイル一覧
ファイル名をクリックすると内容を確認できます。「Download Zip」をクリックするとファイル一式をダウンロードできます。