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

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

世界中の、レベルの高い写真家たちが「我こそは」と素晴らしい写真を投稿するSNS、「500px」。今回は、この500pxのユーザーや投稿作品の情報を取り扱ってwebサービスを作りたい人のために、APIの使い方をまとめていきます。

アプリケーションの登録

500pxのAPIを利用するには、アプリケーションを作成し、APIキー(Consumer KeyとConsumer Secret)を取得する必要があります。この章では、アプリケーションの作成方法を説明します。

アカウントを取得する

500pxのアカウントを取得する
500pxのアカウントを取得する

アプリケーションを登録するには、前提として、500pxのユーザーアカウントを所有している必要があります。下記は500pxのウェブサイトです。まだ持っていない人は、アクセスしてユーザー登録を済ませて下さい。

アプリケーションの管理画面

アカウントを作成後、ログインをしたところから説明します。まず、下記リンクから、設定画面に移動して下さい。

アプリケーションの管理画面
アプリケーションの管理画面

初めてアクセスした人は、まだ、何のアプリケーションも表示されていません。作ってないのだから当たり前ですね。アプリケーションを作成するには、画面中央にある「register your application」というボタンをクリックして下さい。

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

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

ボタンをクリックすると、アプリケーションを登録するためのフォームが出現するので、アプリケーションの情報を入力しましょう。この情報は、後からいつでも変更することができます。入力が終わったら、下部にある「I accept the 500px API Terms of Use(利用規約に同意する)」にチェックを入れた後、「Register」のボタンをクリックして下さい。

Application Name
アプリケーション名。ウェブサービスの名前など。
Description
アプリケーション、ウェブサービスの説明文。
Application URL
アプリケーションのURLアドレス。APIを利用するウェブサイトのURLなど。
Callback URL
OAuth1.0認証を行なう際の、コールバックURL。認証を利用しない場合は必要ない。
JavaScript SDK Callback
JavaScriptでOAuth1.0認証を行なう際の、コールバックURL。利用しない場合は必要ない。
Support URL
アプリケーションのヘルプページのURL。存在しない場合は必要ない。
Developer's Email
開発者の連絡先となるメールアドレス。

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

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

無事、アプリケーションの作成が完了すると、管理画面に移動します。赤枠部分に、今作ったアプリケーションが表示されているはずです。「EDIT」ボタンをクリックすると、アプリケーションの情報を編集することができます。「DELETE」ボタンをクリックすると、このアプリケーションを削除します。また、赤枠の右側にある「Register Your Application」をクリックすると、新しくアプリケーションを作成することができます。アプリケーションの各キーを確認するには「See application details」というテキストリンクをクリックして下さい。

APIキーを確認する

コンシューマーキーを確認する
コンシューマーキーを確認する

Toggleが開き、このアプリケーションの各種キーを確認することができます。主に利用するのは「Consumer Key」「Consumer Secret」になるでしょう。これらの情報をいつでも確認できるようにしておきましょう。他人に知られてはいけません。

写真を検索する

この章では、500pxのAPIを利用して、様々な条件を指定して写真を検索する方法を説明します。

リクエスト方法

写真を検索するためのエンドポイントのURLは下記の通りです。GETメソッドでリクエストを送って下さい。

GET https://api.500px.com/v1/photos/search

パラメータ

検索するための条件を指定するためのパラメータは下記の通りです。termtaggeoのいずれかは必須です。

consumer_key
アプリケーションのコンシューマーキー。
term
検索キーワードを指定する。
tag
作品についたハッシュタグを指定する。
geo
位置座標から作品を探す際に、緯度,経度,範囲という形式で指定する。範囲はキロメートル(km)、またはマイル(mi)という単位を付けること。範囲は小数点の指定が可能なようです。
例: 35.794434,139.790838,10km
only
カテゴリ名を指定すると、その中から写真を検索する。複数ある場合は半角カンマ(,)で区切ること。
exclude
カテゴリ名を指定すると、そのカテゴリを除外して写真を検索する。複数ある場合は半角カンマ(,)で区切ること。
page
取得結果のページを指定する。デフォルトでは1
rpp
取得件数を指定する。デフォルトは20で、指定できる最大数は100
image_size
取得する画像のサイズを、IDで指定する。詳しくは「画像サイズ」の章を参考にして下さい。
license_type
クリエイティブ・コモンズに対応した、作品のライセンスの種類で検索結果を絞る際に、数字を指定する。複数指定する場合は半角カンマ(,)で区切る。
sort
検索結果のソート方法を指定する。デフォルトはcreated_at
_score … 検索条件に最適な順序を500pxのアルゴリズムが判定してソートする。
created_at … 投稿日時が新しい順。
rating … 評価が高い順。
highest_rating … 最も高い評価(点数)が、高い順。
times_viewed … 閲覧回数が多い順。
votes_count … 投票数が多い順。
favorites_count … お気に入り数が多い順。
comments_count … コメント数が多い順。
taken_at … 投稿日ではなく、写真のExifに記録された撮影日が、新しい順。

取得できるJSON

下記は、リクエストが成功した時に取得できるJSONのサンプルです。

JSON

{"current_page":1,"total_pages":4,"total_items":8,"photos":[{"id":63974851,"user_id":7138035,"name":"GURDIAN DOG","description":"Gurdian dogs is in Japanese Temple.\nJapanese gods live in the temple.\n\nDogs protect them.\n\nSo They are cool and dignity...\n\nI love them","camera":"Canon EOS 5D Mark II","lens":null,"focal_length":"50","iso":"100","shutter_speed":"1/640","aperture":"5.6","times_viewed":79,"rating":37.9,"status":1,"created_at":"2014-03-16T10:59:18-04:00","category":11,"location":null,"latitude":35.7700541972717,"longitude":139.799137115479,"taken_at":"2014-03-16T15:07:06-04:00","hi_res_uploaded":2,"for_sale":true,"width":5616,"height":3744,"votes_count":12,"favorites_count":5,"comments_count":2,"nsfw":false,"sales_count":0,"for_sale_date":null,"highest_rating":60.3,"highest_rating_date":"2014-03-22T22:48:36-04:00","license_type":0,"converted":31,"collections_count":0,"crop_version":0,"privacy":false,"image_url":"https://drscdn.500px.org/photo/63974851/w%3D70_h%3D70/b1f4363d1b0ed5a851219c075d347dea?v=0","images":[{"size":1,"url":"https://drscdn.500px.org/photo/63974851/w%3D70_h%3D70/b1f4363d1b0ed5a851219c075d347dea?v=0","https_url":"https://drscdn.500px.org/photo/63974851/w%3D70_h%3D70/b1f4363d1b0ed5a851219c075d347dea?v=0","format":"jpeg"}],"url":"/photo/63974851/gurdian-dog-by-arata-kita","positive_votes_count":12,"converted_bits":31,"share_counts":{"pinterest":0,"facebook":0,"twitter":0},"location_details":{"country":["Japan"],"county":["北葛飾郡"],"state":[],"city":["Adachi"],"attraction":[]},"watermark":false,"image_format":"jpeg","licensing_requested":false,"user":{"id":7138035,"username":"aratakita","firstname":"Arata","lastname":"Kita","city":"","country":"Japan","usertype":0,"fullname":"Arata Kita","userpic_url":"https://pacdn.500px.org/7138035/484f23a3649b615f1025e283574da42b54e39518/1.jpg?1","userpic_https_url":"https://pacdn.500px.org/7138035/484f23a3649b615f1025e283574da42b54e39518/1.jpg?1","cover_url":"https://pacdn.500px.org/7138035/484f23a3649b615f1025e283574da42b54e39518/cover_2048.jpg?2","upgrade_status":0,"store_on":true,"affection":458,"avatars":{"default":{"https":"https://pacdn.500px.org/7138035/484f23a3649b615f1025e283574da42b54e39518/1.jpg?1"},"large":{"https":"https://pacdn.500px.org/7138035/484f23a3649b615f1025e283574da42b54e39518/2.jpg?1"},"small":{"https":"https://pacdn.500px.org/7138035/484f23a3649b615f1025e283574da42b54e39518/3.jpg?1"},"tiny":{"https":"https://pacdn.500px.org/7138035/484f23a3649b615f1025e283574da42b54e39518/4.jpg?1"}},"followers_count":20}},{"id":63972869,"user_id":7138035,"name":"SUNSET","description":"Japan has many amazing views.\r\nEspecially i love Sunset.\r\nU must see the AWESOME sunset in japan if u have never seen it...","camera":"Canon EOS 5D Mark II","lens":"","focal_length":"50","iso":"100","shutter_speed":"1/100","aperture":"22","times_viewed":71,"rating":31.5,"status":1,"created_at":"2014-03-16T10:42:23-04:00","category":18,"location":null,"latitude":35.775485962768,"longitude":139.809265136719,"taken_at":"2014-03-16T17:12:27-04:00","hi_res_uploaded":2,"for_sale":true,"width":5616,"height":3744,"votes_count":9,"favorites_count":1,"comments_count":0,"nsfw":false,"sales_count":0,"for_sale_date":null,"highest_rating":48.7,"highest_rating_date":"2014-03-23T01:30:32-04:00","license_type":0,"converted":31,"collections_count":0,"crop_version":0,"privacy":false,"image_url":"https://drscdn.500px.org/photo/63972869/w%3D70_h%3D70/ee5d98d1afce6489a36214b91f9a265a?v=0","images":[{"size":1,"url":"https://drscdn.500px.org/photo/63972869/w%3D70_h%3D70/ee5d98d1afce6489a36214b91f9a265a?v=0","https_url":"https://drscdn.500px.org/photo/63972869/w%3D70_h%3D70/ee5d98d1afce6489a36214b91f9a265a?v=0","format":"jpeg"}],"url":"/photo/63972869/sunset-by-arata-kita","positive_votes_count":9,"converted_bits":31,"share_counts":{},"location_details":{"country":[],"county":[],"state":[],"city":[],"attraction":[]},"watermark":false,"image_format":"jpeg","licensing_requested":false,"user":{"id":7138035,"username":"aratakita","firstname":"Arata","lastname":"Kita","city":"","country":"Japan","usertype":0,"fullname":"Arata Kita","userpic_url":"https://pacdn.500px.org/7138035/484f23a3649b615f1025e283574da42b54e39518/1.jpg?1","userpic_https_url":"https://pacdn.500px.org/7138035/484f23a3649b615f1025e283574da42b54e39518/1.jpg?1","cover_url":"https://pacdn.500px.org/7138035/484f23a3649b615f1025e283574da42b54e39518/cover_2048.jpg?2","upgrade_status":0,"store_on":true,"affection":458,"avatars":{"default":{"https":"https://pacdn.500px.org/7138035/484f23a3649b615f1025e283574da42b54e39518/1.jpg?1"},"large":{"https":"https://pacdn.500px.org/7138035/484f23a3649b615f1025e283574da42b54e39518/2.jpg?1"},"small":{"https":"https://pacdn.500px.org/7138035/484f23a3649b615f1025e283574da42b54e39518/3.jpg?1"},"tiny":{"https":"https://pacdn.500px.org/7138035/484f23a3649b615f1025e283574da42b54e39518/4.jpg?1"}},"followers_count":20}}]}

各プロパティの説明

JSONの各プロパティは、下記のような意味を持っています。

current_page
取得したページ番号。
total_pages
この検索条件での、総ページ数。
total_items
この検索条件での、総作品数。
id
写真の作品ID。
user_id
投稿者のユーザーID。
name
写真作品に付けられた名前。
description
写真作品の説明文。
camera
撮影したカメラの名前。
shutter_speed
シャッタースピード。
times_viewed
500px内での閲覧回数。
rating
レーティング、点数。
created_at
投稿日時。
category
カテゴリID。
location
地名が設定されている場合の、名前。位置座標が設定されていたとしても、nullの場合がほとんど。
latitude
緯度。
longitude
経度。
taken_at
撮影日。
width
オリジナル画像の横幅。
height
オリジナル画像の縦幅。
votes_count
作品への投票数。
favorites_count
お気に入りされた数。
comments_count
コメント数。
nsfw
未成年に不適切な、アダルトな内容、暴力的な内容の場合は、投稿者がtrueに設定している。
sales_count
販売枚数。
highest_rating
付けられた、最も高い点数。
highest_rating_date
最も高い点数が付けられた日時。
license_type
設定されたライセンスの種類。
collections_count
コレクションに加えられた回数。
privacy
非公開写真か否か。
image_url
画像のURL。
images
画像の詳しい情報。
url
500px内の、写真作品ページのパーマリンク。
positive_votes_count
好意的な、投票数。
share_counts
Twitter、Pinterest、Facebook、それぞれのシェア回数。
location_details
撮影場所の詳しい情報。
image_format
画像のフォーマット。
user
投稿者の情報。

サンプルプログラム

以上を踏まえたサンプルプログラムが下記です。

PHP

<?php

	// 設定項目
	$consumer_key = '' ;		// クライアントキー

	// パラメータ
	$params = array(
		'consumer_key' => $consumer_key ,
		'image_size' => '600' ,
		'rpp' => '20' ,
		'geo' => '35.681382,139.766084,500km' ,
	) ;

	// GETメソッドで指定がある場合
	foreach( array( 'only' , 'term' , 'geo' , 'rpp' , 'license_type' , 'sort' ) as $val )
	{
		if( isset( $_GET[ $val ] ) && $_GET[ $val ] != '' )
		{
			$params[ $val ] = $_GET[ $val ] ;
		}
	}

	// リクエストURL
	$request_url = 'https://api.500px.com/v1/photos/search' . '?' . http_build_query( $params ) ;		// リクエストURL

	// アイテムデータをJSON形式で取得する (CURLを使用)
	$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'] ) ;								// レスポンスヘッダー (検証に利用したい場合にどうぞ)

	// HTML用
	$html = '' ;

	// JSONデータをオブジェクト形式に変換する
	$obj = json_decode( $json ) ;

	// 条件指定用フォーム
	$html .= '<h2>条件を指定する</h2>' ;
	$html .= '<p>条件を指定して、写真を検索してみて下さい。</p>' ;
	$html .= '<form>' ;
	$html .= 	'<p style="font-size:.9em; font-weight:700;"><label for="term">検索キーワード (term)</label></p>' ;
	$html .= 		'<p style="margin:0 0 1em;"><input id="term" name="term" placeholder="花火"></p>' ;
	$html .= 	'<p style="font-size:.9em; font-weight:700;"><label for="geo">位置座標 (geo)</label></p>' ;
	$html .= 		'<p style="margin:0 0 1em;"><input id="geo" name="geo" placeholder="35.681382,139.766084,500km"></p>' ;
	$html .= 	'<p style="font-size:.9em; font-weight:700;"><label for="rpp">取得件数 (rpp)</label></p>' ;
	$html .= 		'<p style="margin:0 0 1em;"><input id="rpp" name="rpp" value="20" placeholder="20"></p>' ;
	$html .= 	'<p style="font-size:.9em; font-weight:700;"><label for="only">カテゴリ名 (only)</label></p>' ;
	$html .= 		'<p style="margin:0 0 1em;"><input id="only" name="only" value="" placeholder="Animals"></p>' ;
	$html .= 	'<p style="font-size:.9em; font-weight:700;"><label for="license_type">ライセンス (license_type)</label></p>' ;
	$html .= 		'<p style="margin:0 0 1em;"><input id="license_type" name="license_type" value="" placeholder="1"></p>' ;
	$html .= 	'<p style="font-size:.9em; font-weight:700;"><label for="sort">ソート (sort)</label></p>' ;
	$html .= 		'<p style="margin:0 0 1em;"><input id="sort" name="sort" value="_score" placeholder="_score"></p>' ;
	$html .= 	'<p><button>検索する</button></p>' ;
	$html .= '</form>' ;

	// HTMLを作成
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj || !isset($obj->photos) )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		foreach( $obj->photos as $item )
		{
			// 成人コンテンツをスキップ
			if( isset( $item->nsfw ) && $item->nsfw )
			{
				continue ;
			}

			// 各データ
			$id = $item->id ;		// メディアID
			$name = ( isset($item->name) ) ? $item->name : '' ;		// 写真のタイトル
			$description = ( isset($item->description) ) ? $item->description : '' ;		// 写真の説明
			$image_url = $item->image_url ;		// 写真のURL
			$created_at = $item->created_at ;		// 投稿日時

			// ユーザー情報
			$user_id = $item->user_id ;		// 投稿者ID
			$user_username = $item->user->username ;		// ユーザーネーム
			$user_avatars = ( isset($item->user->avatars->default->https) ) ? $item->user->avatars->default->https : '' ;		// アバター画像

			// 場所情報
			$country = ( isset($item->location_details->country[0]) ) ? $item->location_details->country[0] : '' ;		// 国名
			$latitude = ( isset($item->latitude) ) ? $item->latitude : '' ;		// 緯度
			$longitude = ( isset($item->longitude) ) ? $item->longitude : '' ;		// 緯度

			// 日付の整形
			$created_at = date( 'Y/m/d H:i' , strtotime( $created_at ) ) ;

			// ブラウザに出力
			$html .= '<dl>' ;
			$html .= 	'<dt>投稿者のID</dt>' ;
			$html .= 		'<dd>' . $user_id . '</dd>' ;
			$html .= 	'<dt>投稿者のユーザーネーム</dt>' ;
			$html .= 		'<dd><a href="https://500px.com/' . $user_username . '" target="_blank">' . $user_username . '</a></dd>' ;

			// アイコン画像がある場合
			if( $user_avatars )
			{
				$html .= 	'<dt>投稿者のアイコン</dt>' ;
				$html .= 		'<dd><img class="_img" src="' . $user_avatars . '" width="auto" height="75"></dd>' ;
			}

			$html .= 	'<dt>写真</dt>' ;
			$html .= 		'<dd><img class="_img" src="' . $image_url . '"></dd>' ;

			// 写真のタイトル
			if( $name )
			{
				$html .= 	'<dt>写真のタイトル</dt>' ;
				$html .= 		'<dd>' . $name . '</dd>' ;
			}

			// 写真の説明
			if( $description )
			{
				$html .= 	'<dt>写真の説明</dt>' ;
				$html .= 		'<dd>' . $description . '</dd>' ;
			}

			// 場所名がある場合
			if( $country )
			{
				$html .= 	'<dt>国名</dt>' ;
				$html .= 		'<dd>' . $country . '</dd>' ;
			}

			// 緯度、経度がある場合
			if( $latitude && $longitude )
			{
				$html .= 	'<dt>地図</dt>' ;
				$html .= 		'<dd><a href="https://www.google.co.jp/maps/@' . $latitude . ',' . $longitude . ',15z" target="_blank">Google Mapsで位置を確認する</a></dd>' ;
			}

			$html .= 	'<dt>投稿日時</dt>' ;
			$html .= 		'<dd>' . $created_at . '</dd>' ;

			$html .= '</dl>' ;
		}
	}

	// 取得したデータ
	$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 ;
?>

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

画像サイズ

500pxでは、取得する画像サイズの大きさを、専用のIDで指定することができます。下記がその一覧です。確実なサイズを取得したい場合はcroppedのタイプを、高さが固定されているサイズを取得したい場合は* x ...pxのタイプを取得しましょう。それ以外の場合、横幅、または高さの長い方を基準としたリサイズになります。

ID画像サイズリサイズ形式
170px x 70pxcropped
2140px x 140pxcropped
3280px x 280pxcropped
100100px x 100pxcropped
200200px x 200pxcropped
440440px x 440pxcropped
600600px x 600pxcropped
4900px x * OR * x 900pxfit
51170px x * OR * x 1170pxfit
20* x 300pxfit
21* x 600pxfit
30256px x * OR * x 256pxfit
1,0801080px x * OR * x 1080pxfit
1,6001600px x * OR * x 1600pxfit
2,0482048px x * OR * x 2048pxfit

カテゴリー

500pxのカテゴリーIDと、カテゴリー名の一覧です。APIでリクエスト時、関連パラメータに指定する際は、IDと名前、どちらか指定されたものを使用して下さい。

ID名前説明
0Uncategorizedカテゴリに所属しない。
10Abstract抽象画。
11Animals動物。
5Black and White白黒。
1Celebritiesセレブ。
9City and Architecture都市と建築。
15Commercial広告。
16Concertコンサート。
20Family家族。
14Fashionファッション。
2Filmフィルム。
24Fine Art美術。
23Food飲食物。
3Journalismジャーナリズム。
8Landscapes風景。
12Macroマクロ。
18Nature自然。
4Nudeヌード。
7Nude人物。
19Performing Arts舞台芸術。
17Sportスポーツ。
6Still Life静的なもの。
21Streetストリート。
26Transportation交通。
13Travel旅行。
22Underwater水中。
27Urban Exploration建築物、廃墟。
25Weddingウェディング。

ライセンス

500pxのライセンスの詳細は、公式ウェブサイトで確認しましょう。

ID名前説明
0Standard 500px License500pxの標準ライセンス。クリエイティブ・コモンズのライセンスが設定されていない。
1CC BY-NC著作者のクレジットを表記すれば、改変、再配布が自由。商用利用は禁止。
2CC BY-NC-ND著作者のクレジットを表記すれば、再配布が自由。改変、商用利用は禁止。
3CC BY-NC-SA著作者のクレジットを表記すれば、改変、再配布が自由。商用利用は禁止。再配布の際、ライセンスを変更することはできません。
4CC BY著作者のクレジットを表記すれば、商用利用、改変、再配布が自由。
5CC BY-ND著作者のクレジットを表記すれば、商用利用、再配布が自由。改変は禁止。
6CC BY-SA著作者のクレジットを表記すれば、商用利用、改変、再配布が自由。再配布の際、ライセンスを変更することはできません。

ダウンロード

500pxで写真検索をするサンプルプログラムを配布しています。

ファイル一覧

SYNCER00259
photos-search.php Download

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

Download Zip