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

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

写真投稿コミュニティの先駆者的存在のflickr。写真の数は競合サイトの中でもダントツでしょう。そんなflickrの写真を利用してwebサービスを作成するための、APIの使い方をまとめました。

準備(APIキーの取得)

flickrのAPIを利用するためには、アプリケーションを作成する必要があります。この章では、flickr Developer Centerでアプリケーションを作成し、アプリケーションキーを取得する方法を説明します。

アカウントを取得する

flickrのアカウントを取得する
flickrのアカウントを取得する

flickrのAPIを利用するためには、flickrのユーザーアカウントを所有している必要があります。flickrのユーザーアカウントをまだ持っていない人は参加登録をして下さい。

アプリケーションを登録

flickrの開発者向けページ
flickrの開発者向けページ

ユーザーアカウントが用意できたら、flickr Developer Centerにアクセスして下さい。

「API」をクリックする
「API」をクリックする

flickr Developer Centerにアクセス後、左上にあるメニューの中から「API」というリンクをクリックして下さい。

「Request an API key」をクリックする
「Request an API key」をクリックする

APIのページに移動します。上部にあるチュートリアルの一番左にある1番の「Request an API key」をクリックして下さい。

「Get your API key」をクリックする
「Get your API key」をクリックする

The App Gardenのページに移動します。右上にある「Get your API key」をクリックして下さい。

「APPLY FOR A NON-COMMERCIAL KEY」をクリックする
「APPLY FOR A NON-COMMERCIAL KEY」をクリックする

次に、アプリケーションは商用利用か非商用利用かを選択します。私の場合は非商用利用なので、左側の「APPLY FOR A NON-COMMERCIAL KEY」を選択しました。クリックして下さい。

アプリケーション情報の入力

アプリケーションの情報を入力する
アプリケーションの情報を入力する

アプリケーションの情報を入力するフォームに移動します。ここでは「アプリケーション名」と「アプリケーションの説明文」を入力し、下2つの利用規約に同意した上で、「SUBMIT」ボタンをクリックして下さい。

アプリケーションキーの確認

アプリケーションキーを確認する
アプリケーションキーを確認する

入力内容に問題がなければ、アプリケーションを作成することができ、そのままアプリケーションの詳細画面に移動します。ここでは、アプリケーションキーとアプリケーションシークレットをそれぞれ確認することができます。お疲れ様でした。これらのキーは他人に知られないようにしておきましょう。

アプリケーションの管理

flickrはページデザインがごちゃごちゃで迷ってしまうため、アプリケーションの管理方法をメモがてら、シェアします。

管理画面へのアクセス方法

flickr The App Garden
flickr The App Garden

flickr Developer Centerは迷路のようにごちゃごちゃになっています。アプリケーションを編集する方法、キーを確認する方法、削除する方法などを把握しておいた方が、今後の開発がスムーズになるでしょう。アプリケーションを管理するには、下記リンクから、flickr The App Gardenにアクセスして下さい。

「Apps By You」
「Apps By You」

flickr The App Gardenにアクセス後、右上にある「Your Apps」の項目内の「Apps By You」をクリックして下さい。

アプリケーション名をクリックする
アプリケーション名をクリックする

アプリケーションの管理画面に移動します。ここには、あなたがこれまでに作成したアプリケーションの一覧が表示されています。先ほど作成したアプリケーションがここに加わっていることを確認しましょう。キーとシークレットも確認できますね。アプリケーションの編集をするには、名前をクリックして下さい。

アプリケーションの編集

アプリケーションを編集する
アプリケーションを編集する

アプリケーションの詳細画面に移動しました。ここでは、アプリケーションのアイコンを設定することができます。また、右メニューから、アプリケーション名や説明文を編集したり、キーを確認したり、アプリケーションを削除したり、といったことができます。アプリケーションのことで困ったら、とりあえずこの画面に来れるようにはしておきましょう。

コールバックURLを設定する

ユーザー認証をして、そのユーザーのプライベートなデータを取得するには、Oauth1.0認証が必要です。その作業に必要な、コールバックURLを登録するために、右メニューの「Edit」をクリックして、アプリケーションの編集画面に移動して下さい。プライベートなデータを扱う予定がない場合は、この作業は必要ありません。必要になったら行ないましょう。この記事でも取り上げません。

コールバックURLを登録する
コールバックURLを登録する

「Callback URL」の項目に、認証作業を行なうURLを入力して、下にある「SAVE CHANGES」のボタンをクリックし、設定を保存して下さい。

ライブラリの入手

flickr APIリファレンス
flickr APIリファレンス

Flickr APIのリファレンスが膨大過ぎて読むのが面倒なため、公式に紹介されているライブラリを利用することにしました。この記事ではPHPをサンプル言語にしていますが、その他の言語用のライブラリも豊富に揃っています。下記リンクに、ライブラリの一覧があるので、自分に合ったものをダウンロードしましょう。

今回、この記事で利用するのは「phpFlickr」というライブラリです。2015年3月現在、このライブラリは更新が行なわれてなく、ISSUEを覗いてみると、どうやらアクセストークンの取得に対応できていないみたいです。実際に私も試してみましたが、ダメでした。ですが、パブリックな写真を検索することには対応しています。下記、GitHub内のページからダウンロードすることができます。

ダウンロードしたphpflickr-master.zipを解凍すると、いくつかのファイルが存在します。その中で利用するのは、phpFlickr.phpのみです。

phpflickr-master.zip

  • phpflickr-master
    • phpFlickr.php

プログラミング

ここまでで準備が整ったら、いよいよ、Flickr APIを利用し、様々な条件を指定して写真を取得してみましょう。

ライブラリの読み込み

ライブラリを利用するため、先ほどダウンロードしたファイルを読み込みます。

PHP

<?php

	//ライブラリを読み込む
	require_once './phpFlickr.php' ;

インスタンスを作成する

続いて、インスタンスを作成します。次の通り、アプリケーションを作成する際に取得した「Consumer Key(アプリケーションキー)」と「Consumer Secret(アプリケーションシークレット)」を指定して下さい。作成したインスタンスは$flickrという変数に代入していますが、もしこの変数名が他の変数と重複してしまう場合は、違う名前に変えて下さい。

PHP

	// Consumer Key
	$app_key = '' ;

	// Consumer Secret
	$app_secret = '' ;

	// インスタンスを作成する
	$flickr = new phpFlickr( $app_key , $app_secret ) ;

パラメータをセットする

どんな条件で写真を検索したいのか、パラメータを設定します。ここでは、下記内容をコピーするだけで大丈夫です。どのようなパラメータをセットできるのかは、後述します。

PHP

	// 取得件数の指定
	$count = 2 ;

	//オプションの設定
	$option = array(
		'text' => '足立区' ,		// 検索ワードの指定
		'per_page' => 2 ,			// 取得件数
		'extras' => 'url_q' , 		// 画像サイズ
		'safe_search' => 1 ,		// セーフサーチ
	) ;

リクエストを実行する

準備ができたら、リクエストを送ってデータを取得してみましょう。写真を検索し、その条件に合うデータを取得するには、第1引数にオプションとなる配列を設定して、photos_search()というメソッドを利用します。下記に例を示したので、好きなキーワードを指定して、とりあえず実行してみて下さい。画面にJSON形式のデータが表示されれば成功です。

PHP

	// 検索を実行し、取得したデータを[$result]に代入する
	$result = $flickr->photos_search( $option ) ;

	// [$result]をJSONに変換する
	$json = json_encode( $result );

	// 画面に取得したデータを出力する
	echo $json ;

サンプルプログラム

取得したデータを利用して、単純に画像だけを表示してみましょう。次のように、photoプロパティをループ処理にかけます。JSONの内容については、後述します。

PHP

<?php

	//ライブラリを読み込む
	require_once './phpFlickr.php' ;

	// Consumer Key
	$app_key = '' ;

	// Consumer Secret
	$app_secret = '' ;

	// インスタンスを作成する
	$flickr = new phpFlickr( $app_key , $app_secret ) ;

	//オプションの設定
	$option = array(
		'text' => '富士サファリパーク' ,		// 検索ワードの指定
		'per_page' => 50 ,			// 取得件数
		'extras' => 'url_q,url_c' , 		// 画像サイズ
		'safe_search' => 1 ,		// セーフサーチ
	) ;

	// GETメソッドで指定がある場合
	foreach( array( 'text' , 'per_page' , 'woe_id' , 'license' , 'sort' , 'bbox' ) as $val )
	{
		if( isset( $_GET[ $val ] ) && $_GET[ $val ] != '' )
		{
			$option[ $val ] = $_GET[ $val ] ;
		}
	}

	// 検索を実行し、取得したデータを[$result]に代入する
	$result = $flickr->photos_search( $option ) ;

	// [$result]をJSONに変換する
	$json = json_encode( $result );

	// JSONをオブジェクト型に変換する
	$obj = json_decode( $json ) ;

	// HTML用
	$html = '' ;

	// 写真検索を実行する
	$html .= '<h2>条件を指定する</h2>' ;
	$html .= '<p>条件を指定して、写真を検索してみて下さい。</p>' ;
	$html .= '<form>' ;
	$html .= 	'<p style="font-size:.9em; font-weight:700;"><label for="text">検索キーワード (text)</label></p>' ;
	$html .= 		'<p style="margin:0 0 1em;"><input id="text" name="text" value="寺" placeholder="寺"></p>' ;
	$html .= 	'<p style="font-size:.9em; font-weight:700;"><label for="bbox">位置範囲 (bbox)</label></p>' ;
	$html .= 		'<p style="margin:0 0 1em;"><input id="bbox" name="bbox" list="bbox-data" placeholder=""></p>' ;
	$html .= 		'<datalist id="bbox-data">' ;
	$html .= 			'<option value="139.74136476171873,35.67800739824976,139.78565339697263,35.71146639304908">' ;
	$html .= 		'</datalist>' ;
	$html .= 	'<p><button>検索する</button></p>' ;
	$html .= '</form>' ;

	// 実行結果の表示
	$html .= '<h2>実行結果</h2>' ;
	$html .= '<p>リクエストの実行結果です。</p>' ;

	// リスト形式で表示する
	$html .= '<ul style="margin:2em 0 0; padding:0; overflow:hidden; list-style-type:none; text-align:center;">' ;

	// ループ処理
	foreach( $obj->photo as $photo )
	{
		// データが揃っていない場合はスキップ
		if( !isset($photo->url_q) || !isset($photo->width_q) || !isset($photo->height_q) )
		{
			continue ;
		}

		// データの整理
		$t_src = $photo->url_q ;		// サムネイルの画像ファイルのURL
		$t_width = $photo->width_q ;	// サムネイルの横幅
		$t_height = $photo->height_q ;	// サムネイルの縦幅
		$o_src = ( isset($photo->url_c) ) ? $photo->url_c : $photo->url_q ;		// 画像ファイルのURL

		// 出力する
		$html .= '<li style="float:left; margin:1px; padding:0; overflow:hidden; height:112.5px">' ;
		$html .= 	'<a href="' . $o_src . '" target="_blank">' ;
		$html .= 		'<img src="' . $t_src . '" width="' . $t_width . '" height="' . $t_height . '" style="max-width:100%; height:auto">' ;
		$html .= 	'</a>' ;
		$html .= '</li>' ;
	}

	$html .= '</ul>' ;

	// 取得したデータ
	$html .= '<h2>取得したデータ</h2>' ;
	$html .= '<p>下記のデータを取得できました。</p>' ;
	$html .= 	'<h3>JSONに変換後</h3>' ;
	$html .= 	'<p><textarea rows="8">' . $json . '</textarea></p>' ;

?>

<?php
	// ブラウザに[$html]を出力 (HTMLのヘッダーとフッターを付けましょう)
	echo $html ;
?>

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

パラメータ

キーワードだけではなく、様々なデータを指定して、写真を検索することができます。この章では、数ある中から有用なオプションを紹介します。全てを確認したい人は公式ドキュメント(英語)を確認して下さい。オプションは、検索を実行するメソッド(photos_search())の引数に渡す連想配列に指定して下さい。

user_id
ユーザーのNSIDを指定することで、そのユーザーの写真に絞って取得することができる。NSIDは、ownerプロパティの値。
tags
タグを指定すると、そのタグが付いた写真に絞って検索することができる。複数ある場合は、半角カンマ(,)で区切る。
tag_mode
タグを複数指定する場合に、AND検索か、OR検索かを指定する。anyはOR検索、allはAND検索で、デフォルトはany
text
キーワードで写真を検索したい時に指定する。
min_upload_date
日時を指定すると、その日時以降に投稿された写真のみを検索する。日時はUNIX TIMESTAMP、または、MySQLのdatetime(例: 2016-12-18 03:20:45)の形式で指定可。
max_upload_date
日時を指定すると、その日時より過去に投稿された写真のみを検索する。日時はUNIX TIMESTAMP、または、MySQLのdatetime(例: 2016-12-18 03:20:45)の形式で指定可。
min_taken_date
日時を指定すると、その日時以降に撮影された写真のみを検索する。日時はUNIX TIMESTAMP、または、MySQLのdatetime(例: 2016-12-18 03:20:45)の形式で指定可。
max_taken_date
日時を指定すると、その日時より過去に撮影された写真のみを検索する。日時はUNIX TIMESTAMP、または、MySQLのdatetime(例: 2016-12-18 03:20:45)の形式で指定可。
license
ライセンスの番号を指定することで、そのライセンスが設定された写真に絞って検索することができる。複数指定する場合は、半角カンマ(,)で区切る。
0 … All Rights Reserved.
1Attribution-NonCommercial-ShareAlike License
2Attribution-NonCommercial License
3Attribution-NonCommercial-NoDerivs License
4Attribution License
5Attribution-ShareAlike License
6Attribution-NoDerivs License
7No known copyright restrictions
8United States Government Work
sort
ソートを指定する。デフォルトは新着順。
date-posted-asc … 投稿日時が古い順。
date-posted-desc … 投稿日時が新しい順。
date-taken-asc … 撮影日時が古い順。
date-taken-desc … 撮影日時が新しい順。
interestingness-desc … 関連順。
interestingness-asc … 関連しない順。
bbox
Bounding Box(南西端と北東端の位置座標)を指定することで、その矩形領域内の位置座標が付けられた写真のみに絞って検索する。指定の順序は西(経度)、南(緯度)、東(経度)、北(緯度)の順番となっているので注意。緯度と経度に関しては、緯度、経度チェッカーをご利用下さい。
safe_search
不適切な可能性のあるコンテンツを除外することができる。13までを指定でき、1が一番安全。
content_type
コンテンツを絞って取得できる。
1 … 写真2 … スクリーンショット
3 … その他
4 … 写真とスクリーンショット
5 … スクリーンショットとその他
6 … 写真とその他
7 … 全て
woe_id
場所のWOEIDを指定することで、その場所に関連付けられた写真に絞って写真を検索できる。WOEIDを検索するためのwebサービスを作ったので、IDを調べるのに活用して下さい。
media
メディアの種類を限定する。photosなら写真のみで、videosなら動画のみ。
extras
取得するデータの種類を指定する。複数ある場合は、半角カンマ(,)で区切る。
description … コメント。
license … ライセンスの種類。
date_upload … 投稿日時。
date_taken … 撮影日時。
owner_name … 投稿者名。
icon_server … ユーザーアイコン。
original_format … メディアのフォーマット。
last_update … 最終更新日時。
geo … 位置座標。
tags … タグ。
media … メディアの種類。
url_sq … 75x75サイズの画像ファイルURL。
url_t … 最大100pxの画像ファイルURL。
url_s … 最大240pxの画像ファイルURL。
url_q … 150x150の画像ファイルURL。
url_m … 最大500pxの画像ファイルURL。
url_n … 最大320pxの画像ファイルURL。
url_z … 最大640pxの画像ファイルURL。
url_c … 最大800pxの画像ファイルURL。
url_l … 最大1024pxの画像ファイルURL。
url_o … オリジナルサイズの画像ファイルURL。
per_page
取得件数を指定する。デフォルトは100で、500まで指定可。
page
ページ数を指定する。デフォルトは1

取得できるJSON

extrasに全てのパラメータを指定して、取得したデータのJSONです。2件分のデータが含まれています。どのようなデータが取得できるのか、ご確認下さい。

サンプル

JSON

{"page":1,"pages":14,"perpage":2,"total":"28","photo":[{"id":"8008095074","owner":"87528524@N08","secret":"d7605616e0","server":"8449","farm":9,"title":"\u9ce5\u53d6\u770c\u65c5\u884c-33","ispublic":1,"isfriend":0,"isfamily":0,"license":"0","description":{"_content":""},"dateupload":"1348198721","lastupdate":"1348292177","datetaken":"2012-09-16 15:09:54","datetakengranularity":"0","datetakenunknown":0,"ownername":"Yuta Arai 0206","iconserver":"8310","iconfarm":9,"views":"19","tags":"","machine_tags":"","originalsecret":"162ee2a9a1","originalformat":"jpg","latitude":"35.542500","longitude":"134.236500","accuracy":"16","context":0,"place_id":"5WzgEMZYUrr_bksJVw","woeid":"90010718","geo_is_family":0,"geo_is_friend":0,"geo_is_contact":0,"geo_is_public":1,"media":"photo","media_status":"ready","url_sq":"https:\/\/farm9.staticflickr.com\/8449\/8008095074_d7605616e0_s.jpg","height_sq":75,"width_sq":75,"url_t":"https:\/\/farm9.staticflickr.com\/8449\/8008095074_d7605616e0_t.jpg","height_t":"75","width_t":"100","url_s":"https:\/\/farm9.staticflickr.com\/8449\/8008095074_d7605616e0_m.jpg","height_s":"180","width_s":"240","url_q":"https:\/\/farm9.staticflickr.com\/8449\/8008095074_d7605616e0_q.jpg","height_q":"150","width_q":"150","url_m":"https:\/\/farm9.staticflickr.com\/8449\/8008095074_d7605616e0.jpg","height_m":"375","width_m":"500","url_n":"https:\/\/farm9.staticflickr.com\/8449\/8008095074_d7605616e0_n.jpg","height_n":240,"width_n":"320","url_z":"https:\/\/farm9.staticflickr.com\/8449\/8008095074_d7605616e0_z.jpg","height_z":"480","width_z":"640","url_c":"https:\/\/farm9.staticflickr.com\/8449\/8008095074_d7605616e0_c.jpg","height_c":600,"width_c":"800","url_l":"https:\/\/farm9.staticflickr.com\/8449\/8008095074_d7605616e0_b.jpg","height_l":"768","width_l":"1024","url_o":"https:\/\/farm9.staticflickr.com\/8449\/8008095074_162ee2a9a1_o.jpg","height_o":"1536","width_o":"2048","pathalias":"yuta_arai_0206"},{"id":"8008094638","owner":"87528524@N08","secret":"8aa6e9a1ab","server":"8451","farm":9,"title":"\u9ce5\u53d6\u770c\u65c5\u884c-32","ispublic":1,"isfriend":0,"isfamily":0,"license":"0","description":{"_content":""},"dateupload":"1348198705","lastupdate":"1348292177","datetaken":"2012-09-16 15:09:46","datetakengranularity":"0","datetakenunknown":0,"ownername":"Yuta Arai 0206","iconserver":"8310","iconfarm":9,"views":"20","tags":"","machine_tags":"","originalsecret":"151a579fc7","originalformat":"jpg","latitude":"35.542833","longitude":"134.236500","accuracy":"16","context":0,"place_id":"5WzgEMZYUrr_bksJVw","woeid":"90010718","geo_is_family":0,"geo_is_friend":0,"geo_is_contact":0,"geo_is_public":1,"media":"photo","media_status":"ready","url_sq":"https:\/\/farm9.staticflickr.com\/8451\/8008094638_8aa6e9a1ab_s.jpg","height_sq":75,"width_sq":75,"url_t":"https:\/\/farm9.staticflickr.com\/8451\/8008094638_8aa6e9a1ab_t.jpg","height_t":"75","width_t":"100","url_s":"https:\/\/farm9.staticflickr.com\/8451\/8008094638_8aa6e9a1ab_m.jpg","height_s":"180","width_s":"240","url_q":"https:\/\/farm9.staticflickr.com\/8451\/8008094638_8aa6e9a1ab_q.jpg","height_q":"150","width_q":"150","url_m":"https:\/\/farm9.staticflickr.com\/8451\/8008094638_8aa6e9a1ab.jpg","height_m":"375","width_m":"500","url_n":"https:\/\/farm9.staticflickr.com\/8451\/8008094638_8aa6e9a1ab_n.jpg","height_n":240,"width_n":"320","url_z":"https:\/\/farm9.staticflickr.com\/8451\/8008094638_8aa6e9a1ab_z.jpg","height_z":"480","width_z":"640","url_c":"https:\/\/farm9.staticflickr.com\/8451\/8008094638_8aa6e9a1ab_c.jpg","height_c":600,"width_c":"800","url_l":"https:\/\/farm9.staticflickr.com\/8451\/8008094638_8aa6e9a1ab_b.jpg","height_l":"768","width_l":"1024","url_o":"https:\/\/farm9.staticflickr.com\/8451\/8008094638_151a579fc7_o.jpg","height_o":"1536","width_o":"2048","pathalias":"yuta_arai_0206"}]}

各プロパティの説明

取得できるデータの内、主な項目の説明です。

page
現在のページ数。
pages
総ページ数。
perpage
1回のリクエストの取得件数。
total
総件数。
owner
ユーザーのNSID。
title
写真のタイトル。
ispublic
公開された写真か?
description
写真のコメント。
dateupload
投稿日時のタイムスタンプ。
lastupdate
撮影日時のタイムスタンプ。
datetaken
撮影日時。
ownername
投稿者名。
views
閲覧数。
originalformat
メディアのフォーマット。
latitude
緯度。
longitude
経度。
woeid
撮影場所が属するWOEID。
media
メディアのフォーマット。
media
メディアのフォーマット。

ダウンロード

この記事で紹介したサンプルプログラムを配布しています。よろしければ、プログラミングの下地としてお使い下さい。

ファイル一覧

SYNCER00264
search-photos.php Download
phpFlickr.php

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

phpFlickr.phpはzipファイルの中に含まれていません。

Download Zip