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

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

「場所や位置情報を使ったwebサービスを作りたい」と思った時にすぐに思い浮かぶのがFoursquare。この記事では、Foursquareが提供するAPIの使い方を説明します。公式ドキュメント(英語)は、下記ページにあります。

アプリケーションの登録

FoursquareのAPIを利用するためには、アプリケーションの作成が必要です。この章では、アプリケーションの作成方法を説明していきます。

ユーザーアカウントの取得

大前提として、アプリケーションを作成するには、Foursquareのユーザーアカウントが必要です。普段利用しているユーザーアカウントでかまいません。もし、まだない人は、下記ページから作成して下さい。

管理画面へのアクセス

「マイアプリ」をクリックする
「マイアプリ」をクリックする

Foursquare Developersのページにアクセスし、上部メニューの「マイアプリ」をクリックして下さい。この時、まだの場合はログインを求められるので、ユーザーアカウントでログインして下さい。

アプリケーションの作成

「新しいアプリをつくる」をクリックする
「新しいアプリをつくる」をクリックする

アプリケーションの一覧画面に移動します。まだ、アプリケーションを1つも作成していない場合、ここには何も表示されません。新しくアプリケーションを作成するので、画面右上にある「新しいアプリをつくる」のボタンをクリックして下さい。

アプリケーションの情報を登録する
アプリケーションの情報を登録する

アプリケーション情報の登録フォームに移動します。図を参考に、アプリケーションの情報を入力し、「変更を保存する」のボタンをクリックして下さい。後でいくらでも編集可能です。お試しの段階では、入力事項は最小限で大丈夫でしょう。1つだけ、「Redirect URI」の項目を意識しておいて下さい。ここには、後ほど、ユーザー認証作業に利用するプログラムのURLアドレスを入力する必要があります。

KEYとSECRETを確認する
KEYとSECRETを確認する

入力した情報に問題がなければ、アプリケーションの作成作業が完了し、アプリケーションの詳細画面に移動します。赤枠部分にある「Client id」、「Client secret」がそれぞれ、アプリケーションキーと、アプリケーションシークレットとなります。この値は後ほど利用します。

アプリケーションの管理

登録内容を変更したり、アプリケーション自体を削除する際の手順を確認しておきましょう。

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

「マイアプリ」のリンクからアクセスできる、アプリケーションの一覧画面です。作成したアプリケーションが、一覧に加わっているのを確認できると思います。アプリケーションを編集するには、名前の部分のリンクテキストをクリックして下さい。

編集

「このアプリを編集する」をクリックする
「このアプリを編集する」をクリックする

アプリケーションの詳細画面に移動します。編集をする場合は、「このアプリを編集する」のボタンをクリックして下さい。作成する時と同じ、アプリケーション情報の入力フォームに移動することができます。

削除

アプリケーションを削除する
アプリケーションを削除する

サイドメニューからは、アプリケーションのアイコンを登録したり、アプリケーションを削除することができます。アプリケーションキー、シークレットなどが流出してしまった、などの自体には、削除して新しく作り直しましょう。

アクセストークンの取得

さて、アプリケーションを作成し、アプリケーション用のキーを取得することができました。続いては、APIを利用するユーザー(あなた、もしくは、あなたのウェブサービスを利用するユーザー)のキーを取得する必要があります。このキーがアクセストークンです。認証についての公式案内(英語)は下記ページをご参考下さい。

アクセストークンとは?

個々のユーザーのキー

前章で取得したAPIキーが、個々のアプリケーションに割り当てられたキーならば、アクセストークンは個々の「ユーザー」に割り当てられたキーです。アクセストークンを利用することで、そのアプリケーションが、該当ユーザーのプライベートな情報(チェックイン一覧など)を読み取ったり、該当ユーザーの代わりにチェックインを行なうことなどができるようになります。このアクセストークンは、「ユーザー自身」が、自分で操作して発行する必要があります。アプリケーションの開発者も同じです。この章では、ユーザー自身がアクセストークンを発行することを助けるための認証用プログラムを作成する方法を説明します。

取得する流れ

Foursquareでアクセストークンを取得するには、OAuth2.0という形式の認証作業を行ないます。その主な流れは次の通りです。これらはプログラムを見た方が理解が速いと思うので、なんとなくイメージしておけば大丈夫です。

  1. ユーザーを、Foursquareのサーバー上にある認証画面に移動させる。
  2. ユーザーが認証画面で、あなたのアプリケーションを承認する。
  3. 戻ってきたユーザーからコードを受け取り、そのコードを元に、Foursquareにリクエストを送り、アクセストークンを取得する。

プログラミング

[Redirect URI]の設定

準備として、プログラムを設置するURLアドレスを、アプリケーションの「Redirect URI」の項目に設定しておいて下さい。ユーザーは認証作業を終えた後、このURLアドレスにリダイレクトで移動してくることになります。

ユーザーを認証画面に移動させる

それでは早速、アクセストークンを取得するためのプログラムを作成していきましょう。まずはユーザーを、下記の認証画面に、指定のパラメータを付けて移動させます。リンクを貼ってもいいですが、リダイレクト(強制的な自動移動)の方がお手軽ですね。

GET https://foursquare.com/oauth2/authenticate?client_id={アプリケーションキー}&response_type=code&redirect_uri={リダイレクトURI}

PHPでは、次のようになります。

PHP

<?php

	// 設定
	$consumer_key = '' ;			// アプリケーションキー (Consumer Key)
	$consumer_secret = '' ;		// アプリケーションシークレット (Consumer Secret)
	$redirect_uri = '' ;		// リダイレクトURL (Redirect URI)

	// ユーザーを認証画面に移動させる
	header( 'Location: https://foursquare.com/oauth2/authenticate?client_id=' . $consumer_key . '&response_type=code&redirect_uri=' . rawurlencode( $redirect_uri ) ) ;

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

理解がしやすいように、リダイレクトをせず、リンクからアクセスするパターンのデモも用意してみました。私が初めての時にややこしくなってしまった点なので、あえてくどく書きますが、要は、指定のURLにユーザーがアクセスすればいいということです。

サンプルデモを見る

ユーザーによる認証作業

認証画面
認証画面

続いては、ユーザー自身の操作です。「アプリケーションが自分のデータにアクセスすることを承認しますか?」という認証画面で、ユーザーがアプリケーションを許可、または拒否します。この作業後、ユーザーは、今度はFoursquare側から、プログラムのURL(Redirect URI)にパラメータを付けて飛ばされてきます。

ユーザーが戻って来る

ユーザーが、アプリケーションの連携を許可した場合と、拒否した場合とで、パラメータが分かれます。プログラム側は、このパラメータを元に、ユーザーの行動(許可、または拒否)を判定して、処理を条件分けすることになります。下記はユーザーが「拒否」をして返ってきた場合です。

GET https://example.com/redirect.php?error=access_denied#_=_

一方、下記は、ユーザーが「許可」をして返ってきた場合です。codeプロパティの値は、次の行程で、アクセストークンを取得する際に必要となります。

GET https://example.com/redirect.php?code=2ACQ4YA3YWDJFVJVZZGCC1H322ZD5OTEHZYZKMPBII11GIYP#_=_

条件分けは、例えば、次のように行なうことができるでしょう。

PHP

<?php

	//「許可」の場合
	if( isset( $_GET['code'] ) && !empty( $_GET['code'] ) && is_string( $_GET['code'] ) )
	{
		// アクセストークンの取得に利用するコード
		$code = $_GET['code'] ;
	}
	// 「拒否」の場合
	elseif( isset( $_GET['error'] ) )
	{
		// 「許可」してくれなかったことに文句を言う
		echo 'なんで「許可」してくれなかったんですか!?' ;

		// もしくは、ヤフーに飛ばす…(年代がバレるので非推奨…)
		// header( 'Location: http://www.yahoo.co.jp' ) ;
	}

アクセストークンを取得する

仕上げに、ユーザーから受け取ったコードを使って、Foursquareにリクエストを送り、アクセストークンを取得します。リクエスト先のURLは下記の通りです。GETメソッドでリクエストを送ります。それぞれのパラメータを付けることを忘れないで下さい。

GET https://foursquare.com/oauth2/access_token?client_id={アプリケーションキー}&client_secret={アプリケーションシークレット}&grant_type=authorization_code&redirect_uri={Redirect URI}&code={受け取ったコード}

リクエストに成功すると、下記のJSONデータを取得することができます。この、access_tokenの値が、目的のアクセストークンということになります。

JSON

{"access_token": "Q4RGZX0HCNDFAJJWUTZ3PJ0N2SJPML13VXLIQIL3UT53XV4T"}

この行程をPHPで記述すると、下記のようになります。$access_tokenに代入したアクセストークンは、ここではブラウザに出力していますが、そのまま次のAPIリクエストに使用したり、データベースに保存したりと、目的に応じて処理を分けて下さいね。また、データ取得は分かりやすさ優先でfile_get_contenst()を使っていますが、もちろん、cURLの方が処理が速いのでお勧めです。

PHP

	// 受け取ったコードを元に、アクセストークンを取得する
	$json = @file_get_contents( 'https://foursquare.com/oauth2/access_token?client_id=' . $consumer_key . '&client_secret=' . $consumer_secret . '&grant_type=authorization_code&redirect_uri=' . rawurlencode( $redirect_uri ) . '&code=' . $_GET['code'] ) ;

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

	// アクセストークンを[$access_token]に代入する
	$access_token = $obj->access_token ;

	// アクセストークンをブラウザに出力する
	echo $access_token ;

サンプルプログラム

アクセストークンを取得するための一連の流れをパッケージにしてみました。「とりあえずアクセストークンを取得する」という主旨で、最低限のエラー処理しかしていないため、動作確認や、カスタマイズ用としてお使いいただければ幸いです。

PHP

<?php

	// 設定
	$consumer_key = '' ;			// アプリケーションキー (Consumer Key)
	$consumer_secret = '' ;		// アプリケーションシークレット (Consumer Secret)
	$redirect_uri = '' ;		// リダイレクトURL (Redirect URI)

	// HTML用
	$html = '' ;

	// 見出し
	$html .= '<h2>実行結果</h2>' ;

	//「許可」して帰ってきた場合
	if( isset( $_GET['code'] ) && !empty( $_GET['code'] ) && is_string( $_GET['code'] ) )
	{
		// アクセストークンの取得に利用するコード
		$code = $_GET['code'] ;

		// リクエストURL
		$request_url = 'https://foursquare.com/oauth2/access_token?client_id=' . $consumer_key . '&client_secret=' . $consumer_secret . '&grant_type=authorization_code&redirect_uri=' . rawurlencode( $redirect_uri ) . '&code=' . $_GET['code'] ;

		// 受け取ったコードを元に、アクセストークンを取得する
		$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 ) ;

		// アクセストークンを取得できなかった場合
		if( !isset( $obj->access_token ) )
		{
			$error = 'アクセストークンを上手く取得することができませんでした…。' ;
		}
		else
		{
			// アクセストークンを[$access_token]に代入する
			$access_token = $obj->access_token ;

			// アクセストークンをブラウザに出力する
			$html .= '<p>取得したアクセストークンは、<b><mark>' . $access_token . '</mark></b>です。</p>' ;
		}
	}

	// 「拒否」して帰ってきた場合
	elseif( isset( $_GET['error'] ) )
	{
		// 「許可」してくれなかったことに文句を言う
		$error = 'なんで「許可」してくれなかったんですか!?' ;
	}

	// ユーザーを認証画面に移動させる
	else
	{
		header( 'Location: https://foursquare.com/oauth2/authenticate?client_id=' . $consumer_key . '&response_type=code&redirect_uri=' . rawurlencode( $redirect_uri ) ) ;
		exit ;
	}

	// エラー判定
	if( isset( $error ) && !empty( $error ) )
	{
		$html .= '<p><mark>' . $error . '</mark>もう一度、認証をするには、<a href="' . explode( '?' , $_SERVER['REQUEST_URI'] )[0] . '">こちら</a>をクリックして下さい。</p>' ;
	}
	else
	{
		// 取得したデータ
		$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>' ;

		// アプリケーション連携の解除
		$html .= '<h2>アプリケーション連携の解除</h2>' ;
		$html .= '<p>このアプリケーションとの連携は、下記設定ページで解除することができます。</p>' ;
		$html .= '<p><a href="https://ja.foursquare.com/settings/connections" target="_blank">https://ja.foursquare.com/settings/connections</a></p>' ;
	}

?>

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

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

共通パラメータ

Foursquareの各エンドポイントで指定することになる、基本的なパラメータについて、説明します。

oauth_token
アクセストークン。client_idclient_secretの代わりに指定可。プライベートなデータにアクセスしたり、パーソナライズされたデータを取得できます。
client_id
アプリケーションキー。client_secretとセットで指定します。アクセストークンの代わりに指定可。ただし、プライベートなデータにはアクセスできません。
client_secret
アプリケーションシークレット。client_idとセットで指定します。アクセストークンの代わりに指定可。ただし、プライベートなデータにはアクセスできません。
locale
ローカライズ。例えば、カテゴリー一覧情報を取得すると、データは全て英語になっています。これを日本語で取得したい場合は、ja(日本)を指定することになります。通常、日本で扱う場合はjaで問題ないでしょう。
m
モードを示します。foursquare、またはswarmを指定できます。エンドポイントによっては、データがFoursquareとSwarmで分かれていることがあり、どちらのデータを対象にするかを、このパラメータで指定することになります。
v
利用するFoursquare APIのバージョンをYYYYMMDD形式の日付で指定します。この日付は、「いつの時点のバージョンか?」を示します。通常は、APIを利用し始めた日時を指定します。例えば、Foursquare APIがバージョンアップし、仕様が変更されても、過去の日付を指定し、旧バージョンのAPIを利用していれば、突然、その仕様変更の影響を受けるといったことがないというわけです。仕様変更に対応した後に、このパラメータを更新すればスムーズでしょう。

アプリケーションキーとアクセストークン、どちらを指定する?

認証には、アプリケーションキー(client_idclient_secret)、またはアクセストークン(oauth_token)を指定することができます。ざっくり言うと、アプリケーションキーは「アプリケーション」として、アクセストークンは「ユーザー」として認証するもので、同じ種類のデータでも、取得できる内容が異なってきます。

例えば、プライベートモードのユーザーデータは、そのユーザーであることを示す本人のアクセストークンで認証しないと、取得することができません。また、アクセストークンを指定することで、そのユーザーにパーソナライズされたデータを取得することができます。逆に、パーソナライズされたくない場合は、アプリケーションで認証するのが良いでしょう。

色々と使い分けてリクエストすることで、「このリクエストにはこっち指定した方がいいな」という感覚が身に付くはずです。個々のユーザーにパーソナライズした情報を与えたいか、または万人が見る、情報が偏っていないデータベースのようなものを作りたいのか。あなたが作るウェブサービスの内容に合ったリクエストをして下さい。

ユーザープロフィールの取得

長い準備期間が終わり、羽ばたく時がやってきました。いよいよ、データを取得していきましょう。まずはユーザープロフィールを取得してみます。

エンドポイント

下記URLに、GETメソッドでリクエストを送って下さい。{ユーザーID}の部分には、プロフィールを取得したいユーザーのIDを指定します。指定したアクセストークンのユーザー自身のプロフィールを取得する場合は、selfで大丈夫です。

GET https://api.foursquare.com/v2/users/{ユーザーID}

パラメータ

特別なオプションパラメータはありません。共通パラメータのみ、指定して下さい。注意点として、認証はアクセストークン(oauth_token)が必要です。

取得できるJSON

リクエストに成功すると、下記内容のJSONを取得することができます。mプロパティにfoursquareswarmを指定した時で、それぞれ内包するデータが違います。例えば、チェックインの情報は、その機能があるswarmでしか取得できません。JSONの構造はシンプルなものの、内容は膨大です。response->userの中に、ユーザーに関するデータが含まれています。

[Foursquare]の場合

JSON

{"meta":{"code":200},"notifications":[{"type":"notificationTray","item":{"unreadCount":8}}],"response":{"user":{"id":"47258995","firstName":"Yuta","lastName":"Arai","gender":"male","followingRelationship":"self","photo":{"prefix":"https:\/\/irs0.4sqi.net\/img\/user\/","suffix":"\/-K32PNMWHMGKD3ZXD.jpg"},"birthday":381801600,"tips":{"count":11},"homeCity":"Tokyo","bio":"こんにちはー。","contact":{"email":"yuta.arai.0206@icloud.com","twitter":"arayutw"},"type":"user","lists":{"count":1,"groups":[{"type":"created","count":1,"items":[]},{"type":"followed","count":0,"items":[]},{"type":"yours","count":1,"items":[{"id":"47258995\/todos","name":"私の保存済みスポット","description":"","type":"todos","editable":false,"public":false,"collaborative":false,"url":"\/arayutw\/list\/todos","canonicalUrl":"https:\/\/foursquare.com\/arayutw\/list\/todos","followers":{"count":0},"listItems":{"count":1}}]}]},"blockedStatus":"none","createdAt":1359770479,"inbox":{"count":0,"items":[]},"saves":{"count":1,"items":[]},"followers":{"count":7,"groups":[{"type":"following","name":"Angeline、Sachiko、Hanaとまちゃぷる さんがフォローしています","count":4,"items":[{"id":"80367893","firstName":"Angeline","lastName":"Alexander","gender":"female","followingRelationship":"followingThem","photo":{"prefix":"https:\/\/irs1.4sqi.net\/img\/user\/","suffix":"\/80367893-GNNESPWV5CL3N1AX.jpg"},"tips":{"count":0},"homeCity":"","bio":"","contact":{}},{"id":"76481937","firstName":"Sachiko","lastName":"Yano","gender":"female","followingRelationship":"followingThem","photo":{"prefix":"https:\/\/irs2.4sqi.net\/img\/user\/","suffix":"\/blank_girl.png","default":true},"tips":{"count":0},"homeCity":"Itabashi-ku, Tokyo, Japan","bio":"","contact":{}},{"id":"96587117","firstName":"Hana","lastName":"Arai","gender":"male","followingRelationship":"followingThem","photo":{"prefix":"https:\/\/irs2.4sqi.net\/img\/user\/","suffix":"\/96587117-R2W4MN4AZYYTAYOK"},"tips":{"count":37},"homeCity":"Tokyo, Tōkyō","bio":"Syncerというブログを運営しています。\r\n写真は愛犬のハナといいます。","contact":{"twitter":"syncerjp"}}]}]},"following":{"count":6},"isAnonymous":false,"referralId":"u-47258995"}}}

[Swarm]の場合

JSON

{"meta":{"code":200},"notifications":[{"type":"notificationTray","item":{"unreadCount":73}}],"response":{"user":{"id":"47258995","firstName":"Yuta","lastName":"Arai","gender":"male","relationship":"self","photo":{"prefix":"https:\/\/irs0.4sqi.net\/img\/user\/","suffix":"\/-K32PNMWHMGKD3ZXD.jpg"},"friends":{"count":3,"groups":[{"type":"friends","name":"共通の友達","count":0,"items":[]},{"type":"others","name":"他の友達","count":3,"items":[{"id":"96587117","firstName":"Hana","lastName":"Arai","gender":"male","relationship":"friend","photo":{"prefix":"https:\/\/irs2.4sqi.net\/img\/user\/","suffix":"\/96587117-R2W4MN4AZYYTAYOK"},"tips":{"count":37},"lists":{"groups":[{"type":"created","count":1,"items":[]}]},"homeCity":"Tokyo, Tōkyō","bio":"Syncerというブログを運営しています。\r\n写真は愛犬のハナといいます。","contact":{"email":"sns@syncer.jp","twitter":"syncerjp"}},{"id":"29538664","firstName":"まちゃぷる","gender":"male","relationship":"friend","photo":{"prefix":"https:\/\/irs2.4sqi.net\/img\/user\/","suffix":"\/29538664-HS4ETE5CYBVNWS4W.jpg"},"tips":{"count":0},"lists":{"groups":[{"type":"created","count":1,"items":[]}]},"homeCity":"東京","bio":"","contact":{"twitter":"i_machapple","facebook":"100001910752764"}},{"id":"80367893","firstName":"Angeline","lastName":"Alexander","gender":"female","relationship":"friend","photo":{"prefix":"https:\/\/irs1.4sqi.net\/img\/user\/","suffix":"\/80367893-GNNESPWV5CL3N1AX.jpg"},"tips":{"count":0},"lists":{"groups":[{"type":"created","count":1,"items":[]}]},"homeCity":"","bio":"","contact":{"email":"makenziewhitep45@live.com"}}]}]},"birthday":381801600,"canMessage":false,"tips":{"count":11},"homeCity":"Tokyo","bio":"こんにちはー。","contact":{"email":"yuta.arai.0206@icloud.com","twitter":"arayutw"},"checkinPings":"off","type":"user","checkins":{"count":1170,"items":[{"id":"5500fe62498e3f283e8bd3e5","createdAt":1426128482,"type":"checkin","shout":"チェックインしてみました。","timeZoneOffset":540,"displayGeo":{"id":"10004267","name":"日本足立区"},"exactContextLine":"日本東京都足立区","venue":{"id":"4b5d8bf7f964a520036129e3","name":"足立区生物園","contact":{"phone":"0338845577","formattedPhone":"03-3884-5577"},"location":{"address":"保木間2-17","crossStreet":"足立区","lat":35.792423028046535,"lng":139.80699062347412,"cc":"JP","city":"足立区","state":"東京都","country":"日本","formattedAddress":["保木間2-17 (足立区)","足立区, 東京都"]},"categories":[{"id":"4bf58dd8d48988d162941735","name":"その他の素晴らしいアウトドア","pluralName":"その他の素晴らしいアウトドア","shortName":"その他のアウトドア","icon":{"prefix":"https:\/\/ss3.4sqi.net\/img\/categories_v2\/parks_outdoors\/outdoors_","suffix":".png"},"primary":true}],"verified":false,"stats":{"checkinsCount":261,"usersCount":163,"tipCount":2},"url":"http:\/\/www1.adachi.ne.jp\/seibutu\/","like":false},"likes":{"count":0,"groups":[]},"like":false,"isMayor":false,"photos":{"count":0,"items":[]},"posts":{"count":0,"textCount":0},"comments":{"count":0},"source":{"name":"Syncer","url":"http:\/\/syncer.jp"},"score":{"total":0,"scores":[]}}]},"requests":{"count":3},"photos":{"count":201,"items":[{"id":"54473968498eb0e3bb98e1df","createdAt":1413953896,"source":{"name":"Swarm for iOS","url":"https:\/\/www.swarmapp.com"},"prefix":"https:\/\/irs0.4sqi.net\/img\/general\/","suffix":"\/47258995_UVAOb3oLn887wOEhjseszH1HBQHxhv_Kj64BY4ubhrc.jpg","width":960,"height":720,"visibility":"public","venue":{"id":"53843be7498e69141395c41e","name":"ブロンコビリー 北綾瀬店","contact":{"phone":"0356979129","formattedPhone":"03-5697-9129"},"location":{"address":"谷中2-5-4","lat":35.777175647414644,"lng":139.83084767224423,"postalCode":"120-0006","cc":"JP","city":"足立区","state":"東京都","country":"日本","formattedAddress":["谷中2-5-4","足立区, 東京都","120-0006"]},"categories":[{"id":"4bf58dd8d48988d1cc941735","name":"ステーキハウス","pluralName":"ステーキハウス","shortName":"ステーキハウス","icon":{"prefix":"https:\/\/ss3.4sqi.net\/img\/categories_v2\/food\/steakhouse_","suffix":".png"},"primary":true}],"verified":false,"stats":{"checkinsCount":122,"usersCount":69,"tipCount":0},"url":"http:\/\/www.bronco.co.jp\/shop\/tokyo\/kita_ayase_grand\/","like":false},"checkin":{"id":"54473966498e4d6f3e7ad0ad","createdAt":1413953894,"type":"checkin","timeZoneOffset":540,"displayGeo":{"id":"10004267","name":"日本足立区"},"exactContextLine":"日本東京都足立区"}}]},"createdAt":1359770479,"referralId":"u-47258995"}}}

各プロパティの説明

JSONの主な項目の説明は下記の通りです。

id
ユーザーID
firstName
ファーストネーム。
lastName
ラストネーム。
gender
性別。
photo
ユーザーのアイコン画像のURL情報。
friends
フレンドの情報。
tips
このユーザーが投稿したTIPSの情報。
homeCity
居住地、活動地。
bio
プロフィール紹介文。
contact
メールアドレスなどの情報。ユーザーIDにselfを指定した場合にのみ、取得可。
badges
バッジに関する情報。
mayorships
メイヤーに関する情報。
checkins
チェックインに関する情報。
lists
リストに関する情報。
photos
投稿写真に関する情報。
createAt
アカウント作成日のUNIX TIMESTAMP。ユーザーIDにselfを指定した場合にのみ、取得可。

サンプルプログラム

下記が、swarmのユーザープロフィールを取得するサンプルプログラムです。サンプルデモでは、あなた自身のユーザーデータを利用するため、アプリケーション連携が必要です。

PHP

<?php

	// アクセストークン
	$access_token = '' ;

	// 設定項目
	$params = array(
		'oauth_token' => $access_token ,	// アクセストークン
		'locale' => 'ja' ,	// ローカライズ
		'm' => 'swarm' ,	// モード (foursquare OR swarm)
		'v' => '20150801' ,	// バージョン
	) ;

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

	// リクエストURL
	$request_url = 'https://api.foursquare.com/v2/users/self' . '?' . http_build_query( $params ) ;

	// 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_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>' ;

	// エラー判定
	if( !$obj || !isset($obj->meta->code) || $obj->meta->code != 200 )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		// エイリアス
		$item = $obj->response->user ;

		// 各データの整理
		$id = $item->id ;		// ユーザーID
		$firstName = $item->firstName ;		// ユーザー名 (ファーストネーム)
		$bio = ( isset( $item->bio ) ) ? $item->bio : '' ;		// 紹介文
		$profile_picture = $item->photo->prefix . '150x150' . $item->photo->suffix ;		// アイコン画像
		$checkins = ( isset($item->checkins->count) ) ? $item->checkins->count : 0 ;		// チェックイン数

		// ブラウザに出力
		$html .= '<dl>' ;
		$html .= 	'<dt>ユーザーID</dt>' ;
		$html .= 		'<dd><a href="https://ja.foursquare.com/u/' . $id . '" target="_blank">' . $id . '</a></dd>' ;
		$html .= 	'<dt>ユーザー名</dt>' ;
		$html .= 		'<dd>' . $firstName . '</dd>' ;

		// 紹介文
		if( $bio )
		{
			$html .= 	'<dt>紹介文</dt>' ;
			$html .= 		'<dd>' . $bio . '</dd>' ;
		}

		// アイコン画像
		if( $profile_picture )
		{
			$html .= 	'<dt>アイコン画像</dt>' ;
			$html .= 		'<dd><img class="_img" src="' . $profile_picture . '" width="75" height="75"></dd>' ;
		}

		$html .= 	'<dt>チェックイン数</dt>' ;
		$html .= 		'<dd>' . number_format( $checkins ) . '</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>' ;

	// アプリケーション連携の解除
	$html .= '<h2>アプリケーション連携の解除</h2>' ;
	$html .= '<p>このアプリケーションとの連携は、下記設定ページで解除することができます。</p>' ;
	$html .= '<p><a href="https://ja.foursquare.com/settings/connections" target="_blank">https://ja.foursquare.com/settings/connections</a></p>' ;

?>

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

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

チェックイン情報の取得

Foursquare APIを利用して、ユーザーのこれまでのチェックイン情報を取得する方法を説明します。2015年9月現在、自分自身以外のチェックイン情報を取得することはできないようです。

エンドポイント

下記URLに、GETメソッドでリクエストを送って下さい。

GET https://api.foursquare.com/v2/users/self/checkins

パラメータ

下記がオプションパラメータです。注意点として、認証はアクセストークン(oauth_token)が必要で、モードはswarmのみがサポートされています。

limit
取得件数。最大値は100
offset
オフセット件数。
sort
データの並び順。
newestfirst … 日時が新しい順。
oldestfirst … 日時が古い順。
afterTimestamp
UNIX TIMESTAMPで日時を指定すると、それより未来のデータのみを取得する。
beforeTimestamp
UNIX TIMESTAMPで日時を指定すると、それより過去のデータのみを取得する。

取得できるJSON

リクエスト成功時に取得できるJSONのサンプルです。2件分のチェックインを取得したものです。checkins->itemsに配列形式で、取得件数分のチェックインデータが含まれています。

JSON

{"meta":{"code":200},"notifications":[{"type":"notificationTray","item":{"unreadCount":73}}],"response":{"checkins":{"count":1170,"items":[{"id":"510dffa1e4b0898fb566150e","createdAt":1359871905,"type":"checkin","shout":"チェックインしてみました〜。","timeZoneOffset":540,"displayGeo":{"id":"72057594039792465","name":"日本千代田区"},"exactContextLine":"日本東京都千代田区","venue":{"id":"4ba775c5f964a5209d9539e3","name":"肉の万世 秋葉原本店","contact":{"phone":"0332510291","formattedPhone":"03-3251-0291"},"location":{"address":"神田須田町2-21","crossStreet":"肉の万世 秋葉原本店 2F","lat":35.69651044234547,"lng":139.77115094661713,"postalCode":"101-0041","cc":"JP","city":"千代田区","state":"東京都","country":"日本","formattedAddress":["神田須田町2-21 (肉の万世 秋葉原本店 2F)","千代田区, 東京都","101-0041"]},"categories":[{"id":"4bf58dd8d48988d1cc941735","name":"ステーキハウス","pluralName":"ステーキハウス","shortName":"ステーキハウス","icon":{"prefix":"https:\/\/ss3.4sqi.net\/img\/categories_v2\/food\/steakhouse_","suffix":".png"},"primary":true}],"verified":false,"stats":{"checkinsCount":8251,"usersCount":4885,"tipCount":39},"url":"http:\/\/www.niku-mansei.com\/contents\/02honten\/02honten01.html","like":false},"likes":{"count":0,"groups":[]},"like":false,"isMayor":false,"photos":{"count":1,"items":[{"id":"510dffa6e4b0bb3c64531ef9","createdAt":1359871910,"source":{"name":"Foursquare for iOS","url":"https:\/\/foursquare.com\/download\/#\/iphone"},"prefix":"https:\/\/irs1.4sqi.net\/img\/general\/","suffix":"\/47258995_pV2QakMrCtUgkJNs3xD_oUOu1p_7Z-eDnO7wzDxDa04.jpg","width":960,"height":720,"user":{"id":"47258995","firstName":"Yuta","lastName":"Arai","gender":"male","relationship":"self","photo":{"prefix":"https:\/\/irs0.4sqi.net\/img\/user\/","suffix":"\/-K32PNMWHMGKD3ZXD.jpg"}},"visibility":"public"}]},"posts":{"count":0,"textCount":0},"comments":{"count":0},"source":{"name":"Foursquare for iOS","url":"https:\/\/foursquare.com\/download\/#\/iphone"},"score":{"total":0,"scores":[]}},{"id":"510dfff9e4b0eaed1d4b6cd1","createdAt":1359871993,"type":"checkin","timeZoneOffset":540,"displayGeo":{"id":"72057594039792465","name":"日本千代田区"},"exactContextLine":"日本東京都千代田区","venue":{"id":"4d3baa05cc4c594190f81be6","name":"秋葉原 歩行者天国","contact":{"phone":"0332570110","formattedPhone":"03-3257-0110"},"location":{"address":"外神田","crossStreet":"中央通り","lat":35.70027876573162,"lng":139.7714138031006,"postalCode":"101-0021","cc":"JP","city":"千代田区","state":"東京都","country":"日本","formattedAddress":["外神田 (中央通り)","千代田区, 東京都","101-0021"]},"categories":[{"id":"52e81612bcbc57f1066b7a25","name":"歩行者天国","pluralName":"歩行者天国","shortName":"歩行者天国","icon":{"prefix":"https:\/\/ss3.4sqi.net\/img\/categories_v2\/parks_outdoors\/default_","suffix":".png"},"primary":true}],"verified":false,"stats":{"checkinsCount":1940,"usersCount":791,"tipCount":3},"like":false},"likes":{"count":0,"groups":[]},"like":false,"isMayor":false,"photos":{"count":1,"items":[{"id":"510dfffce4b0eaed1d4b7d68","createdAt":1359871996,"source":{"name":"Foursquare for iOS","url":"https:\/\/foursquare.com\/download\/#\/iphone"},"prefix":"https:\/\/irs3.4sqi.net\/img\/general\/","suffix":"\/47258995_o34QOiTcMByrDYOSkQsDg7zJI1srhB99JcCvtSF1NTA.jpg","width":960,"height":720,"user":{"id":"47258995","firstName":"Yuta","lastName":"Arai","gender":"male","relationship":"self","photo":{"prefix":"https:\/\/irs0.4sqi.net\/img\/user\/","suffix":"\/-K32PNMWHMGKD3ZXD.jpg"}},"visibility":"public"}]},"posts":{"count":0,"textCount":0},"comments":{"count":0},"source":{"name":"Foursquare for iOS","url":"https:\/\/foursquare.com\/download\/#\/iphone"},"score":{"total":0,"scores":[]}}]}}}

各プロパティの説明

JSONの主な項目の説明は下記の通りです。

id
チェックインID
createdAt
チェックインをした日時。
shout
チェックインのコメント。コメントをしていない場合、プロパティ自体が存在しないので注意。
venue
チェックインをした施設の情報。
likes
チェックインに付いたライクの情報。
sticker
ステッカーの情報。
photos
チェックインに添付した写真の情報。
comments
チェックインに付いたフレンドなどからのコメントの情報。
source
チェックインをしたアプリケーション。

サンプルプログラム

この章で説明した内容を踏まえた、ユーザーの、今までのチェックインリストを取得するサンプルプログラムです。例によって、エラー処理は最低限です。デモはあなた自身のチェックインリストを取得し、表示します。閲覧にはアプリケーションの連携が必要です。ご利用後は、アプリケーションの連携を解除して下さい。

PHP

<?php

	// アクセストークン
	$access_token = '' ;

	// 設定項目
	$params = array(
		'oauth_token' => $access_token ,	// アクセストークン
		'locale' => 'ja' ,	// ローカライズ
		'm' => 'swarm' ,	// モード (foursquare OR swarm)
		'v' => '20150801' ,	// バージョン
		'limit' => '50' ,	// 取得件数
//		'sort' => 'oldestfirst' ,	// ソート
	) ;

	// GETメソッドで指定がある場合
	foreach( array( 'locale' , 'm' , 'limit' , 'sort' , 'afterTimestamp' , 'beforeTimestamp' ) as $val )
	{
		if( isset( $_GET[ $val ] ) && $_GET[ $val ] != '' )
		{
			$params[ $val ] = $_GET[ $val ] ;
		}
	}

	// リクエストURL
	$request_url = 'https://api.foursquare.com/v2/users/self/checkins' . '?' . http_build_query( $params ) ;

	// 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_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>' ;

	// エラー判定
	if( !$obj || !isset($obj->meta->code) || $obj->meta->code != 200 )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		// 説明
		$html .= '<p>チェックイン総数は<b>' . $obj->response->checkins->count . '</b>件です。</p>' ;

		foreach( $obj->response->checkins->items as $item )
		{
			// 各データの整理
			$id = $item->id ;		// チェックインID
			$venue_id = $item->venue->id ;		// ベニューのID
			$venue_name = $item->venue->name ;		// ベニューの名前
			$createdAt = $item->createdAt + $item->timeZoneOffset ;		// チェックイン日時(オフセットと合わせる)
			$source_name = $item->source->name ;		// チェックインしたサービス
			$shout = ( isset($item->shout) ) ? $item->shout : '' ;		// コメント

			// 日時の整形
			$createdAt = date( 'Y/m/d H:i' , $createdAt ) ;

			// ブラウザに出力
			$html .= '<dl>' ;
			$html .= 	'<dt>チェックインID</dt>' ;
			$html .= 		'<dd>' . $id . '</dd>' ;
			$html .= 	'<dt>ベニュー名</dt>' ;
			$html .= 		'<dd>' . $venue_name . '</dd>' ;
			$html .= 	'<dt>ベニューID</dt>' ;
			$html .= 		'<dd><a href="https://ja.foursquare.com/v/' . $venue_id . '" target="_blank">' . $venue_id . '</a></dd>' ;

			// コメント
			if( $shout )
			{
				$html .= 	'<dt>コメント</dt>' ;
				$html .= 		'<dd>' . $shout . '</dd>' ;
			}

			$html .= 	'<dt>投稿日時</dt>' ;
			$html .= 		'<dd>' . $createdAt . '</dd>' ;
			$html .= 	'<dt>ソース</dt>' ;
			$html .= 		'<dd>' . $source_name . '</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>' ;

	// アプリケーション連携の解除
	$html .= '<h2>アプリケーション連携の解除</h2>' ;
	$html .= '<p>このアプリケーションとの連携は、下記設定ページで解除することができます。</p>' ;
	$html .= '<p><a href="https://ja.foursquare.com/settings/connections" target="_blank">https://ja.foursquare.com/settings/connections</a></p>' ;

?>

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

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

チェックインをする

この章では、Foursquare APIを利用して、チェックインを行なう方法を説明します。

エンドポイント

下記URLに、POSTメソッドでリクエストを送って下さい。

POST https://api.foursquare.com/v2/checkins/add

パラメータ

下記が主なオプションパラメータです。認証はアクセストークン(oauth_token)のみで、モードはswarmのみがサポートされています。

venueId
チェックインをするベニューIDを指定。
shout
チェックインのコメント。
broadcast
チェックインの通知。複数指定する場合は、半角カンマ(,)を利用する。
private … 非公開のチェックイン。
public … 公開のチェックイン。
facebook … Facebookにシェアする。
twitter … Twitterにシェアする。
ll
チェックインをする時の位置座標(緯度,経度)。チェックイン対象はベニューIDで指定するため、この項目は必須ではない。

取得できるJSON

リクエストが通り、チェックインに成功した時に、返り値として取得できるJSONデータのサンプルです。response->checkinプロパティ内に、チェックインしたベニューの情報が含まれているので、「〜にチェックインしました」というような結果表示に利用することができますね。

JSON

{"meta":{"code":200},"notifications":[{"type":"notificationTray","item":{"unreadCount":73}}],"response":{"checkin":{"id":"55bd91f9498ee4fdcf63ca49","createdAt":1438487033,"type":"checkin","shout":"チェックインをしてみました。","timeZoneOffset":540,"displayGeo":{"id":"10004267","name":"Adachi, Japan"},"exactContextLine":"Adachi, Tōkyō, Japan","user":{"id":"47258995","firstName":"Yuta","lastName":"Arai","gender":"male","relationship":"self","photo":{"prefix":"https:\/\/irs0.4sqi.net\/img\/user\/","suffix":"\/-K32PNMWHMGKD3ZXD.jpg"}},"venue":{"id":"4b5d8bf7f964a520036129e3","name":"足立区生物園","contact":{"phone":"0338845577","formattedPhone":"03-3884-5577"},"location":{"address":"保木間2-17","crossStreet":"足立区","lat":35.792423028046535,"lng":139.80699062347412,"cc":"JP","city":"足立区","state":"東京都","country":"日本","formattedAddress":["保木間2-17 (足立区)","足立区, 東京都"]},"categories":[{"id":"4bf58dd8d48988d162941735","name":"Other Great Outdoors","pluralName":"Other Great Outdoors","shortName":"Other Outdoors","icon":{"prefix":"https:\/\/ss3.4sqi.net\/img\/categories_v2\/parks_outdoors\/outdoors_","suffix":".png"},"primary":true}],"verified":false,"stats":{"checkinsCount":261,"usersCount":163,"tipCount":2},"url":"http:\/\/www1.adachi.ne.jp\/seibutu\/","hereNow":{"count":0,"summary":"Nobody here","groups":[]},"reasons":{"count":1,"items":[{"summary":"You're here! +6 points","type":"general","reasonName":"hereNowReason","target":{"type":"navigation","object":{"id":"55bd91f9498ee4fdcf63caab","type":"checkinDetail","target":{"type":"path","url":"\/checkins\/55bd91f9498ee4fdcf63ca49"},"ignorable":false}}}]},"saves":{"count":0,"groups":[]}},"source":{"name":"Syncer API Demo","url":"https:\/\/syncer.jp\/foursquare-api-matome"},"photos":{"count":0,"items":[]},"posts":{"count":0,"textCount":0},"likes":{"count":0,"groups":[]},"like":false,"comments":{"count":0,"items":[]},"isMayor":false,"score":{"total":6,"scores":[{"icon":"https:\/\/ss1.4sqi.net\/img\/points\/swarm-discoveryvenue.png","target":{"type":"path","object":{"url":"\/users\/self\/historysearch?venueIds=4b5d8bf7f964a520036129e3&displayText=%E8%B6%B3%E7%AB%8B%E5%8C%BA%E7%94%9F%E7%89%A9%E5%9C%92"}},"message":"Welcome back! You haven't been to 足立区生物園 since March.","points":2},{"icon":"https:\/\/ss1.4sqi.net\/img\/points\/swarm-discoveryvenue.png","message":"Back in Japan","points":2},{"icon":"https:\/\/ss1.4sqi.net\/img\/points\/swarm-mayor.png","message":"Tied with Isao Fukuhara for the Mayorship at 足立区生物園.","points":2}]}},"notifications":[{"type":"insights","item":{"insights":{"count":1,"items":[{"type":"pointsReward","image":"https:\/\/ss1.4sqi.net\/img\/points\/swarm-discoveryvenue_144.png","title":"Welcome back! You haven't been to 足立区生物園 since March.","summary":"Welcome back! You haven't been to 足立区生物園 since March.","shareable":false,"points":{"image":{"prefix":"https:\/\/ss1.4sqi.net\/img\/points\/swarm-discoveryvenue_","sizes":[44,60,120],"name":".png"},"target":{"type":"path","object":{"url":"\/users\/self\/historysearch?venueIds=4b5d8bf7f964a520036129e3&displayText=%E8%B6%B3%E7%AB%8B%E5%8C%BA%E7%94%9F%E7%89%A9%E5%9C%92"}},"message":"Welcome back! You haven't been to 足立区生物園 since March.","points":2}}]}},"alert":true}],"notificationsOrder":["special","score","leaderboard","replies"]}}

サンプルプログラム

指定したベニューIDにチェックイン処理を行なうサンプルプログラムです。動作確認用にお使い下さい。実際にあなたのFoursquare(Swarm)アカウントで、「足立区生物園」に「チェックインしてみました〜」というコメント付きでチェックインを行ないます。確認後は、Swarmのアプリからチェックインを削除して下さい。また、アプリケーションの連携を解除して下さい。

PHP

<?php

	// アクセストークン
	$access_token = '' ;

	// 設定項目
	$params = array(
		'oauth_token' => $access_token ,	// アクセストークン
		'locale' => 'ja' ,	// ローカライズ
		'm' => 'swarm' ,	// モード (foursquare OR swarm)
		'v' => '20150801' ,	// バージョン
		'venueId' => '4b5d8bf7f964a520036129e3' ,	// ベニューID
		'shout' => 'チェックインをしてみました。' ,	// コメント
	) ;

	// リクエストURL
	$request_url = 'https://api.foursquare.com/v2/checkins/add' ;

	// cURLでリクエスト
	$curl = curl_init() ;
	curl_setopt( $curl , CURLOPT_URL , $request_url ) ;
	curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , 'POST' ) ;
	curl_setopt( $curl , CURLOPT_HEADER, 1 ) ; 
	curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ;
	curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ;
	curl_setopt( $curl , CURLOPT_POSTFIELDS , http_build_query( $params ) ) ;
	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>' ;

	// エラー判定
	if( !$obj || !isset($obj->meta->code) || $obj->meta->code != 200 )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		// 説明
		$html .= '<p>チェックインに成功しました。</p>' ;

		// エイリアス
		$item = $obj->response->checkin ;

		// 各データの整理
		$id = $item->id ;		// チェックインID
		$venue_id = $item->venue->id ;		// ベニューのID
		$venue_name = $item->venue->name ;		// ベニューの名前
		$createdAt = $item->createdAt + $item->timeZoneOffset ;		// チェックイン日時(オフセットと合わせる)
		$source_name = $item->source->name ;		// チェックインしたサービス
		$shout = ( isset($item->shout) ) ? $item->shout : '' ;		// コメント

		// 日時の整形
		$createdAt = date( 'Y/m/d H:i' , $createdAt ) ;

		// ブラウザに出力
		$html .= '<dl>' ;
		$html .= 	'<dt>チェックインID</dt>' ;
		$html .= 		'<dd>' . $id . '</dd>' ;
		$html .= 	'<dt>ベニュー名</dt>' ;
		$html .= 		'<dd>' . $venue_name . '</dd>' ;
		$html .= 	'<dt>ベニューID</dt>' ;
		$html .= 		'<dd><a href="https://ja.foursquare.com/v/' . $venue_id . '" target="_blank">' . $venue_id . '</a></dd>' ;

		// コメント
		if( $shout )
		{
			$html .= 	'<dt>コメント</dt>' ;
			$html .= 		'<dd>' . $shout . '</dd>' ;
		}

		$html .= 	'<dt>投稿日時</dt>' ;
		$html .= 		'<dd>' . $createdAt . '</dd>' ;
		$html .= 	'<dt>ソース</dt>' ;
		$html .= 		'<dd>' . $source_name . '</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>' ;

	// アプリケーション連携の解除
	$html .= '<h2>アプリケーション連携の解除</h2>' ;
	$html .= '<p>このアプリケーションとの連携は、下記設定ページで解除することができます。</p>' ;
	$html .= '<p><a href="https://ja.foursquare.com/settings/connections" target="_blank">https://ja.foursquare.com/settings/connections</a></p>' ;

?>

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

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

ベニュー情報の取得

ベニューIDを指定して、そのベニューに関する情報、投稿された写真、クチコミを取得してみましょう。

エンドポイント

下記URLに、GETメソッドでリクエストを送って下さい。

GET https://api.foursquare.com/v2/venues/{ベニューID}

ベニューIDは、Foursquareのウェブサイト内の、各施設の専用ページのURLアドレスで確認することができます。下記、4b5649b2f964a520640928e3の部分がベニューIDです。

https://ja.foursquare.com/v/竹ノ塚駅-takenotsuka-sta/4b5649b2f964a520640928e3 リンク

パラメータ

オプションパラメータはありません。

取得できるJSON

リクエスト成功時に取得できるJSONのサンプルです。「舎人公園」の情報を、アクセストークンを利用して取得したものです。写真、クチコミを含めて、一通りの情報が含まれた膨大な内容となっています。登録されていないデータは、空ではなく、存在自体がないなど、包括した処理を作りにくいのが難点です。アクセストークンで認証をした場合、通常よりも、自分に関連する、より多くのデータを取得することができます。

JSON

{"meta":{"code":200},"notifications":[{"type":"notificationTray","item":{"unreadCount":73}}],"response":{"venue":{"id":"4b5bb91cf964a520451229e3","name":"舎人公園","contact":{"phone":"0338572308","formattedPhone":"03-3857-2308"},"location":{"address":"舎人公園1-1","lat":35.798075166117705,"lng":139.7717497497797,"postalCode":"121-0837","cc":"JP","city":"足立区","state":"東京都","country":"日本","formattedAddress":["舎人公園1-1","足立区, 東京都","121-0837"]},"canonicalUrl":"https:\/\/foursquare.com\/v\/%E8%88%8E%E4%BA%BA%E5%85%AC%E5%9C%92\/4b5bb91cf964a520451229e3","categories":[{"id":"4bf58dd8d48988d163941735","name":"公園","pluralName":"公園","shortName":"公園","icon":{"prefix":"https:\/\/ss3.4sqi.net\/img\/categories_v2\/parks_outdoors\/park_","suffix":".png"},"primary":true},{"id":"4bf58dd8d48988d1e7941735","name":"遊び場","pluralName":"遊び場","shortName":"遊び場","icon":{"prefix":"https:\/\/ss3.4sqi.net\/img\/categories_v2\/parks_outdoors\/playground_","suffix":".png"}},{"id":"4bf58dd8d48988d161941735","name":"湖沼","pluralName":"湖沼","shortName":"湖沼","icon":{"prefix":"https:\/\/ss3.4sqi.net\/img\/categories_v2\/parks_outdoors\/lake_","suffix":".png"}}],"verified":false,"stats":{"checkinsCount":3534,"usersCount":1496,"tipCount":20,"visitsCount":3534},"likes":{"count":17,"groups":[{"type":"others","count":17,"items":[]}],"summary":"17人がお気に入り"},"like":false,"dislike":false,"ok":false,"rating":7.7,"ratingColor":"C5DE35","ratingSignals":23,"friendVisits":{"count":1,"summary":"あなたはここに来ました","items":[{"visitedCount":8,"liked":false,"disliked":false,"oked":false,"user":{"id":"47258995","firstName":"Yuta","lastName":"Arai","gender":"male","relationship":"self","photo":{"prefix":"https:\/\/irs0.4sqi.net\/img\/user\/","suffix":"\/-K32PNMWHMGKD3ZXD.jpg"}}}]},"beenHere":{"count":8,"lastVisitedAt":1399561853},"specials":{"count":0,"items":[]},"photos":{"count":359,"groups":[{"type":"venue","name":"スポットの写真","count":359,"items":[{"id":"50c82f09e4b04f4ed29ec391","createdAt":1355296521,"source":{"name":"Foursquare for iOS","url":"https:\/\/foursquare.com\/download\/#\/iphone"},"prefix":"https:\/\/irs0.4sqi.net\/img\/general\/","suffix":"\/39554506_BGp65HM1csjyLjVsbp2yeRQwwk6QEAqiTfH2KXYE-9s.jpg","width":720,"height":540,"user":{"id":"39554506","firstName":"Miki","lastName":"S.","gender":"female","photo":{"prefix":"https:\/\/irs2.4sqi.net\/img\/user\/","suffix":"\/JY2NSX5OYWOWAOKP.jpg"}},"visibility":"public"},{"id":"4e633c3d62e13e3bcefd14e6","createdAt":1315126333,"source":{"name":"Foursquare for Android","url":"https:\/\/foursquare.com\/download\/#\/android"},"prefix":"https:\/\/irs2.4sqi.net\/img\/general\/","suffix":"\/3ZSS3UWBVGD2ADTH1FEKH412D4YINF30PST0ATBAADR2ZXF4.jpg","width":720,"height":540,"user":{"id":"8661096","firstName":"ktm","lastName":"hr","gender":"male","photo":{"prefix":"https:\/\/irs0.4sqi.net\/img\/user\/","suffix":"\/0BJXXJOCBH0AAWJD.jpg"}},"visibility":"public"},{"id":"51e38550498e3b6966e3da05","createdAt":1373865296,"source":{"name":"Foursquare for Android","url":"https:\/\/foursquare.com\/download\/#\/android"},"prefix":"https:\/\/irs3.4sqi.net\/img\/general\/","suffix":"\/251442_sGdECeDEqd4uUfMM_nMj-cwJ2sPs2W0mNunN9ktCsSw.jpg","width":960,"height":720,"user":{"id":"251442","firstName":"Yusuke","lastName":"Aoki","gender":"male","photo":{"prefix":"https:\/\/irs3.4sqi.net\/img\/user\/","suffix":"\/GI2H5DDXMR4H14N3.jpg"}},"visibility":"public"},{"id":"5185bd9c498e6db43001fa19","createdAt":1367719324,"source":{"name":"Foursquare for iOS","url":"https:\/\/foursquare.com\/download\/#\/iphone"},"prefix":"https:\/\/irs3.4sqi.net\/img\/general\/","suffix":"\/1427480_tbeEa1-3vsN9P9PaYVSDu2hXbSbuvCM48z1ei3OGvH4.jpg","width":1440,"height":1920,"user":{"id":"1427480","firstName":"S","lastName":"Yagyu","gender":"male","photo":{"prefix":"https:\/\/irs1.4sqi.net\/img\/user\/","suffix":"\/0BDFHNECJ0F4JS3L.jpg"}},"visibility":"public"},{"id":"51172632e4b0502d5d0a3a40","createdAt":1360471602,"source":{"name":"Instagram","url":"http:\/\/instagram.com"},"prefix":"https:\/\/irs0.4sqi.net\/img\/general\/","suffix":"\/5575783_qurtiD6iweOd0Gw-5FumddltASbKcHeDf37Sjd7nv04.jpg","width":612,"height":612,"user":{"id":"5575783","firstName":"takamasa","lastName":"ishii","gender":"male","photo":{"prefix":"https:\/\/irs2.4sqi.net\/img\/user\/","suffix":"\/O020FD433JZZ1YHD.jpg"}},"visibility":"public"},{"id":"51a968b6498ec8aca3f423fe","createdAt":1370056886,"source":{"name":"Foursquare for Android","url":"https:\/\/foursquare.com\/download\/#\/android"},"prefix":"https:\/\/irs0.4sqi.net\/img\/general\/","suffix":"\/11229367_4SGx_FFyg0Y2U0_xW6c_e3wxSjAcyAKgMR6gSQjosj8.jpg","width":960,"height":541,"user":{"id":"11229367","firstName":"yukiko","lastName":"bass","gender":"female","photo":{"prefix":"https:\/\/irs2.4sqi.net\/img\/user\/","suffix":"\/RV55FRB2A2PPVCYN.jpg"}},"visibility":"public"}]}]},"hereNow":{"count":0,"summary":"誰もいません","groups":[]},"reasons":{"count":1,"items":[{"summary":"ここに8回来たことがあります","type":"social","reasonName":"friendAndSelfCheckinReason","target":{"type":"navigation","object":{"id":"55bd96f3498e25bcb1626309","type":"social","target":{"type":"path","url":"\/venues\/4b5bb91cf964a520451229e3\/social"},"ignorable":false}},"count":0}]},"createdAt":1264302364,"tips":{"count":20,"groups":[{"type":"following","name":"あなたがフォローしている人たちのTip","count":0,"items":[]},{"type":"others","name":"すべての Tip","count":20,"items":[{"id":"5185d659498e846a211be824","createdAt":1367725657,"text":"めちゃくちゃ広い!都内の端っこ!!","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/5185d659498e846a211be824","photo":{"id":"5185d65d498e3f3ffd6d8b35","createdAt":1367725661,"source":{"name":"Foursquare for Android","url":"https:\/\/foursquare.com\/download\/#\/android"},"prefix":"https:\/\/irs0.4sqi.net\/img\/general\/","suffix":"\/9257157_-Ui_vORcFBEsK5gnFGDj2weBgWmuKlJGtZVQR9jhVz4.jpg","width":540,"height":960},"photourl":"https:\/\/irs0.4sqi.net\/img\/general\/original\/9257157_-Ui_vORcFBEsK5gnFGDj2weBgWmuKlJGtZVQR9jhVz4.jpg","likes":{"count":1,"groups":[{"type":"others","count":1,"items":[{"id":"86483116","firstName":"電気あんまん","gender":"male","photo":{"prefix":"https:\/\/irs2.4sqi.net\/img\/user\/","suffix":"\/86483116-L5BXB3ZHQI0PMZ4P.jpg"}}]}],"summary":"1 人が「いいね!」と言っています"},"like":false,"logView":true,"todo":{"count":0},"user":{"id":"9257157","firstName":"我輩","lastName":"♥","gender":"none","photo":{"prefix":"https:\/\/irs2.4sqi.net\/img\/user\/","suffix":"\/9257157-4MOIUN3ZLTRSKWHJ.jpg"}}},{"id":"4c32f336452620a124d0220f","createdAt":1278407478,"text":"施設も充実していて、余り混まない。日曜日は駐車場の空き待ちになる","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/4c32f336452620a124d0220f","likes":{"count":1,"groups":[{"type":"others","count":1,"items":[]}],"summary":"1 人が「いいね!」と言っています"},"like":false,"logView":true,"todo":{"count":0},"user":{"id":"738706","firstName":"Naoki","lastName":"T.","gender":"male","photo":{"prefix":"https:\/\/irs1.4sqi.net\/img\/user\/","suffix":"\/EIXIR1H2YPFVNRXY.jpg"}}},{"id":"4c04238370c603bb19d19db4","createdAt":1275339651,"text":"ジョギングとわんこのお散歩に使ってます","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/4c04238370c603bb19d19db4","likes":{"count":1,"groups":[{"type":"others","count":1,"items":[]}],"summary":"1 人が「いいね!」と言っています"},"like":false,"logView":true,"todo":{"count":2},"user":{"id":"491761","firstName":"Yukiko","gender":"female","photo":{"prefix":"https:\/\/irs0.4sqi.net\/img\/user\/","suffix":"\/4UQ1IPRQ0FIB1VW5.jpg"}}},{"id":"54f1a593498efce7e999dd2d","createdAt":1425122707,"text":"散歩にもってこいな場所","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/54f1a593498efce7e999dd2d","likes":{"count":0,"groups":[]},"like":false,"logView":true,"todo":{"count":0},"user":{"id":"32591768","firstName":"Yuki","lastName":"Takesita","gender":"male","photo":{"prefix":"https:\/\/irs1.4sqi.net\/img\/user\/","suffix":"\/32591768-OQDSD0HVILEUM3HP.jpg"}}},{"id":"53b8b3d0498e271cfa58e810","createdAt":1404613584,"text":"日陰がないので帽子必須。熱中症対策しっかりと。ソリゲレンデは貸し出してくれるのでマイソリ不要。","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/53b8b3d0498e271cfa58e810","likes":{"count":0,"groups":[]},"like":false,"logView":true,"todo":{"count":0},"user":{"id":"270963","firstName":"kwappa","lastName":"(SHIOYA, Hiromu)","gender":"male","photo":{"prefix":"https:\/\/irs2.4sqi.net\/img\/user\/","suffix":"\/BSYPZFB2C4ST1DOQ.jpg"}}},{"id":"535f3bae498e3d0d899d757c","createdAt":1398750126,"text":"初めて来てみたみた。よいかも","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/535f3bae498e3d0d899d757c","likes":{"count":0,"groups":[]},"like":false,"logView":true,"todo":{"count":0},"user":{"id":"72986090","firstName":"0028baile","gender":"none","photo":{"prefix":"https:\/\/irs1.4sqi.net\/img\/user\/","suffix":"\/72986090-XYL3ZRVKTRMHRHQW.jpg"}}},{"id":"533b927711d2cfa327b9f52f","createdAt":1396413047,"text":"2014年4月5日は花火大会があるそうです。毎年四月の第一土曜日なのかな?","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/533b927711d2cfa327b9f52f","likes":{"count":0,"groups":[]},"like":false,"logView":true,"todo":{"count":0},"user":{"id":"14030283","firstName":"呑パパ","gender":"none","photo":{"prefix":"https:\/\/irs2.4sqi.net\/img\/user\/","suffix":"\/2J4BCSG41UK10U2K.jpg"}}},{"id":"52cfc42c498e54cc840a04e8","createdAt":1389347884,"text":"公園内もGoogleストリートビューできるんですね!","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/52cfc42c498e54cc840a04e8","photo":{"id":"52cfc42e498e01758e791386","createdAt":1389347886,"source":{"name":"Foursquare for iOS","url":"https:\/\/foursquare.com\/download\/#\/iphone"},"prefix":"https:\/\/irs3.4sqi.net\/img\/general\/","suffix":"\/10924325_LyvMge5_HK-PPan5XAnmf6fVNbONb59YckG85G5qOtg.jpg","width":869,"height":720},"photourl":"https:\/\/irs3.4sqi.net\/img\/general\/original\/10924325_LyvMge5_HK-PPan5XAnmf6fVNbONb59YckG85G5qOtg.jpg","likes":{"count":0,"groups":[]},"like":false,"logView":true,"todo":{"count":0},"user":{"id":"10924325","firstName":"launcher","lastName":"00","gender":"none","photo":{"prefix":"https:\/\/irs3.4sqi.net\/img\/user\/","suffix":"\/10924325-JVLYUA10MMZ5EKCM.jpg"}}},{"id":"52b7cfa9498e9578eaae8960","createdAt":1387777961,"text":"色んな子たちに会えて楽しい場所です。","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/52b7cfa9498e9578eaae8960","photo":{"id":"52b7cfaf11d289827e01cb68","createdAt":1387777967,"source":{"name":"Foursquare for iOS","url":"https:\/\/foursquare.com\/download\/#\/iphone"},"prefix":"https:\/\/irs3.4sqi.net\/img\/general\/","suffix":"\/28914831_6tJ6aZD8Fnq1ijYkje_gAWy5rZn1UlkxPuIuSFpC1Zg.jpg","width":960,"height":720},"photourl":"https:\/\/irs3.4sqi.net\/img\/general\/original\/28914831_6tJ6aZD8Fnq1ijYkje_gAWy5rZn1UlkxPuIuSFpC1Zg.jpg","likes":{"count":0,"groups":[]},"like":false,"logView":true,"todo":{"count":0},"user":{"id":"28914831","firstName":"alice","gender":"female","photo":{"prefix":"https:\/\/irs2.4sqi.net\/img\/user\/","suffix":"\/28914831-HLX4OMVG3VQDOFT2.jpg"}}},{"id":"51f37607498e5186b2256c8b","createdAt":1374909959,"text":"広い公園!BBQもできます。","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/51f37607498e5186b2256c8b","likes":{"count":0,"groups":[]},"like":false,"logView":true,"todo":{"count":0},"user":{"id":"12287516","firstName":"nissy","lastName":"T","gender":"male","photo":{"prefix":"https:\/\/irs2.4sqi.net\/img\/user\/","suffix":"\/F0CAY4YMQE3ZILTJ.jpg"}}},{"id":"51a5642f498e4f028837c9dc","createdAt":1369793583,"text":"駐車場は1時間200円 + 以降30分ごとに100円。 幼児公園には小さい第2駐車場(46台)のほうが近い。","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/51a5642f498e4f028837c9dc","likes":{"count":0,"groups":[]},"like":false,"logView":true,"todo":{"count":0},"user":{"id":"13243175","firstName":"Daisukee","lastName":"M","gender":"male","photo":{"prefix":"https:\/\/irs3.4sqi.net\/img\/user\/","suffix":"\/SRG5HGQQ20MKJ1LA.jpg"}}},{"id":"50399278e4b021b479a65ba5","createdAt":1345950328,"text":"じゃぶじゃぶ池で紙オムツの水着はNGでしたー。","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/50399278e4b021b479a65ba5","likes":{"count":0,"groups":[]},"like":false,"logView":true,"todo":{"count":0},"user":{"id":"516896","firstName":"o9bo","gender":"male","photo":{"prefix":"https:\/\/irs1.4sqi.net\/img\/user\/","suffix":"\/DCQOSUNQPKTSTCHW.jpg"}}},{"id":"5032382ae4b0fdd33b0769cf","createdAt":1345468458,"text":"ハッテン場として有名です。","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/5032382ae4b0fdd33b0769cf","likes":{"count":0,"groups":[]},"like":false,"logView":true,"todo":{"count":0},"user":{"id":"3708486","firstName":"Kanesue","gender":"male","photo":{"prefix":"https:\/\/irs0.4sqi.net\/img\/user\/","suffix":"\/FT105LXF22YP1HZO.png"}}},{"id":"4f7facf6e4b0bc141654b4ab","createdAt":1333767414,"text":"ソリ遊びを楽しめます(^O^)","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/4f7facf6e4b0bc141654b4ab","photo":{"id":"4f7facffe4b08004b3470451","createdAt":1333767423,"source":{"name":"Foursquare for Android","url":"https:\/\/foursquare.com\/download\/#\/android"},"prefix":"https:\/\/irs2.4sqi.net\/img\/general\/","suffix":"\/SQX_IdWRKXDu2DO58C0YtybkktLbQ1ZeH2iJlTSyhPA.jpg","width":405,"height":720},"photourl":"https:\/\/irs2.4sqi.net\/img\/general\/original\/SQX_IdWRKXDu2DO58C0YtybkktLbQ1ZeH2iJlTSyhPA.jpg","likes":{"count":0,"groups":[]},"like":false,"logView":true,"todo":{"count":0},"user":{"id":"25242542","firstName":"Bob","gender":"male","photo":{"prefix":"https:\/\/irs3.4sqi.net\/img\/user\/","suffix":"\/LNFQCDEFN4GD0CUL.jpg"}}},{"id":"4f7fa23ee4b024a26c7ecb9d","createdAt":1333764670,"text":"桜まつりイベントで一回りするのには大変な大きい公園です(>_<)","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/4f7fa23ee4b024a26c7ecb9d","photo":{"id":"4f7fa247e4b085b99a387fca","createdAt":1333764679,"source":{"name":"Foursquare for Android","url":"https:\/\/foursquare.com\/download\/#\/android"},"prefix":"https:\/\/irs0.4sqi.net\/img\/general\/","suffix":"\/dZyP8LwsQH5Jv1rGPPeGgyCi20dlUNjgAkIOA1PSuz4.jpg","width":405,"height":720},"photourl":"https:\/\/irs0.4sqi.net\/img\/general\/original\/dZyP8LwsQH5Jv1rGPPeGgyCi20dlUNjgAkIOA1PSuz4.jpg","likes":{"count":0,"groups":[]},"like":false,"logView":true,"todo":{"count":0},"user":{"id":"25242542","firstName":"Bob","gender":"male","photo":{"prefix":"https:\/\/irs3.4sqi.net\/img\/user\/","suffix":"\/LNFQCDEFN4GD0CUL.jpg"}}},{"id":"4ee7bce30e61a5b514b74810","createdAt":1323810019,"text":"すんごい広いです。子供だけですが、(人口)芝滑りできます。","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/4ee7bce30e61a5b514b74810","likes":{"count":0,"groups":[]},"like":false,"logView":true,"todo":{"count":0},"user":{"id":"8542022","firstName":"Masaru","lastName":"Kanda","gender":"male","photo":{"prefix":"https:\/\/irs1.4sqi.net\/img\/user\/","suffix":"\/E50NKE3JYDBREADH.jpg"}}},{"id":"4e7d4d37cc215279be252242","createdAt":1316834615,"text":"近くに上州屋があるのでお手軽に釣りできます。近くに食べる所が少ないのでお弁当は必須。","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/4e7d4d37cc215279be252242","likes":{"count":0,"groups":[]},"like":false,"logView":true,"todo":{"count":1},"user":{"id":"2800557","firstName":"Kazumi","lastName":"Kimura","gender":"male","photo":{"prefix":"https:\/\/irs0.4sqi.net\/img\/user\/","suffix":"\/Z5HNZU5N3TDJKQIX.jpg"}}},{"id":"4bd5168670c603bbd63f99b4","createdAt":1272256134,"text":"Great barbq area here","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/4bd5168670c603bbd63f99b4","lang":"en","likes":{"count":3,"groups":[{"type":"others","count":3,"items":[]}],"summary":"3 人が気に入っています。"},"like":false,"logView":true,"todo":{"count":1},"user":{"id":"385951","firstName":"tmk","gender":"male","photo":{"prefix":"https:\/\/irs2.4sqi.net\/img\/user\/","suffix":"\/LUCHE01IVCWBQFEF.jpg"}}},{"id":"4caff24a3f0676b07894fb0c","createdAt":1286599242,"text":"Nice place to bring the mutt.  Keep him on a lead outside the dog run, and check him for fleas and ticks when you get home.","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/4caff24a3f0676b07894fb0c","lang":"en","likes":{"count":1,"groups":[{"type":"others","count":1,"items":[]}],"summary":"1 人が「いいね!」と言っています"},"like":false,"logView":true,"todo":{"count":0},"user":{"id":"320275","firstName":"Robert","lastName":"H","gender":"male","photo":{"prefix":"https:\/\/irs3.4sqi.net\/img\/user\/","suffix":"\/2QLCJVUW2Z1YVZDX.jpg"}}},{"id":"4b64756170c603bb272691b4","createdAt":1264874849,"text":"I'm at tonreri kouen","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/4b64756170c603bb272691b4","lang":"en","likes":{"count":1,"groups":[{"type":"others","count":1,"items":[]}],"summary":"1 人が「いいね!」と言っています"},"like":false,"logView":true,"todo":{"count":1},"user":{"id":"325598","firstName":"weltecho","gender":"male","photo":{"prefix":"https:\/\/irs0.4sqi.net\/img\/user\/","suffix":"\/blank_boy.png","default":true}}}]}]},"tags":["park","parks and outdoors"],"shortUrl":"http:\/\/4sq.com\/5vfWbu","timeZone":"Asia\/Tokyo","listed":{"count":22,"groups":[{"type":"others","name":"他の人たちからのリスト","count":22,"items":[{"id":"4fddd65be4b0d60dd8fc7a8a","name":"東京都立の公園・庭園","description":"けっこう沢山あるのですね~。","type":"others","user":{"id":"17078809","firstName":"Kisik","gender":"male","photo":{"prefix":"https:\/\/irs0.4sqi.net\/img\/user\/","suffix":"\/W4MZRTYJCKDYOTN0.jpg"}},"editable":false,"public":true,"collaborative":true,"url":"\/kaz_ish\/list\/%E6%9D%B1%E4%BA%AC%E9%83%BD%E7%AB%8B%E3%81%AE%E5%85%AC%E5%9C%92%E5%BA%AD%E5%9C%92","canonicalUrl":"https:\/\/foursquare.com\/kaz_ish\/list\/%E6%9D%B1%E4%BA%AC%E9%83%BD%E7%AB%8B%E3%81%AE%E5%85%AC%E5%9C%92%E5%BA%AD%E5%9C%92","createdAt":1339938395,"updatedAt":1428049990,"photo":{"id":"4fb857d9e4b0f254866e5dc2","createdAt":1337481177,"prefix":"https:\/\/irs1.4sqi.net\/img\/general\/","suffix":"\/_ikGbNdwjr_n0QHAIbF2Ge9DQLM0EKRAHIHATZdv_3Y.jpg","width":540,"height":720,"user":{"id":"12621656","firstName":"shift_51","gender":"none","photo":{"prefix":"https:\/\/irs1.4sqi.net\/img\/user\/","suffix":"\/2H3HFI34KT3FHI3C.jpg"}},"visibility":"public"},"followers":{"count":66},"listItems":{"count":128,"items":[{"id":"t4c32f336452620a124d0220f","createdAt":1339939720,"tip":{"id":"4c32f336452620a124d0220f","createdAt":1278407478,"text":"施設も充実していて、余り混まない。日曜日は駐車場の空き待ちになる","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/4c32f336452620a124d0220f","likes":{"count":1,"groups":[{"type":"others","count":1,"items":[]}],"summary":"1 人が「いいね!」と言っています"},"like":false,"logView":true,"todo":{"count":0},"saves":{},"user":{"id":"738706","firstName":"Naoki","lastName":"T.","gender":"male","photo":{"prefix":"https:\/\/irs1.4sqi.net\/img\/user\/","suffix":"\/EIXIR1H2YPFVNRXY.jpg"}}},"photo":{"id":"4f5f0a6be4b0028cf9eb4cff","createdAt":1331628651,"prefix":"https:\/\/irs2.4sqi.net\/img\/general\/","suffix":"\/GUG-SjPas1E6kib8E4WNBKD9aIX_GbZvSxudA9Tkxdo.jpg","width":720,"height":540,"user":{"id":"8256572","firstName":"Masahiro","lastName":"ARAI","gender":"male","photo":{"prefix":"https:\/\/irs0.4sqi.net\/img\/user\/","suffix":"\/CEJQ2XR5ESS2523P.jpg"}},"visibility":"public"}}]}},{"id":"4e9628308b811f0c66261767","name":"東京の公園50","description":"東京にある公園のうち50をリストにしました","type":"others","user":{"id":"1765336","firstName":"コーン太郎","gender":"male","photo":{"prefix":"https:\/\/irs0.4sqi.net\/img\/user\/","suffix":"\/1765336-M4UMEZW3YT5KYLKP.jpg"}},"editable":false,"public":true,"collaborative":false,"url":"\/shloshahshalosh\/list\/%E6%9D%B1%E4%BA%AC%E3%81%AE%E5%85%AC%E5%9C%9250","canonicalUrl":"https:\/\/foursquare.com\/shloshahshalosh\/list\/%E6%9D%B1%E4%BA%AC%E3%81%AE%E5%85%AC%E5%9C%9250","createdAt":1318463536,"updatedAt":1400998809,"photo":{"id":"4e5c36b61495cac41937b152","createdAt":1314666166,"prefix":"https:\/\/irs3.4sqi.net\/img\/general\/","suffix":"\/CB30QDKNYV5VJHGCFNSCCSTGF2V5BJWZHIK5RZ2AFV2KMSM5.jpg","width":720,"height":540,"user":{"id":"5433400","firstName":"Yasuo","lastName":"Yamasaki","gender":"male","photo":{"prefix":"https:\/\/irs0.4sqi.net\/img\/user\/","suffix":"\/P5OFBA002OZ2O4A5.jpg"}},"visibility":"public"},"followers":{"count":322},"listItems":{"count":50,"items":[{"id":"v4b5bb91cf964a520451229e3","createdAt":1319424638,"photo":{"id":"4e9250497ee629d9b454aead","createdAt":1318211657,"prefix":"https:\/\/irs2.4sqi.net\/img\/general\/","suffix":"\/5FYIKZWO5ZMYZQ35T5RTULDFYO5ZL5GUUKFOO4H5HRRXJ4UQ.jpg","width":720,"height":540,"user":{"id":"3385336","firstName":"Akihiko","lastName":"Noda","gender":"male","photo":{"prefix":"https:\/\/irs1.4sqi.net\/img\/user\/","suffix":"\/2VK3QE2HAQHYSS5X.jpg"}},"visibility":"public"}}]}}]}]},"phrases":[{"phrase":"できます","sample":{"entities":[{"indices":[24,28],"type":"keyPhrase"}],"text":"すんごい広いです。子供だけですが、(人口)芝滑りできます。"},"count":3}],"popular":{"status":"おそらく営業中","isOpen":true,"timeframes":[{"days":"今日","includesToday":true,"open":[{"renderedTime":"8:00\u201318:00"}],"segments":[]},{"days":"月","open":[{"renderedTime":"7:00\u20138:00"},{"renderedTime":"10:00\u201316:00"}],"segments":[]},{"days":"火","open":[{"renderedTime":"7:00\u20138:00"},{"renderedTime":"13:00\u201315:00"}],"segments":[]},{"days":"水","open":[{"renderedTime":"7:00\u20139:00"},{"renderedTime":"13:00\u201314:00"}],"segments":[]},{"days":"木","open":[{"renderedTime":"7:00\u20138:00"},{"renderedTime":"14:00\u201315:00"}],"segments":[]},{"days":"金","open":[{"renderedTime":"7:00\u20139:00"},{"renderedTime":"14:00\u201317:00"}],"segments":[]},{"days":"土","open":[{"renderedTime":"8:00\u201320:00"}],"segments":[]}]},"pageUpdates":{"count":0,"items":[]},"inbox":{"count":0,"items":[]},"venueChains":[],"attributes":{"groups":[]},"bestPhoto":{"id":"50c82f09e4b04f4ed29ec391","createdAt":1355296521,"source":{"name":"Foursquare for iOS","url":"https:\/\/foursquare.com\/download\/#\/iphone"},"prefix":"https:\/\/irs0.4sqi.net\/img\/general\/","suffix":"\/39554506_BGp65HM1csjyLjVsbp2yeRQwwk6QEAqiTfH2KXYE-9s.jpg","width":720,"height":540,"visibility":"public"},"mayor":{"user":{"id":"10924325","firstName":"launcher","lastName":"00","gender":"none","photo":{"prefix":"https:\/\/irs3.4sqi.net\/img\/user\/","suffix":"\/10924325-JVLYUA10MMZ5EKCM.jpg"}},"count":4,"summary":"4回チェックインしたlauncher 00さんがメイヤーです"}}}}

各プロパティの説明

JSONの主な項目の説明は下記の通りです。

id
ベニューID
name
名称。
contact
連絡先情報。
location
住所、位置座標など。
canonicalUrl
Foursquareページのパーマリンク。
shortUrl
Foursquareページのパーマリンク(短縮URL)。
categories
カテゴリーの情報。
stats
統計情報。チェックイン総数、訪れたユーザー数など。
url
ウェブサイトのURL。
likes
ライクの情報。
rating
評価の情報。
photos
投稿された写真の情報。
createdAt
ベニューが登録された日時。
tips
投稿されたTIPS(クチコミ)の情報。
timeZone
タイムゾーン。
listed
リストの情報。
bestPhoto
投稿された写真の中で、最も評価が高い写真。

サンプルプログラム

ベニューIDを指定して、そのベニューに関する情報を取得する簡易なサンプルプログラムです。

PHP

<?php

	// 取得するベニューID
	$venue_id = '4b5bb91cf964a520451229e3' ;

	// アクセストークン
	$access_token = '' ;

	// 設定項目
	$params = array(
		'oauth_token' => $access_token ,	// アクセストークン
		'locale' => 'ja' ,	// ローカライズ
		'm' => 'swarm' ,	// モード (foursquare OR swarm)
		'v' => '20150801' ,	// バージョン
	) ;

	// リクエストURL
	$request_url = 'https://api.foursquare.com/v2/venues/' . $venue_id . '?' . http_build_query( $params ) ;

	// 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_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>' ;

	// エラー判定
	if( !$obj || !isset($obj->meta->code) || $obj->meta->code != 200 )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		// 説明
		$html .= '<p>下記がベニューに関する情報です。</p>' ;

		// エイリアス
		$item = $obj->response->venue ;

		// 各データの整理
		$id = $item->id ;		// ベニューのID
		$name = $item->name ;		// ベニューの名前
		$canonicalUrl = $item->canonicalUrl ;		// ベニューのパーマリンク
		$categories_id = $item->categories[0]->id ;		// カテゴリID (最初の1個だけ…)
		$categories_name = $item->categories[0]->name ;		// カテゴリ名 (最初の1個だけ…)
		$lat = $item->location->lat ;		// 緯度
		$lng = $item->location->lng ;		// 経度
		$formattedAddress = ( isset($item->location->formattedAddress) && !empty($item->location->formattedAddress) ) ? implode( ' ' , $item->location->formattedAddress ) : '' ;		// 住所
		$stats_checkinsCount = ( isset($item->stats->checkinsCount) ) ? $item->stats->checkinsCount : 0 ;		// チェックイン数
		$stats_usersCount = ( isset($item->stats->usersCount) ) ? $item->stats->usersCount : 0 ;		// 訪問ユーザー数

		// ブラウザに出力
		$html .= '<dl>' ;
		$html .= 	'<dt>ベニューID</dt>' ;
		$html .= 		'<dd>' . $id . '</dd>' ;
		$html .= 	'<dt>ベニュー名</dt>' ;
		$html .= 		'<dd>' . $name . '</dd>' ;

		// 住所
		if( $formattedAddress )
		{
			$html .= 	'<dt>住所</dt>' ;
			$html .= 		'<dd>' . $formattedAddress . '</dd>' ;
		}

		$html .= 	'<dt>パーマリンク</dt>' ;
		$html .= 		'<dd><a href="' . $canonicalUrl . '" target="_blank">' . $canonicalUrl . '</a></dd>' ;
		$html .= 	'<dt>カテゴリID</dt>' ;
		$html .= 		'<dd>' . $categories_id . '</dd>' ;
		$html .= 	'<dt>カテゴリ名</dt>' ;
		$html .= 		'<dd><a href="https://ja.foursquare.com/explore?q=' . $categories_name . '" target="_blank">' . $categories_name . '</a></dd>' ;
		$html .= 	'<dt>地図</dt>' ;
		$html .= 		'<dd><a href="https://www.google.co.jp/maps/@' . $lat . ',' . $lng . ',15z" target="_blank">Google Mapsで位置を確認する</a></dd>' ;
		$html .= 	'<dt>チェックイン数</dt>' ;
		$html .= 		'<dd>' . number_format( $stats_checkinsCount ) . '</dd>' ;
		$html .= 	'<dt>訪問ユーザー数</dt>' ;
		$html .= 		'<dd>' . number_format( $stats_usersCount ) . '</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>' ;

	// アプリケーション連携の解除
	$html .= '<h2>アプリケーション連携の解除</h2>' ;
	$html .= '<p>このアプリケーションとの連携は、下記設定ページで解除することができます。</p>' ;
	$html .= '<p><a href="https://ja.foursquare.com/settings/connections" target="_blank">https://ja.foursquare.com/settings/connections</a></p>' ;

?>

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

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

写真(フォト)の取得

この章では、ユーザーが投稿した写真、ベニューに投稿された写真、それぞれの条件で、写真の一覧を取得する方法を説明します。このエンドポイントの難点は、ベニューを対象にした際に、新着順に並び替える機能がないことです。

エンドポイント

下記URLに、GETメソッドでリクエストを送って下さい。

ユーザーの写真を取得する場合

{ユーザーID}の指定は2015年9月現在、self(アクセストークンの主)のみ、有効です。

GET https://api.foursquare.com/v2/users/{ユーザーID}/photos

ベニューに投稿された写真を取得する場合

GET https://api.foursquare.com/v2/venues/{ベニューID}/photos

パラメータ

オプションパラメータの紹介です。なお、ユーザーの写真を取得する際は、認証はアクセストークン(oauth_token)で行なう必要があります。

limit
取得件数。最大値は500
offset
オフセット件数。

取得できるJSON

リクエスト成功時に取得できるJSONとその説明です。ユーザーを対象にした場合とベニューを対象にした場合とで、取得できるデータに差異があります。ユーザーを対象にした場合は、チェックイン(checkin)とベニュー(venue)の情報が含まれます。逆に、ベニューを対象にした場合には、ユーザー(user)の情報が含まれます。

ユーザーの写真一覧の場合

JSON

{"meta":{"code":200},"notifications":[{"type":"notificationTray","item":{"unreadCount":72}}],"response":{"photos":{"count":201,"items":[{"id":"54473968498eb0e3bb98e1df","createdAt":1413953896,"source":{"name":"Swarm for iOS","url":"https:\/\/www.swarmapp.com"},"prefix":"https:\/\/irs0.4sqi.net\/img\/general\/","suffix":"\/47258995_UVAOb3oLn887wOEhjseszH1HBQHxhv_Kj64BY4ubhrc.jpg","width":960,"height":720,"visibility":"public","venue":{"id":"53843be7498e69141395c41e","name":"ブロンコビリー 北綾瀬店","contact":{"phone":"0356979129","formattedPhone":"03-5697-9129"},"location":{"address":"谷中2-5-4","lat":35.777175647414644,"lng":139.83084767224423,"postalCode":"120-0006","cc":"JP","city":"足立区","state":"東京都","country":"日本","formattedAddress":["谷中2-5-4","足立区, 東京都","120-0006"]},"categories":[{"id":"4bf58dd8d48988d1cc941735","name":"ステーキハウス","pluralName":"ステーキハウス","shortName":"ステーキハウス","icon":{"prefix":"https:\/\/ss3.4sqi.net\/img\/categories_v2\/food\/steakhouse_","suffix":".png"},"primary":true}],"verified":false,"stats":{"checkinsCount":86,"usersCount":52,"tipCount":0},"url":"http:\/\/www.bronco.co.jp\/shop\/tokyo\/kita_ayase_grand\/","like":false,"beenHere":{"count":1,"marked":true}},"checkin":{"id":"54473966498e4d6f3e7ad0ad","createdAt":1413953894,"type":"checkin","timeZoneOffset":540}},{"id":"5444894011d2db31ea67dd15","createdAt":1413777728,"source":{"name":"Swarm for iOS","url":"https:\/\/www.swarmapp.com"},"prefix":"https:\/\/irs2.4sqi.net\/img\/general\/","suffix":"\/47258995_ulL_gO-h5zn4Zk2QQNkeiexaMyQhJr5q-rmZjTb6reI.jpg","width":960,"height":720,"visibility":"public","venue":{"id":"50bae270e4b0ecc0b028cec9","name":"つけ麺 HERO'S","contact":{},"location":{"lat":35.81029140823692,"lng":139.81218100354445,"cc":"JP","country":"日本"},"categories":[{"id":"4bf58dd8d48988d1d1941735","name":"ラーメン \/ 麺類店","pluralName":"ラーメン \/ 麺類店","shortName":"ラーメン \/ 麺類","icon":{"prefix":"https:\/\/ss3.4sqi.net\/img\/categories_v2\/food\/ramen_","suffix":".png"},"primary":true}],"verified":false,"stats":{"checkinsCount":24,"usersCount":12,"tipCount":0},"like":false,"beenHere":{"count":1,"marked":true}},"checkin":{"id":"5444893e498e25439eea9e45","createdAt":1413777726,"type":"checkin","timeZoneOffset":540}}]}}}

ベニューの写真一覧の場合

JSON

{"meta":{"code":200},"response":{"photos":{"count":2,"items":[{"id":"4fc9c6f2e4b010c6fc804094","createdAt":1338623730,"source":{"name":"Instagram","url":"http:\/\/instagram.com"},"prefix":"https:\/\/irs0.4sqi.net\/img\/general\/","suffix":"\/GHdTPZWIzz2tqaLlwGZURy1pCEixQ-V9bAntpMGVE6k.jpg","width":612,"height":612,"user":{"id":"5395429","firstName":"nic2929","gender":"male","photo":{"prefix":"https:\/\/irs2.4sqi.net\/img\/user\/","suffix":"\/1TL3TAVALKLK2OLZ.jpg"}},"visibility":"public"},{"id":"501dceece4b0bbacb6769231","createdAt":1344130796,"source":{"name":"Instagram","url":"http:\/\/instagram.com"},"prefix":"https:\/\/irs3.4sqi.net\/img\/general\/","suffix":"\/nmp46BPXPnz2N3l5FRTgZFDWMDaZAH6IuC5vJIXBWIM.jpg","width":612,"height":612,"user":{"id":"20003373","firstName":"Hiroko","lastName":"Satake","gender":"female","photo":{"prefix":"https:\/\/irs3.4sqi.net\/img\/user\/","suffix":"\/IQVG2JNNY4V0IZGB.jpg"}},"visibility":"public"}],"dupesRemoved":0}}}

各プロパティの説明

JSONの主な項目の説明は下記の通りです。

id
写真のID。
prefix
写真の画像URLのプレフィクス。
suffix
写真の画像URLのサフィックス。
width
写真のオリジナルサイズの横幅。
height
写真のオリジナルサイズの縦幅。
createdAt
写真の投稿日時。

サンプルプログラム

写真の一覧を取得するサンプルプログラムです。ベニューを対象に取得するものですが、リクエストURLを変更すれば、ユーザーを対象に取得することができます。

PHP

<?php

	// 取得するベニューID
	$venue_id = '4ee2b82ff9ab478e59c5794e' ;

	// 設定項目
	// * ユーザーの写真を取得する場合は、アクセストークンによる認証が必要です。
	$params = array(
		'client_id' => '' ,	// クライアントID
		'client_secret' => '' ,	// クライアントシークレット
		'locale' => 'ja' ,	// ローカライズ
		'm' => 'swarm' ,	// モード (foursquare OR swarm)
		'v' => '20150801' ,	// バージョン
		'limit' => '20' ,	// 取得件数
//		'offset' => 1 ,	// オフセット
	) ;

	// GETメソッドで指定がある場合
	foreach( array( 'locale' , 'm' , 'limit' , 'offset' ) as $val )
	{
		if( isset( $_GET[ $val ] ) && $_GET[ $val ] != '' )
		{
			$params[ $val ] = $_GET[ $val ] ;
		}
	}

	// リクエストURL
	$request_url = 'https://api.foursquare.com/v2/venues/' . $venue_id . '/photos' . '?' . http_build_query( $params ) ;

	// 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_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>' ;

	// エラー判定
	if( !$obj || !isset($obj->meta->code) || $obj->meta->code != 200 )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		// 説明
		$html .= '<p>下記の写真を取得しました。</p>' ;

		// 解析
		foreach( $obj->response->photos->items as $item )
		{
			// 各データの整理
			$id = $item->id ;		// 写真のID
			$src = $item->prefix . '500x500' . $item->suffix ;		// 写真の画像URL ([500x500]でcrop)
			$createdAt = $item->createdAt ;		// 投稿日時

			// 日時の整形
			$createdAt = date( 'Y/m/d H:i' , $createdAt ) ;

			// ブラウザに出力
			$html .= '<dl>' ;
			$html .= 	'<dt>写真のID</dt>' ;
			$html .= 		'<dd>' . $id . '</dd>' ;
			$html .= 	'<dt>写真</dt>' ;
			$html .= 		'<dd><img class="_img" src="' . $src . '" width="250" height="250"></dd>' ;
			$html .= 	'<dt>投稿日時</dt>' ;
			$html .= 		'<dd>' . $createdAt . '</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>' ;

	// アプリケーション連携の解除
	$html .= '<h2>アプリケーション連携の解除</h2>' ;
	$html .= '<p>このアプリケーションとの連携は、下記設定ページで解除することができます。</p>' ;
	$html .= '<p><a href="https://ja.foursquare.com/settings/connections" target="_blank">https://ja.foursquare.com/settings/connections</a></p>' ;

?>

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

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

TIPS(クチコミ)の取得

この章では、TIPS(クチコミ)を取得する方法を説明します。写真の場合と同様に、ユーザー、ベニュー、それぞれを対象に取得することができます。

エンドポイント

下記URLに、GETメソッドでリクエストを送って下さい。

ユーザーの写真を取得する場合

{ユーザーID}の指定は、self(アクセストークンの主)でも大丈夫です。

GET https://api.foursquare.com/v2/users/{ユーザーID}/tips

ベニューに投稿された写真を取得する場合

GET https://api.foursquare.com/v2/venues/{ベニューID}/tips

パラメータ

オプションパラメータの紹介です。なお、ユーザーを対象にTIPS(クチコミ)を取得する際は、認証はアクセストークン(oauth_token)で行なう必要があります。また、モードはfoursquareのみです。

sort
ソートを指定する。
recent … 投稿日時が新しい順。
nearby … 現在位置から近い順に取得する。ユーザーを対象にした場合にのみ、指定可。
popular … 人気順。
ll
現在位置の位置座標を緯度,経度の形で指定する。ソートでnearbyを指定する時に必要。
limit
取得件数。最大で500まで指定可。
offset
オフセット件数。

取得できるJSON

リクエストの結果、取得できるJSONの説明です。ユーザー、ベニュー、対象によって、補足的なデータに差異があることを確認しておきましょう。

ユーザーの場合

JSON

{"meta":{"code":200},"notifications":[{"type":"notificationTray","item":{"unreadCount":72}}],"response":{"tips":{"count":10,"items":[{"id":"532c246c498e874c0bb259c4","createdAt":1395401836,"text":"もうすぐ生物園再開。ここは冬の蛍が見られるロマンチックな場所。","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/532c246c498e874c0bb259c4","photo":{"id":"532c246e498e17947addbea3","createdAt":1395401838,"source":{"name":"Foursquare for iOS","url":"https:\/\/foursquare.com\/download\/#\/iphone"},"prefix":"https:\/\/irs0.4sqi.net\/img\/general\/","suffix":"\/47258995_HB97LneUaUADd0byD1vLhMOXj5rficSB0C05Dk0Xp70.jpg","width":720,"height":960},"photourl":"https:\/\/irs0.4sqi.net\/img\/general\/original\/47258995_HB97LneUaUADd0byD1vLhMOXj5rficSB0C05Dk0Xp70.jpg","likes":{"count":0,"groups":[]},"like":false,"viewCount":77,"todo":{"count":0},"venue":{"id":"4dc61cb31f6ef43b8a282dcb","name":"元淵江公園","contact":{},"location":{"address":"保木間2-17-1","lat":35.79259687435101,"lng":139.80626644893582,"cc":"JP","city":"足立区","state":"東京都","country":"日本","formattedAddress":["保木間2-17-1","足立区, 東京都"]},"categories":[{"id":"4bf58dd8d48988d163941735","name":"公園","pluralName":"公園","shortName":"公園","icon":{"prefix":"https:\/\/ss3.4sqi.net\/img\/categories_v2\/parks_outdoors\/park_","suffix":".png"},"primary":true}],"verified":false,"stats":{"checkinsCount":413,"usersCount":179,"tipCount":6},"beenHere":{"count":21,"marked":true},"photos":{"count":0,"groups":[{"type":"venue","name":"スポットの写真","count":0,"items":[{"id":"51382fd4e4b0556dfd9751e8","createdAt":1362636756,"prefix":"https:\/\/irs2.4sqi.net\/img\/general\/","suffix":"\/12128947__5Y0w7WvhJs7pIFzFpgnwmyOPfA46royiauCUdzlJcs.jpg","width":612,"height":612,"user":{"id":"12128947","firstName":"mizukoba","gender":"male","photo":{"prefix":"https:\/\/irs1.4sqi.net\/img\/user\/","suffix":"\/-VPYLLWF3NSC2CXOD.jpg"}},"visibility":"public"}]}]}}},{"id":"531e1b5f498e4d0bb2012601","createdAt":1394482015,"text":"空いててまったりできます。","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/531e1b5f498e4d0bb2012601","likes":{"count":0,"groups":[]},"like":false,"viewCount":19,"todo":{"count":0},"venue":{"id":"4e9ab957dab4d1d4ac318be6","name":"華屋与兵衛 保塚店","contact":{},"location":{"address":"保塚町11-4","lat":35.787323,"lng":139.810863,"cc":"JP","city":"足立区","state":"東京都","country":"日本","formattedAddress":["保塚町11-4","足立区, 東京都"]},"categories":[{"id":"4bf58dd8d48988d111941735","name":"和食店","pluralName":"和食店","shortName":"和食","icon":{"prefix":"https:\/\/ss3.4sqi.net\/img\/categories_v2\/food\/japanese_","suffix":".png"},"primary":true}],"verified":false,"stats":{"checkinsCount":24,"usersCount":19,"tipCount":1},"beenHere":{"count":2,"marked":true},"photos":{"count":0,"groups":[{"type":"venue","name":"スポットの写真","count":0,"items":[{"id":"5298b2b211d2c01ed2ad5435","createdAt":1385738930,"prefix":"https:\/\/irs1.4sqi.net\/img\/general\/","suffix":"\/12652166_ruTtIeJLk--wFfnqaP8kkiiB4wsew1Ava0pKOf18GEA.jpg","width":720,"height":720,"user":{"id":"12652166","firstName":"pururun","lastName":"rerorero","gender":"male","photo":{"prefix":"https:\/\/irs1.4sqi.net\/img\/user\/","suffix":"\/XVWAJHQZEG00MYYN.jpg"}},"visibility":"public"}]}]}}}]}}}

ベニューの場合

JSON

{"meta":{"code":200},"notifications":[{"type":"notificationTray","item":{"unreadCount":72}}],"response":{"tips":{"count":2,"items":[{"id":"543fade0498efb46a695c60b","createdAt":1413459424,"text":"足立区唯一の動物園、水族館。金魚の大水槽は圧巻。足立区と提携するオーストラリア(ベルモンド)のワラビーがいたりします。半日は使えるくらい充実してます。夜行性のフクロウがいるのだけが謎です。","type":"user","url":"http:\/\/syncer.jp\/adachi-ku-seibutuen","canonicalUrl":"https:\/\/foursquare.com\/item\/543fade0498efb46a695c60b","photo":{"id":"543fadeb11d254ca61491376","createdAt":1413459435,"source":{"name":"Foursquare Web","url":"https:\/\/foursquare.com"},"prefix":"https:\/\/irs1.4sqi.net\/img\/general\/","suffix":"\/96587117_rYLjt9Nulf0UOKGJLn8OpMHQttc7oKfGHWDg-1ZpPSg.jpg","width":960,"height":960},"photourl":"https:\/\/irs1.4sqi.net\/img\/general\/original\/96587117_rYLjt9Nulf0UOKGJLn8OpMHQttc7oKfGHWDg-1ZpPSg.jpg","likes":{"count":0,"groups":[]},"like":false,"logView":true,"todo":{"count":0},"user":{"id":"96587117","firstName":"Hana","lastName":"Arai","gender":"male","relationship":"friend","photo":{"prefix":"https:\/\/irs2.4sqi.net\/img\/user\/","suffix":"\/96587117-R2W4MN4AZYYTAYOK"}}},{"id":"516a9f30e4b088e331d824a2","createdAt":1365942064,"text":"2013\/08\/26 から 2014\/03\/31 まで、改築のため休園です。","type":"user","canonicalUrl":"https:\/\/foursquare.com\/item\/516a9f30e4b088e331d824a2","likes":{"count":0,"groups":[]},"like":false,"logView":true,"todo":{"count":0},"user":{"id":"47815806","firstName":"kfkf","lastName":"keshisa","gender":"male","photo":{"prefix":"https:\/\/irs3.4sqi.net\/img\/user\/","suffix":"\/OOZ1AFF2IBVTIHM3.jpg"}}}]}}}

各プロパティの説明

JSONの主な項目の説明は下記の通りです。

id
クチコミのID。
createdAt
クチコミの投稿日時。
text
クチコミの本文。
photourl
クチコミに写真が添付されている場合、写真の画像URLが含まれる。
photo
クチコミに写真が添付されている場合、写真に関するオブジェクトが含まれる。

サンプルプログラム

この章の内容を踏まえた、TIPS(クチコミ)の一覧を取得するサンプルプログラムです。サンプルはベニュー(沼津港深海水族館)を対象にしたものですが、リクエストURLを調整してユーザーを対象にすることもできます。

PHP

<?php

	// 取得するベニューID
	$venue_id = '4ee2b82ff9ab478e59c5794e' ;

	// 設定項目
	// * ユーザーのTIPSを取得する場合は、アクセストークンによる認証が必要です。
	$params = array(
		'client_id' => '' ,	// クライアントID
		'client_secret' => '' ,	// クライアントシークレット
		'locale' => 'ja' ,	// ローカライズ
		'm' => 'foursquare' ,	// モード (foursquare OR swarm)
		'v' => '20150801' ,	// バージョン
		'limit' => '20' ,	// 取得件数
//		'offset' => 1 ,	// オフセット
	) ;

	// GETメソッドで指定がある場合
	foreach( array( 'locale' , 'm' , 'limit' , 'offset' , 'sort' , 'll' ) as $val )
	{
		if( isset( $_GET[ $val ] ) && $_GET[ $val ] != '' )
		{
			$params[ $val ] = $_GET[ $val ] ;
		}
	}

	// リクエストURL
	$request_url = 'https://api.foursquare.com/v2/venues/' . $venue_id . '/tips' . '?' . http_build_query( $params ) ;

	// 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_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>' ;

	// エラー判定
	if( !$obj || !isset($obj->meta->code) || $obj->meta->code != 200 )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		// 説明
		$html .= '<p>下記のクチコミを取得しました。</p>' ;

		// 解析
		foreach( $obj->response->tips->items as $item )
		{
			// 各データの整理
			$id = $item->id ;		// クチコミのID
			$text = $item->text ;		// クチコミ内容
			$canonicalUrl = $item->canonicalUrl ;		// クチコミのパーマリンク
			$createdAt = $item->createdAt ;		// 投稿日時
			$photourl = ( isset($item->photourl) ) ? $item->photourl : '' ;		// 写真が添付されている場合、写真のURL
			$user_id = ( isset($item->user->id) ) ? $item->user->id : '' ;		// 投稿者のID
			$user_firstName = ( isset($item->user->firstName) ) ? $item->user->firstName : '' ;		// 投稿者名

			// 日時の整形
			$createdAt = date( 'Y/m/d H:i' , $createdAt ) ;

			// ブラウザに出力
			$html .= '<dl>' ;
			$html .= 	'<dt>クチコミのID</dt>' ;
			$html .= 		'<dd>' . $id . '</dd>' ;
			$html .= 	'<dt>クチコミ</dt>' ;
			$html .= 		'<dd>' . $text . '</dd>' ;
			$html .= 	'<dt>パーマリンク</dt>' ;
			$html .= 		'<dd><a href="' . $canonicalUrl . '" target="_blank">' . $canonicalUrl . '</a></dd>' ;

			// 写真が添付されている場合
			if( $photourl )
			{
				$html .= 	'<dt>添付写真</dt>' ;
				$html .= 		'<dd><img class="_img" src="' . $photourl . '" width="250" height="auto"></dd>' ;
			}

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

			// 投稿者情報がある場合
			if( $user_id && $user_firstName )
			{
				$html .= 	'<dt>クチコミの投稿者ID</dt>' ;
				$html .= 		'<dd><a href="https://foursquare.com/u/' . $user_id . '" target="_blank">' . $user_id . '</a></dd>' ;
				$html .= 	'<dt>クチコミの投稿者名</dt>' ;
				$html .= 		'<dd>' . $user_firstName . '</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>' ;

	// アプリケーション連携の解除
	$html .= '<h2>アプリケーション連携の解除</h2>' ;
	$html .= '<p>このアプリケーションとの連携は、下記設定ページで解除することができます。</p>' ;
	$html .= '<p><a href="https://ja.foursquare.com/settings/connections" target="_blank">https://ja.foursquare.com/settings/connections</a></p>' ;

?>

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

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

ベニューの検索

この章では、様々な条件でベニューを検索し、そのリストを取得する方法を説明します。ここで取得した情報は、ここまでに説明した他のエンドポイントと組み合わせることが想定されています。

エンドポイント

下記URLに、GETメソッドでリクエストを送って下さい。

GET https://api.foursquare.com/v2/venues/search

パラメータ

主なオプションパラメータの紹介です。基本的に半径100kmの範囲を検索することができ、中心地を位置座標、または地名で指定する必要があります。

ll
位置座標(緯度,経度)を指定して下さい。
near
地名を指定して下さい。
query
検索キーワードの指定。
radius
指定した位置座標、または地名から、半径何メートル以内を検索対象にするかを、数値で指定する。最大値は100000(100km)。
limit
取得件数。最大値は50
sw
Bounding Box(矩形領域)で検索範囲を指定する際の、南西端の位置座標。llradiusとの併用は不可。
ne
Bounding Box(矩形領域)で検索範囲を指定する際の、北東端の位置座標。llradiusとの併用は不可。
categoryId
カテゴリIDを指定すると、そのカテゴリに絞って検索できる。複数ある場合は半角カンマ(,)で区切る。

取得できるJSON

リクエストで得られるJSONのサンプルです。「足立区役所」の位置座標を指定し、「ラーメン」というキーワードで検索を実行したものです。

JSON

{"meta":{"code":200},"response":{"venues":[{"id":"4f1d3075e4b064e65dbd39fa","name":"ラーメン梅 梅島店","contact":{"phone":"+81356816088","formattedPhone":"+81 3-5681-6088"},"location":{"address":"梅島3-8-11","lat":35.77624759894199,"lng":139.79754924774167,"distance":205,"cc":"JP","city":"足立区","state":"東京都","country":"日本","formattedAddress":["梅島3-8-11","足立区, 東京都","日本"]},"categories":[{"id":"4bf58dd8d48988d1d1941735","name":"Noodle House","pluralName":"Noodle Houses","shortName":"Noodles","icon":{"prefix":"https:\/\/ss3.4sqi.net\/img\/categories_v2\/food\/ramen_","suffix":".png"},"primary":true}],"verified":false,"stats":{"checkinsCount":197,"usersCount":84,"tipCount":3},"specials":{"count":0,"items":[]},"hereNow":{"count":0,"summary":"誰もいません","groups":[]},"referralId":"v-1438494541","mayor":{"user":{"id":"93536137","firstName":"フト2","gender":"male","photo":{"prefix":"https:\/\/irs2.4sqi.net\/img\/user\/","suffix":"\/93536137-DZ00OGAYS11XDC1L.jpg"}},"count":2,"summary":"2回チェックインしたフト2さんがメイヤーです"}},{"id":"53b7c77d498e952f7e1a8133","name":"ラーメン きち","contact":{},"location":{"address":"竹ノ塚3-5-1","crossStreet":"ハウスユー 1F","lat":35.78907751290747,"lng":139.7983047079937,"distance":1228,"cc":"JP","city":"足立区","state":"東京都","country":"日本","formattedAddress":["竹ノ塚3-5-1 (ハウスユー 1F)","足立区, 東京都","日本"]},"categories":[{"id":"4bf58dd8d48988d1d1941735","name":"Noodle House","pluralName":"Noodle Houses","shortName":"Noodles","icon":{"prefix":"https:\/\/ss3.4sqi.net\/img\/categories_v2\/food\/ramen_","suffix":".png"},"primary":true}],"verified":false,"stats":{"checkinsCount":18,"usersCount":11,"tipCount":3},"specials":{"count":0,"items":[]},"hereNow":{"count":0,"summary":"誰もいません","groups":[]},"referralId":"v-1438494541","mayor":{"user":{"id":"63125139","firstName":"Btd","lastName":"少尉","gender":"male","photo":{"prefix":"https:\/\/irs0.4sqi.net\/img\/user\/","suffix":"\/63125139-OPAIZ4KMYAPCSSJZ.jpg"}},"count":1,"summary":"1回チェックインしたBtd 少尉さんがメイヤーです"}},{"id":"4ca1d45854c8a1cd2a04ab4b","name":"ラーメン蘭","contact":{"phone":"+81338800302","formattedPhone":"+81 3-3880-0302"},"location":{"address":"弘道1-4-15","crossStreet":"第2弘道プラザ 104","lat":35.766471988656264,"lng":139.8131650686264,"distance":1934,"postalCode":"120-0013","cc":"JP","city":"足立区","state":"東京都","country":"日本","formattedAddress":["弘道1-4-15 (第2弘道プラザ 104)","足立区, 東京都","120-0013","日本"]},"categories":[{"id":"4bf58dd8d48988d1d1941735","name":"Noodle House","pluralName":"Noodle Houses","shortName":"Noodles","icon":{"prefix":"https:\/\/ss3.4sqi.net\/img\/categories_v2\/food\/ramen_","suffix":".png"},"primary":true}],"verified":false,"stats":{"checkinsCount":310,"usersCount":69,"tipCount":5},"specials":{"count":0,"items":[]},"hereNow":{"count":0,"summary":"誰もいません","groups":[]},"referralId":"v-1438494541","mayor":{"user":{"id":"25498208","firstName":"Lzwei","gender":"male","photo":{"prefix":"https:\/\/irs0.4sqi.net\/img\/user\/","suffix":"\/T5W2QHVLRH2QYL4P.png"}},"count":1,"summary":"1回チェックインしたLzweiさんがメイヤーです"}},{"id":"4d48029911618cfa27a3cf23","name":"ラーメン食堂 二枚看板","contact":{"phone":"+81338401770","formattedPhone":"+81 3-3840-1770"},"location":{"address":"梅島3丁目33-9","lat":35.77810119557026,"lng":139.79102319511668,"distance":560,"cc":"JP","city":"足立区","state":"東京都","country":"日本","formattedAddress":["梅島3丁目33-9","足立区, 東京都","日本"]},"categories":[{"id":"4bf58dd8d48988d111941735","name":"和食店","pluralName":"和食店","shortName":"和食","icon":{"prefix":"https:\/\/ss3.4sqi.net\/img\/categories_v2\/food\/japanese_","suffix":".png"},"primary":true}],"verified":false,"stats":{"checkinsCount":96,"usersCount":62,"tipCount":0},"specials":{"count":0,"items":[]},"hereNow":{"count":0,"summary":"誰もいません","groups":[]},"referralId":"v-1438494541","mayor":{"user":{"id":"10459205","firstName":"紫電","gender":"male","photo":{"prefix":"https:\/\/irs2.4sqi.net\/img\/user\/","suffix":"\/10459205-L2JDOMB0AWJNRNQF"}},"count":1,"summary":"1回チェックインした紫電さんがメイヤーです"}},{"id":"4b681490f964a52065662be3","name":"ラーメン銀次 西新井店","contact":{"phone":"+81338481322","formattedPhone":"+81 3-3848-1322"},"location":{"address":"西新井栄町2-27-13","lat":35.77803632721166,"lng":139.7864019870758,"distance":977,"cc":"JP","city":"足立区","state":"東京都","country":"日本","formattedAddress":["西新井栄町2-27-13","足立区, 東京都","日本"]},"categories":[{"id":"4bf58dd8d48988d1d1941735","name":"Noodle House","pluralName":"Noodle Houses","shortName":"Noodles","icon":{"prefix":"https:\/\/ss3.4sqi.net\/img\/categories_v2\/food\/ramen_","suffix":".png"},"primary":true}],"verified":false,"stats":{"checkinsCount":51,"usersCount":28,"tipCount":0},"specials":{"count":0,"items":[]},"hereNow":{"count":0,"summary":"誰もいません","groups":[]},"referralId":"v-1438494541","mayor":{"user":{"id":"60428106","firstName":"亜々瑠","lastName":"遠藤","gender":"male","photo":{"prefix":"https:\/\/irs0.4sqi.net\/img\/user\/","suffix":"\/40DJ4O2VIU5EX5DW.jpg"}},"count":2,"summary":"2回チェックインした亜々瑠 遠藤さんがメイヤーです"}}]}}

各プロパティの説明

JSONの主な項目の説明は下記の通りです。「ベニューを取得する」の章で紹介したvenueのオブジェクトと、基本的に内容は同じです。

id
ベニューID。
name
名称。
location
位置座標や住所の情報。

サンプルプログラム

条件を指定して、ベニューを検索するサンプルプログラムです。

PHP

<?php

	// 設定項目
	$params = array(
		'client_id' => '' ,	// クライアントID
		'client_secret' => '' ,	// クライアントシークレット
		'locale' => 'ja' ,	// ローカライズ
		'm' => 'swarm' ,	// モード (foursquare OR swarm)
		'v' => '20150801' ,	// バージョン
		'll' => '35.7780787,139.7972248' ,	// 位置座標
		'query' => 'ラーメン' ,	// 検索キーワード
		'radius' => 10000 ,	// 検索対象の半径
		'limit' => 5 ,	// 取得件数
	) ;

	// リクエストURL
	$request_url = 'https://api.foursquare.com/v2/venues/search' . '?' . http_build_query( $params ) ;

	// 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_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>' ;

	// エラー判定
	if( !$obj || !isset($obj->meta->code) || $obj->meta->code != 200 )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		// 説明
		$html .= '<p>下記がベニューに関する情報です。</p>' ;

		// 解析
		foreach( $obj->response->venues as $item )
		{
			// 各データの整理
			$id = $item->id ;		// ベニューのID
			$name = $item->name ;		// ベニューの名前
			$categories_id = $item->categories[0]->id ;		// カテゴリID (最初の1個だけ…)
			$categories_name = $item->categories[0]->name ;		// カテゴリ名 (最初の1個だけ…)
			$lat = $item->location->lat ;		// 緯度
			$lng = $item->location->lng ;		// 経度
			$formattedAddress = ( isset($item->location->formattedAddress) && !empty($item->location->formattedAddress) ) ? implode( ' ' , $item->location->formattedAddress ) : '' ;		// 住所
			$stats_checkinsCount = ( isset($item->stats->checkinsCount) ) ? $item->stats->checkinsCount : 0 ;		// チェックイン数
			$stats_usersCount = ( isset($item->stats->usersCount) ) ? $item->stats->usersCount : 0 ;		// 訪問ユーザー数

			// ブラウザに出力
			$html .= '<dl>' ;
			$html .= 	'<dt>ベニューID</dt>' ;
			$html .= 		'<dd><a href="https://ja.foursquare.com/v/' . $id . '" target="_blank">' . $id . '</a></dd>' ;
			$html .= 	'<dt>ベニュー名</dt>' ;
			$html .= 		'<dd>' . $name . '</dd>' ;

			// 住所
			if( $formattedAddress )
			{
				$html .= 	'<dt>住所</dt>' ;
				$html .= 		'<dd>' . $formattedAddress . '</dd>' ;
			}

			$html .= 	'<dt>カテゴリID</dt>' ;
			$html .= 		'<dd>' . $categories_id . '</dd>' ;
			$html .= 	'<dt>カテゴリ名</dt>' ;
			$html .= 		'<dd><a href="https://ja.foursquare.com/explore?q=' . $categories_name . '" target="_blank">' . $categories_name . '</a></dd>' ;
			$html .= 	'<dt>地図</dt>' ;
			$html .= 		'<dd><a href="https://www.google.co.jp/maps/@' . $lat . ',' . $lng . ',15z" target="_blank">Google Mapsで位置を確認する</a></dd>' ;
			$html .= 	'<dt>チェックイン数</dt>' ;
			$html .= 		'<dd>' . number_format( $stats_checkinsCount ) . '</dd>' ;
			$html .= 	'<dt>訪問ユーザー数</dt>' ;
			$html .= 		'<dd>' . number_format( $stats_usersCount ) . '</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>' ;

	// アプリケーション連携の解除
	$html .= '<h2>アプリケーション連携の解除</h2>' ;
	$html .= '<p>このアプリケーションとの連携は、下記設定ページで解除することができます。</p>' ;
	$html .= '<p><a href="https://ja.foursquare.com/settings/connections" target="_blank">https://ja.foursquare.com/settings/connections</a></p>' ;

?>

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

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

画像ファイルのURL

Foursquare APIにおいては、取得できる、ユーザーのプロフィールアイコンや、写真の、画像ファイルURLのデータは、prefixsuffixという2つに分かれています。これらをどのように組み合わせて画像ファイルのURLを作成するかを説明します。

URLの組み立て方

画像ファイルのURLは下記の通り、{size}パラメータを真ん中に挟む形で組み立てます。

{prefix}{size}{suffix}

サイズの指定方法

{width}x{height}
横幅と縦幅をピクセル値で指定します。オリジナル画像とアスペクト比が合わない場合、余剰分が切り取られるので、画像が不自然になる心配はいりません。
original
originalというキーワードで指定すると、オリジナルサイズの画像が出力されます。
cap{ピクセル値}
縦幅と横幅で大きい方を、指定したピクセル値にフィットさせます。もう片方も、それに合わせて、サイズが変更されます。
width{ピクセル値}
横幅を、指定したピクセル値にフィットさせます。縦幅も、それに合わせて、サイズが変更されます。
height{ピクセル値}
縦幅で大きい方を、指定したピクセル値にフィットさせます。横幅も、それに合わせて、サイズが変更されます。

サイズの指定例

例えば、200x200の正方形で画像を出力したい場合は、下記の通りになります。クロップしてくれるのは、かなり便利で助かりますねー。

https://irs0.4sqi.net/img/general/200x200/47258995_UVAOb3oLn887wOEhjseszH1HBQHxhv_Kj64BY4ubhrc.jpg リンク

パーマリンクの組み立て方

ベニューの専用ページやユーザープロフィールのページなどにユーザーを移動させたい場合に、IDからパーマリンクを組み立てる方法を説明します。

ユーザープロフィール

ユーザープロフィールのページには、userというディレクトリの下階層に、ユーザーIDをセットすればリダイレクトされます。

https://ja.foursquare.com/user/{ユーザーID}

例えば、下記は私(ID:47258995)のユーザープロフィールのページです。

https://ja.foursquare.com/user/47258995 リンク

ベニュー

ベニューのページは、vというディレクトリの下階層に、ベニューIDをセットすればリダイレクトされます。

https://ja.foursquare.com/v/{ベニューID}

例えば、下記は私の地元にある足立区生物園(ID:4b5d8bf7f964a520036129e3)の専用ページです。

https://ja.foursquare.com/v/4b5d8bf7f964a520036129e3 リンク

TIPS(クチコミ)

TIPS(クチコミ)のページは、itemというディレクトリの下階層に、TIPSのIDをセットすればリダイレクトされます。

https://ja.foursquare.com/item/{TIPS ID}

例えば、下記は私が「足立区生物園」に投稿したクチコミ(ID:543fade0498efb46a695c60b)のページです。

https://ja.foursquare.com/item/543fade0498efb46a695c60b リンク

ダウンロード

お疲れ様でした。この記事で説明してきた、各種サンプルプログラムを配布しています。動作確認やカスタマイズなどにお役立て下さい。

ファイル一覧

SYNCER00323
move-redirect.php Download
move-link.php Download
foursquare-get-access-token.php Download
get-user.php Download
get-checkin.php Download
post-checkin.php Download
get-venue.php Download
get-photos.php Download
get-tips.php Download
search-venue.php Download

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

Download Zip