Picasa APIの使い方まとめ(サンプルコード付き)

Picasa APIの使い方まとめ(サンプルコード付き)

Googleが提供する写真共有サービスのPicasa。Google+と連動していることでも有名です。今回は、このPicasaのAPIを利用して、写真を指定したり検索したりして取得する方法を説明します。なお、このAPIは2010年以降、更新されてなく、一部パラメータが正常に動きません。

サンプルデモ

下記は、私のPicasa Album、「高知旅行」の中から、新着6枚を表示させたものです。サムネイルサイズとオリジナルサイズ、それぞれのサイズを指定して、画像URLを取得することができます。

  • アルバム「高知旅行」の写真
  • アルバム「高知旅行」の写真
  • アルバム「高知旅行」の写真
  • アルバム「高知旅行」の写真
  • アルバム「高知旅行」の写真
  • アルバム「高知旅行」の写真

エンドポイント

それでは早速、Picasaから写真を取得してみましょう。開発者登録や、APIキーなどは必要ありません。内容が膨大なので、ところどころを抜粋して、最低限の方法を説明しています。さらに詳しい内容を知りたい場合は、公式のドキュメントをご参考下さい。

ベース

下記がベースとなるエンドポイントです。これ以降に紹介するURLは、ベースの後に続けて下さいね。

GET https://picasaweb.google.com/data/feed/api

エンドポイント一覧

取得方法によって、URLを組み立てて下さい。

/user/{userID}
{userID}にユーザーIDを指定することで、そのユーザーの全てのアルバムの中から写真を取得する。
例: /user/114918692417332410369
/user/{userID}/albumid/{albumID}
{userID}にユーザーID、{albumID}にアルバムIDを指定することで、特定のアルバムに含まれる写真を取得する。
例: /user/114918692417332410369/albumid/6067907905774112945
/all
Picasa全体の中から、写真を新着順に取得することができる。
例: /all
/all?q={keyword}
{keyword}にキーワードを指定することで、Picasa全体から写真を検索することができる。
例: /all?q=snow
/featured
Googleがお勧め写真として紹介した写真の一覧を取得することができます。…が、2013年から更新がないみたいです…。
例: /featured

パラメータ

指定できる主なパラメータは下記の通りです。

alt
取得できるデータのフォーマットを指定する。デフォルトはxmlだが、jsonを指定すれば、JSONにできる。
bbox
キーワード検索をする時に、Bounding Box(南西端と北東端の位置座標の組み合わせ)を指定することで、その矩形領域内の位置情報が付いた写真のみに限定して取得することができます。指定する場合は、西(経度)、南(緯度)、東(経度)、北(緯度)の順番なので注意。精度はあまりよくないようで、指定しても、その外の写真が含まれたりしてしまいます…。
サンプル: bbox=139.562881,35.523449,139.918961,35.81749
l
キーワード検索をする時に、「地名」を指定することで、その地名で撮影された写真に限定することができる。とのことですが、2015年3月現在、どうも上手く作動してくれないみたいです。
サンプル: l=japan
max-results
取得件数を指定できる。最小値、最大値は不明…。
start-index
オフセット値を指定する。
prettyprint
trueを指定することで、取得するデータに、改行やインデントを付けてみやすくできる。プログラム作成中の確認に便利なパラメータ。
fields
取得できるデータのプロパティを指定することで、それだけに限定して取得することができる。通信量、負荷などを少しでも減らしたい場合に有効。
imgmax
オリジナル画像ファイルのサイズの最大値を下記から指定することができる。また、数値の後にcを付けると切り取り形式、uを付けるとアスペクト比を維持したリサイズとなる。
324864729410411012814415016020022028832040051257664072080091210241152128014401600
thumbsize
オリジナル画像ファイルのサイズの最大値を指定することができる。指定方法はimgmaxと同様。

取得できるJSON

この章では、リクエスト成功時に取得できるそれぞれのデータを紹介します。写真のデータは->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 ;
?>

このコードの動作を確認する

ダウンロード

この記事で説明してきた内容を踏まえて、写真を取得して、表示するためのプログラムを配布します。動作確認にご利用下さい。

ファイル一覧

SYNCER00311
get-photos.php Download

ファイル名をクリックすると内容を確認できます。「Download Zip」をクリックするとファイル一式をダウンロードできます。

Download Zip