Instagram APIでwebサービスを作りたい全ての人に向けて書きました

Instagram APIでwebサービスを作りたい全ての人に向けて書きました

写真共有SNSとして、確固たる地位を築いた「Instagram」。今回は、この「Instagram APIの使い方」を初心者向けにまとめて、日本語マニュアルを作成してみました。有名人、一般人、そして企業が投稿した何十億もの写真を利用して、webサービスを作ってみませんか?

「APIって何…」という方でも、「データを取得して動かす面白さ」を体験してもらえるように、コピペで使えるサンプルコードを多数用意しました。ぜひ、この機会にInstagramのAPIで何か始めてみてはいかがでしょうか!?

アプリケーションの登録

この「APIまとめコーナー」ではお馴染みになっていますが…、InstagramのAPIを利用するためには、まず「アプリケーションの登録」を行なう必要があります。APIの利用に必要な「クライアントID」「クライアントシークレット」を取得しましょう。

アカウントを取得する

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

アプリケーションを登録するには、Instagramのユーザーアカウントが必要です。まだ持っていない方は取得して下さい。WEB版にはアカウントの登録機能がありません。ユーザーアカウントは「iOSアプリ」「Androidアプリ」のいずれかを下記からダウンロードして、登録して下さい。

Instagram

発売日: 2010年10月6日 / 料金: 0円 / 評価: 4.5 (1,985,625人の評価)

時点の情報です。

アプリケーションを登録

Instagram開発者向けページ
Instagram開発者向けページ

アカウントを用意したら、アプリケーションを登録していきます。開発者向け画面の右上にあるメニューを見て下さい。まずは「ログイン」から、用意したユーザーアカウントでログインします。次に「アプリケーションを管理」から、アプリケーション管理画面に進んで下さい。下記リンクからもアクセスできます。

開発者プロフィールを登録

開発者プロフィールの登録画面
開発者プロフィールの登録画面

初回の方は、開発者プロフィールの登録画面に進みます。webサイトと電話番号、APIを利用する目的を入力し、API利用規約に同意の上、「登録」をクリックします。サンプル画像はクリックで拡大できます。Instagram APIの利用規約については、下記ページをご確認下さい。

管理画面の確認

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

「アプリケーションを管理」という画面に進みました。ここが、Instagram APIを利用する上で拠点となるページなので、1クリックでアクセスできるようにブックマークしておくと便利です。ここには登録したアプリケーションが掲載されていきます。まずは1つ目のアプリケーションを登録してみましょう。「新しいアプリケーションを登録」をクリックして下さい。

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

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

アプリケーションの情報入力画面に移動します。APIを使ってどんなアプリケーションを作成するのか、情報を入力していきます。初回は個人的なテスト用アプリケーションだと思うので、サンプル画像のように大まかな内容でかまいません。「OAuth redirect_uri」には、後ほど作成する「アプリケーション認証用プログラム」の設置先URLを入力して下さいね。全て入力したら、Captcha(画像の文字をフォームに入力する)を設定後、「Register」をクリックします。画像はクリックで拡大できます。

セキュリティ関連の設定
セキュリティ関連の設定

上部の「Security」というタブを選択して下さい。セキュリティの設定項目が表示されます。とりあえずは、「Disable implicit OAuth」にはチェックを入れておき、また、「まだ未段階」という意味で「Enforce signed header」にはチェックを入れないでおいて下さい。

非常にざっくり説明すると、前者にチェックを入れるとクライアント側(JavaScriptなど)だけで認証することができなくなります。後者にチェックを入れると、APIリクエストに「独自の署名」が必要になります。後者について興味のある方は「Enforce signed headerを有効にする」の章をご参考下さい。webサービスのユーザーが増え始め、人気サービスになってから意識すればいいレベルのことだと思います。2つの設定は、いつでも変更できます。

クライアントID、クライアントシークレットの確認

クライアントID、クライアントシークレットを確認する
クライアントID、クライアントシークレットを確認する

アプリの登録に成功すると、一覧画面に登録したアプリの情報が加わります。この内、「クライアントID(CLIENT ID)」「クライアントシークレット(CLIENT SECRET)」が、APIリクエストの上で必要になってくるので、誰にも知られないように管理(メモ)して下さいね!画像はクリックで拡大できます。

アクセストークンの取得

前章までで、APIの利用に必要な「クライアントID」「クライアントシークレット」を取得しました。続いてこの章では、それらを利用して、ユーザーデータの読み込みなどするために必要な「アクセストークン」を取得します!これらを取得するには「OAuth認証」を行なう必要があります。

OAuth認証の仕組み

Instagramの認証は、OAuth2.0という規格を採用しています。詳しい流れなどについては、下記ページの公式ドキュメントをご参考下さい。

スコープ(パーミッション)

Instagram APIには、scopeというパラメータがあります。これは、アプリがユーザーデータにどの程度アクセスできるのか、その「権限」を定めるもので、ユーザーがアプリに許可を与えるかどうかの判断基準にもなります。Instagram APIでwebサービスを作成する際は、適切なscopeを設定しましょう。

basic
ユーザーに関するデータを読み込むことができます。
comments
コメントを書き込んだり、削除したりできます。
relationships
フォローしたり、アンフォローしたりできます。
likes
作品にライクを付けたり、取り消したりできます。

スコープを設定する方法

スコープを設定するには、ユーザーを「アプリケーション認証画面」にリダイレクトさせる際の、リクエストURLのscopeパラメータに含めます。複数指定する際は半角スペースをURLエンコードした半角プラス(+)で区切って下さい。

scope=basic+comments+likes

サンプルプログラム

早速ですが、OAuth2.0認証を利用して、Instagramでアプリケーション認証を行なうためのサンプルプログラムを紹介します。$redirect_uriには、「アプリケーション登録」の際に「OAuth redirect_uri」に入力したURLと同じものを設定して下さい。あらかじめ、起動したURLが設定されるようになっていますが、不具合が出る場合は、直接のURLを指定して下さいね。scopeを設定する際の区切り文字は、URLエンコード済みの+で区切って下さいね。最初はテスト用なので全ての権限を持たせましょう。

PHP

<?php

	// 設定
	$client_id = '' ;		// クライアントID
	$client_secret = '' ;		// クライアントシークレット
	$redirect_uri = explode( '?' , ( !isset($_SERVER['HTTPS']) || empty($_SERVER['HTTPS']) ? 'http://' : 'https://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] )[0] ;		// このプログラムを設置するURL
	$scope = 'basic+comments+relationships+likes' ;		// スコープ

	// セッションスタート
	session_start() ;

	// HTML用
	$html = '' ;

	// [手順2] リクエストトークン($_GET["code"])とアクセストークンの交換
	if( isset($_GET['code']) && !empty($_GET['code']) && isset($_SESSION['state']) && !empty($_SESSION['state']) && isset($_GET['state']) && !empty($_GET['state']) && $_SESSION['state'] == $_GET['state'] )
	{
		// リクエスト用のコンテキストを作成
		$context = array(
			'http' => array(
				'method' => 'POST' ,
				'content' => http_build_query( array(
					'client_id' => $client_id ,
					'client_secret' => $client_secret ,
					'grant_type' => 'authorization_code' ,
					'redirect_uri' => $redirect_uri ,
					'code' => $_GET['code'] ,
				) ) ,
			) ,
		) ;

		// CURLを使ってリクエスト
		$curl = curl_init() ;

		// オプションのセット
		curl_setopt( $curl , CURLOPT_URL , 'https://api.instagram.com/oauth/access_token' ) ;
		curl_setopt( $curl , CURLOPT_HEADER, 1 ) ; 
		curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , $context['http']['method'] ) ;			// メソッド
		curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ;								// 証明書の検証を行わない
		curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ;								// curl_execの結果を文字列で返す
		curl_setopt( $curl , CURLOPT_POSTFIELDS , $context['http']['content'] ) ;			// リクエストボディ
		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( !$obj || !isset($obj->user->id) || !isset($obj->user->username) || !isset($obj->user->profile_picture) || !isset($obj->access_token) )
		{
			$error = 'データを上手く取得できませんでした…。' ;
		}
		else
		{
			// 各データを整理
			$user_id = $obj->user->id ;		// ユーザーID
			$user_name = $obj->user->username ;		// ユーザーネーム
			$user_picture = $obj->user->profile_picture ;		// ユーザーアイコン
			$access_token = $obj->access_token ;		// アクセストークン

			// セッション終了
			$_SESSION = array() ;
			session_destroy() ;

			// 出力する
			$html .=  '<h2>実行結果</h2>' ;
			$html .=  '<dl>' ;
			$html .=  	'<dt>ユーザーID</dt>' ;
			$html .=  		'<dd>' . $user_id . '</dd>' ;
			$html .=  	'<dt>ユーザー名</dt>' ;
			$html .=  		'<dd>' . $user_name . '</dd>' ;
			$html .=  	'<dt>アイコン画像</dt>' ;
			$html .=  		'<dd><img class="_img" src="' . $user_picture . '"></dd>' ;
			$html .=  	'<dt>アクセストークン</dt>' ;
			$html .=  		'<dd>' . $access_token . '</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>' ;
	}

	// [手順1] 初回アクセスの場合、ユーザーをアプリ認証画面へアクセスさせる
	else
	{
		// CSRF対策
		session_regenerate_id( true ) ;
		$state = sha1( uniqid( mt_rand() , true ) ) ;
		$_SESSION['state'] = $state ;

		// リダイレクトさせる
		header( 'Location: https://api.instagram.com/oauth/authorize/?client_id=' . $client_id . '&redirect_uri=' . rawurlencode( $redirect_uri ) . '&scope=' . $scope . '&response_type=code&state=' . $state ) ;

		exit ;
	}

	// エラー時の処理
	if( isset($error) || !empty($error) )
	{
		$html = '<p><mark>' . $error . '</mark>もう一度、認証をするには、<a href="' . explode( '?' , $_SERVER['REQUEST_URI'] )[0] . '">こちら</a>をクリックして下さい。</p>' ;
	}

?>

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

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

アプリケーション認証の流れ

それでは、サンプルプログラムを使って、Instagramのアプリケーション認証の流れを見ていきましょう。サンプルプログラムがこのイメージ通りに動かない場合は、設定項目を見直して下さい。

アプリケーション認証画面

アプリケーション認証画面
アプリケーション認証画面

プログラムを起動すると、ユーザーは必要なパラメータを付けて指定のURL(アプリケーション認証画面)にリダイレクトされ、ここで、アプリケーションの連携を許可します。設定した「アプリケーション名」や「権限(scope)」が説明の部分に反映されています。アプリケーションを許可する場合は「Authorize」をクリックして下さい。

アクセストークンの発行

ユーザーは「許可」をすると、リクエストトークン(code)をパラメータに付けて$redirect_uriにリダイレクトされます。それを受けて、サンプルプログラムはリクエストトークンを付けたパラメータ($_GET['code'])を指定のURLに送ってアクセストークンを取得し(リクエストトークンとアクセストークンの交換)、ブラウザにアクセストークンを出力しています。この「アクセストークン」は、以降のサンプルプログラムで利用するので、誰にも知られないように管理(メモ)して下さい。

Instagram APIを利用して、不特定多数のユーザー向けにwebサービスを作成する場合は、ブラウザに出力するのではなく、ユーザーIDとアクセストークン(念のため暗号化)を関連づけて、データベースに保存するシステム作りが必要になってきます。

Instagramの「ユーザーネーム」と「ユーザーID」の違いについて

Instagramのプロフィール
Instagramのプロフィール

Instagramのユーザーデータには、「名前」「ユーザーネーム」「ユーザーID」という異なるデータが含まれています。これからAPIを利用する上で、これらの概念を混同しないように、ざっくりですが説明をしておきます。

まず「名前」は主にブラウザに出力される名前で、私の場合だったら「あらゆ」です。次に「ユーザーネーム」ですが、これは「外向けのID」と言えば分かりやすいでしょうか。Twitterでいう「スクリーンネーム(@arayutw)」のことです。主にプロフィールページのパーマリンクURLやタイムライン上のラベルなどに利用されます。私の場合だったら「arayutw」です。このユーザーネームは一意ですが変更可能です。

最後に、開発者にとって最も重要なのが「ユーザーID」です。これは、「外向け」の「ユーザーネーム」に対して、実質的なIDで、ユーザーのあらゆるデータがこのIDを元に管理されていて、このIDは変更されることがありません。ユーザーに関するデータの呼び出しは基本的にこの「ユーザーID」を指定することになります。私の場合は「2056527147」です。

ユーザー [User]

前章までで、「クライアントID」「クライアントシークレット」「アクセストークン」を取得してきました。ここからは、それらを利用して、API経由で色々なデータを取得してみましょう。「ユーザーデータ」に関する公式ドキュメントは下記ページをご参考下さい。

プロフィールの取得

まずは「ユーザープロフィール」の取得方法を紹介します。

リクエスト方法

ユーザープロフィールを取得するには、下記のように組み立てたURLに、GETメソッドでリクエストを送ります。パラメータには「アクセストークン」を指定して下さい。なお、「ユーザーID」にselfを指定すると、「アクセストークンの持ち主」のデータを取得することができて手軽です。

GET https://api.instagram.com/v1/users/{ユーザーID}/?access_token={アクセストークン}

取得できるJSON

取得できるJSONデータの構造は下記の通りです。dataプロパティにプロフィール情報が、その中のcountプロパティには「数」に関する情報が含まれています。青文字でコメントを付けてあります。

JSON

{"meta":{"code":200},"data":{"username":"arayutw","bio":"","website":"","profile_picture":"https:\/\/igcdn-photos-b-a.akamaihd.net\/hphotos-ak-xaf1\/t51.2885-19\/11376682_1634451346768409_1710840484_a.jpg","full_name":"\u3042\u3089\u3086","counts":{"media":1,"followed_by":1,"follows":1},"id":"2056527147"}}

サンプルプログラム

下記がユーザープロフィールを取得するためのサンプルプログラムです。3〜4行目の$access_token$user_idを指定して、起動してみて下さい。

PHP

<?php

	// 設定項目
	$user_id = 'self' ;		// ユーザーID
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/users/' . $user_id . '/?access_token=' . $access_token ;		// リクエスト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を作成
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj || !isset($obj->data->id) || !isset($obj->data->username) )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		// 各データの整理
		$id = $obj->data->id ;		// ユーザーID
		$username = $obj->data->username ;		// ユーザー名
		$bio = ( isset( $obj->data->bio ) ) ? $obj->data->bio : '' ;		// 紹介文
		$website = ( isset( $obj->data->website ) ) ? $obj->data->website : '' ;		// ウェブサイト
		$profile_picture = ( isset( $obj->data->profile_picture ) ) ? $obj->data->profile_picture : '' ;		// アイコン画像
		$full_name = ( isset( $obj->data->full_name ) ) ? $obj->data->full_name : '' ;		// フルネーム
		$media = $obj->data->counts->media ;		// 投稿数
		$follows = $obj->data->counts->follows ;		// フォロー数
		$followed_by = $obj->data->counts->followed_by ;		// フォロワー数

		// ブラウザに出力
		$html .= '<dl>' ;
		$html .= 	'<dt>ユーザーID</dt>' ;
		$html .= 		'<dd>' . $id . '</dd>' ;
		$html .= 	'<dt>ユーザー名</dt>' ;
		$html .= 		'<dd>' . $username . '</dd>' ;

		// フルネーム
		if( $full_name )
		{
			$html .= 	'<dt>フルネーム</dt>' ;
			$html .= 		'<dd>' . $full_name . '</dd>' ;
		}

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

		// ウェブサイト
		if( $website )
		{
			$html .= 	'<dt>ウェブサイト</dt>' ;
			$html .= 		'<dd><a href="' . $website . '" target="_blank">' . $website . '</a></dd>' ;
		}

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

		$html .= 	'<dt>投稿数</dt>' ;
		$html .= 		'<dd>' . $media . '</dd>' ;
		$html .= 	'<dt>フォロー数</dt>' ;
		$html .= 		'<dd>' . $follows . '</dd>' ;
		$html .= 	'<dt>フォロワー数</dt>' ;
		$html .= 		'<dd>' . $followed_by . '</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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

ユーザーのキーワード検索

指定したキーワードでユーザーを検索することができます。ただ、日本語キーワードには対応していないようです…。ユーザーを検索するには下記URLに、GETメソッドでリクエストを送ります。

リクエスト方法

GET https://api.instagram.com/v1/users/search

パラメータ

access_token
アクセストークン。
q
キーワード。日本語は非対応です。
count
取得件数。指定しない場合は20

取得できるJSON

JSON

{"meta":{"code":200},"data":[{"username":"syncer","profile_picture":"https:\/\/instagramimages-a.akamaihd.net\/profiles\/profile_23583522_75sq_1329261929.jpg","id":"23583522","full_name":""},{"username":"ms_migo","profile_picture":"https:\/\/igcdn-photos-h-a.akamaihd.net\/hphotos-ak-xat1\/t51.2885-19\/10724772_439966949496199_1843976912_a.jpg","id":"349814023","full_name":"SYNCERE"},{"username":"lyvnmylyfe","profile_picture":"https:\/\/igcdn-photos-g-a.akamaihd.net\/hphotos-ak-xaf1\/t51.2885-19\/s150x150\/11324517_1624222827820390_2004796126_a.jpg","id":"1418194392","full_name":"SYNCERE"}]}

サンプルプログラム

PHP

<?php

	// 設定項目
	$q = 'syncer' ;		// 検索キーワード
	$count = 3 ;		// 取得件数
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/users/search?access_token=' . $access_token . '&q=' . rawurlencode( $q ) . '&count=' . $count ;		// リクエスト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を作成
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj || !isset($obj->data) )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		foreach( $obj->data as $item )
		{
			// 各データの整理
			$id = $item->id ;		// ユーザーID
			$username = $item->username ;		// ユーザー名
			$bio = ( isset( $item->bio ) ) ? $item->bio : '' ;		// 紹介文
			$website = ( isset( $item->website ) ) ? $item->website : '' ;		// ウェブサイト
			$profile_picture = ( isset( $item->profile_picture ) ) ? $item->profile_picture : '' ;		// アイコン画像
			$full_name = ( isset( $item->full_name ) ) ? $item->full_name : '' ;		// フルネーム

			// ブラウザに出力
			$html .= '<dl>' ;
			$html .= 	'<dt>ユーザーID</dt>' ;
			$html .= 		'<dd>' . $id . '</dd>' ;
			$html .= 	'<dt>ユーザー名</dt>' ;
			$html .= 		'<dd>' . $username . '</dd>' ;

			// フルネーム
			if( $full_name )
			{
				$html .= 	'<dt>フルネーム</dt>' ;
				$html .= 		'<dd>' . $full_name . '</dd>' ;
			}

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

			// ウェブサイト
			if( $website )
			{
				$html .= 	'<dt>ウェブサイト</dt>' ;
				$html .= 		'<dd><a href="' . $website . '" target="_blank">' . $website . '</a></dd>' ;
			}

			// アイコン画像
			if( $profile_picture )
			{
				$html .= 	'<dt>アイコン画像</dt>' ;
				$html .= 		'<dd><img class="_img" src="' . $profile_picture . '"></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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

フォローしているユーザーを取得

指定したIDのユーザーがフォローしているユーザーリストを取得します。下記URLに、GETメソッドでリクエストを送って下さい。relationshipsの権限が必要です。

リクエスト方法

GET https://api.instagram.com/v1/users/{ユーザーID}/follows

パラメータ

access_token
アクセストークン。
cursor
指定したカーソルのページを取得する。JSONのpaginationプロパティに含まれる。
count
取得件数。指定しない場合は20

取得できるJSON

JSON

{"pagination":{"next_url":"https:\/\/api.instagram.com\/v1\/users\/2056527147\/follows?access_token=2056527147.5b49f97.b487ae277e6445e3095d4427f49164a3\u0026count=1\u0026cursor=1437977538993","next_cursor":"1437977538993"},"meta":{"code":200},"data":[{"username":"cocacola","profile_picture":"https:\/\/instagramimages-a.akamaihd.net\/profiles\/profile_249655166_75sq_1355855979.jpg","id":"249655166","full_name":"Coca-Cola"},{"username":"syncerjp","profile_picture":"https:\/\/igcdn-photos-h-a.akamaihd.net\/hphotos-ak-xfa1\/t51.2885-19\/11271944_1663069317259287_313236559_a.jpg","id":"1349593219","full_name":"Syncer"}]}

サンプルプログラム

PHP

<?php

	// 設定項目
	$user_id = 'self' ;		// ユーザーID
	$count = 10 ;		// 取得件数
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/users/' . $user_id . '/follows?access_token=' . $access_token . '&count=' . $count ;		// リクエスト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を作成
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj || !isset($obj->data) )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		foreach( $obj->data as $item )
		{
			// 各データの整理
			$id = $item->id ;		// ユーザーID
			$username = $item->username ;		// ユーザー名
			$bio = ( isset( $item->bio ) ) ? $item->bio : '' ;		// 紹介文
			$website = ( isset( $item->website ) ) ? $item->website : '' ;		// ウェブサイト
			$profile_picture = ( isset( $item->profile_picture ) ) ? $item->profile_picture : '' ;		// アイコン画像
			$full_name = ( isset( $item->full_name ) ) ? $item->full_name : '' ;		// フルネーム

			// ブラウザに出力
			$html .= '<dl>' ;
			$html .= 	'<dt>ユーザーID</dt>' ;
			$html .= 		'<dd>' . $id . '</dd>' ;
			$html .= 	'<dt>ユーザー名</dt>' ;
			$html .= 		'<dd>' . $username . '</dd>' ;

			// フルネーム
			if( $full_name )
			{
				$html .= 	'<dt>フルネーム</dt>' ;
				$html .= 		'<dd>' . $full_name . '</dd>' ;
			}

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

			// ウェブサイト
			if( $website )
			{
				$html .= 	'<dt>ウェブサイト</dt>' ;
				$html .= 		'<dd><a href="' . $website . '" target="_blank">' . $website . '</a></dd>' ;
			}

			// アイコン画像
			if( $profile_picture )
			{
				$html .= 	'<dt>アイコン画像</dt>' ;
				$html .= 		'<dd><img class="_img" src="' . $profile_picture . '"></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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

フォロワーを取得

指定したIDのユーザーの、フォロワーリストを取得します。下記URLに、GETメソッドでリクエストを送って下さい。relationshipsの権限が必要です。

リクエスト方法

GET https://api.instagram.com/v1/users/{ユーザーID}/followed-by

パラメータ

access_token
アクセストークン。
cursor
指定したカーソルのページを取得する。JSONのpaginationプロパティに含まれる。
count
取得件数。指定しない場合は20

取得できるJSON

JSON

{"pagination":{"next_url":"https:\/\/api.instagram.com\/v1\/users\/2056527147\/follows?access_token=2056527147.5b49f97.b487ae277e6445e3095d4427f49164a3\u0026count=1\u0026cursor=1437977538993","next_cursor":"1437977538993"},"meta":{"code":200},"data":[{"username":"syncerjp","profile_picture":"https:\/\/igcdn-photos-h-a.akamaihd.net\/hphotos-ak-xfa1\/t51.2885-19\/11271944_1663069317259287_313236559_a.jpg","id":"1349593219","full_name":"Syncer"}]}

サンプルプログラム

PHP

<?php

	// 設定項目
	$user_id = 'self' ;		// ユーザーID
	$count = 3 ;		// 取得件数
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/users/' . $user_id . '/followed-by?access_token=' . $access_token . '&count=' . $count ;		// リクエスト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を作成
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj || !isset($obj->data) )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		foreach( $obj->data as $item )
		{
			// 各データの整理
			$id = $item->id ;		// ユーザーID
			$username = $item->username ;		// ユーザー名
			$bio = ( isset( $item->bio ) ) ? $item->bio : '' ;		// 紹介文
			$website = ( isset( $item->website ) ) ? $item->website : '' ;		// ウェブサイト
			$profile_picture = ( isset( $item->profile_picture ) ) ? $item->profile_picture : '' ;		// アイコン画像
			$full_name = ( isset( $item->full_name ) ) ? $item->full_name : '' ;		// フルネーム

			// ブラウザに出力
			$html .= '<dl>' ;
			$html .= 	'<dt>ユーザーID</dt>' ;
			$html .= 		'<dd>' . $id . '</dd>' ;
			$html .= 	'<dt>ユーザー名</dt>' ;
			$html .= 		'<dd>' . $username . '</dd>' ;

			// フルネーム
			if( $full_name )
			{
				$html .= 	'<dt>フルネーム</dt>' ;
				$html .= 		'<dd>' . $full_name . '</dd>' ;
			}

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

			// ウェブサイト
			if( $website )
			{
				$html .= 	'<dt>ウェブサイト</dt>' ;
				$html .= 		'<dd><a href="' . $website . '" target="_blank">' . $website . '</a></dd>' ;
			}

			// アイコン画像
			if( $profile_picture )
			{
				$html .= 	'<dt>アイコン画像</dt>' ;
				$html .= 		'<dd><img class="_img" src="' . $profile_picture . '"></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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

リクエスト(フォロー申請)中のユーザーを取得

Instagramでは、プロフィールを非公開にしているユーザーをフォローするのに、「リクエスト」を送って承認される必要があります。このAPIでは、自分にリクエストを送っているユーザーリストを取得することができます。「アクセストークンの持ち主」のデータしか取得できないのでご注意下さい。

リクエスト方法

GET https://api.instagram.com/v1/users/self/requested-by

パラメータ

access_token
アクセストークン。
cursor
指定したカーソルのページを取得する。JSONのpaginationプロパティに含まれる。
count
取得件数。指定しない場合は20

取得できるJSON

JSON

{"meta":{"code":200},"data":[{"username":"arayutw","profile_picture":"https:\/\/igcdn-photos-b-a.akamaihd.net\/hphotos-ak-xaf1\/t51.2885-19\/11376682_1634451346768409_1710840484_a.jpg","id":"2056527147","full_name":"\u3042\u3089\u3086"}]}

サンプルプログラム

PHP

<?php

	// 設定項目
	$count = 3 ;		// 取得件数
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/users/self/requested-by?access_token=' . $access_token . '&count=' . $count ;		// リクエスト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を作成
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj || !isset($obj->data) )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		foreach( $obj->data as $item )
		{
			// 各データの整理
			$id = $item->id ;		// ユーザーID
			$username = $item->username ;		// ユーザー名
			$bio = ( isset( $item->bio ) ) ? $item->bio : '' ;		// 紹介文
			$website = ( isset( $item->website ) ) ? $item->website : '' ;		// ウェブサイト
			$profile_picture = ( isset( $item->profile_picture ) ) ? $item->profile_picture : '' ;		// アイコン画像
			$full_name = ( isset( $item->full_name ) ) ? $item->full_name : '' ;		// フルネーム

			// ブラウザに出力
			$html .= '<dl>' ;
			$html .= 	'<dt>ユーザーID</dt>' ;
			$html .= 		'<dd>' . $id . '</dd>' ;
			$html .= 	'<dt>ユーザー名</dt>' ;
			$html .= 		'<dd>' . $username . '</dd>' ;

			// フルネーム
			if( $full_name )
			{
				$html .= 	'<dt>フルネーム</dt>' ;
				$html .= 		'<dd>' . $full_name . '</dd>' ;
			}

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

			// ウェブサイト
			if( $website )
			{
				$html .= 	'<dt>ウェブサイト</dt>' ;
				$html .= 		'<dd><a href="' . $website . '" target="_blank">' . $website . '</a></dd>' ;
			}

			// アイコン画像
			if( $profile_picture )
			{
				$html .= 	'<dt>アイコン画像</dt>' ;
				$html .= 		'<dd><img class="_img" src="' . $profile_picture . '"></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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

JSONの各プロパティの説明

JSONのユーザーデータに含まれている各プロパティの説明です。エンドポイントによって、含まれるデータが違うので、ご注意下さい。

code
ステータスコード。200ならリクエストが成功。
id
ユーザーID。
username
ユーザーネーム。
bio
プロフィール説明文。
website
ウェブサイト。
profile_picture
アイコン画像のURL。
full_name
ユーザーの名前。
media
写真、動画の合計投稿数。
follows
フォロー数。
followed_by
フォロワー数。

メディア [Media]

投稿した写真と動画、いわゆる「メディア」のリストデータを取得してみましょう。Instagram APIを利用する上で、最も利用する機会が多いAPIだと思います。メディアリストを取得するには、数種類の方法が存在します。まずはそれらの違いを説明していきます。

ホームタイムラインの取得

まず自分と自分がフォローしているユーザーのメディアリスト、いわゆるタイムラインのデータを取得する方法です。

リクエスト方法

GET https://api.instagram.com/v1/users/self/feed

パラメータ

access_token
アクセストークン。
count
取得件数。指定しない場合は20
min_id
メディアIDを指定する。指定すると、このIDより「未来」に投稿されたメディアを取得する。
max_id
メディアIDを指定する。指定すると、このIDより「過去」に投稿されたメディアを取得する。

サンプルプログラム

PHP

<?php

	// 設定項目
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/users/self/feed?access_token=' . $access_token ;		// リクエスト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を作成
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj || !isset($obj->data) )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		foreach( $obj->data as $item )
		{
			// 各データ
			$id = $item->id ;		// メディアID
			$type = $item->type ;		// メディアタイプ
			$link = $item->link ;		// リンク
			$images = $item->images->low_resolution->url ;		// 画像
			$date = $item->created_time ;		// 日付 (UNIX TIMESTAMP)
			$likes = ( isset($item->likes->count) ) ? $item->likes->count : 0 ;		// ライク数
			$comments = ( isset($item->comments->count) ) ? $item->comments->count : 0 ;		// コメント数

			// ユーザー情報
			$user_id = $item->user->id ;		// 投稿者ID
			$user_name = $item->user->username ;		// 投稿者のユーザーネーム
			$user_full_name = ( isset($item->user->full_name) ) ? $item->user->full_name : '' ;		// 投稿者のユーザーネーム
			$user_profile_picture = ( isset( $item->user->profile_picture ) ) ? $item->user->profile_picture : '' ;		// アイコン画像

			// 場所情報
			$location_id = ( isset($item->location->id) ) ? $item->location->id : '' ;		// 場所ID
			$location_name = ( isset($item->location->name) ) ? $item->location->name : '' ;		// 場所名
			$location_lat = ( isset($item->location->latitude) ) ? $item->location->latitude : '' ;		// 緯度
			$location_long = ( isset($item->location->longitude) ) ? $item->location->longitude : '' ;		// 経度

			// タグ情報
			$tags = ( isset($item->tags) && !empty($item->tags) ) ? '#' . implode( '、#' , (array)$item->tags ) : '' ;

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

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

			// フルネームがある場合
			if( $user_full_name )
			{
				$html .= 	'<dt>投稿者のフルネーム</dt>' ;
				$html .= 		'<dd>' . $user_full_name . '</dd>' ;
			}

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

			$html .= 	'<dt>メディアID</dt>' ;
			$html .= 		'<dd>' . $id . '</dd>' ;
			$html .= 	'<dt>メディアタイプ</dt>' ;
			$html .= 		'<dd>' . $type . '</dd>' ;
			$html .= 	'<dt>メディアページ</dt>' ;
			$html .= 		'<dd><a href="' . $link . '" target="_blank">' . $link . '</a></dd>' ;
			$html .= 	'<dt>メディア</dt>' ;

			// ユーザーのタグ付けがある場合
			if( isset($item->users_in_photo) && !empty($item->users_in_photo) )
			{
				$html .= 		'<dd>' ;
				$html .= 			'<div style="position:relative; top:0; left:0; overflow:hidden; width:250px; height:250px;">' ;
				$html .= 				'<img src="' . $images . '" style="width:250px; height:250px;">' ;

				// タグ付けされたユーザーを配置していく
				foreach( $item->users_in_photo as $user )
				{
					if( isset($user->user->username) && isset($user->user->profile_picture) && isset($user->position->y) && isset($user->position->x) )
					{
						$x = ( 250 * $user->position->x ) - 15 ;
						$y = ( 250 * $user->position->y ) - 15 ;
						$html .= '<img src="' . $user->user->profile_picture . '" title="' . $user->user->username . '" width="30" height="30" style="position:absolute; top:' . $x . 'px; left:' . $y . 'px; vertical-align:bottom;">' ;
					}
				}

				$html .= 			'</div>' ;
				$html .= 			'<p>※' . count( $item->users_in_photo ) . '人のユーザーがタグ付けされています。</p>' ;
				$html .= 		'</dd>' ;
			}
			else
			{
				$html .= 		'<dd><img class="_img" src="' . $images . '"></dd>' ;
			}

			$html .= 	'<dt>投稿日時</dt>' ;
			$html .= 		'<dd>' . $date . '</dd>' ;
			$html .= 	'<dt>ライク数</dt>' ;
			$html .= 		'<dd>' . $likes . '</dd>' ;
			$html .= 	'<dt>コメント数</dt>' ;
			$html .= 		'<dd>' . $comments . '</dd>' ;

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


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


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

			// ハッシュタグがある場合
			if( $tags )
			{
				$html .= 	'<dt>タグ情報</dt>' ;
				$html .= 		'<dd>' . $tags . '</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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

ユーザータイムラインの取得

指定したユーザーだけのメディアリストを取得するのにも利用します。

リクエスト方法

下記のように組み立てたURLに、GETメソッドでリクエストを送ります。なお、ユーザーIDにselfを指定すると、「アクセストークンの持ち主」のデータを取得します。

GET https://api.instagram.com/v1/users/{ユーザーID}/media/recent/

パラメータ

access_token
アクセストークン。
client_id
クライアントID。
count
取得件数。指定しない場合は20
min_id
メディアIDを指定する。指定すると、このIDより「未来」に投稿されたメディアを取得する。
max_id
メディアIDを指定する。指定すると、このIDより「過去」に投稿されたメディアを取得する。
min_timestamp
日時をUNIX TIMESTAMPで指定する。指定すると、この日時より「未来」に投稿されたメディアを取得する。
max_timestamp
日時をUNIX TIMESTAMPで指定する。指定すると、この日時より「過去」に投稿されたメディアを取得する。

サンプルプログラム

PHP

<?php

	// 設定項目
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/users/self/media/recent/?access_token=' . $access_token ;		// リクエスト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を作成
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj || !isset($obj->data) )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		foreach( $obj->data as $item )
		{
			// 各データ
			$id = $item->id ;		// メディアID
			$type = $item->type ;		// メディアタイプ
			$link = $item->link ;		// リンク
			$images = $item->images->low_resolution->url ;		// 画像
			$date = $item->created_time ;		// 日付 (UNIX TIMESTAMP)
			$likes = ( isset($item->likes->count) ) ? $item->likes->count : 0 ;		// ライク数
			$comments = ( isset($item->comments->count) ) ? $item->comments->count : 0 ;		// コメント数

			// ユーザー情報
			$user_id = $item->user->id ;		// 投稿者ID
			$user_name = $item->user->username ;		// 投稿者のユーザーネーム
			$user_full_name = ( isset($item->user->full_name) ) ? $item->user->full_name : '' ;		// 投稿者のユーザーネーム
			$user_profile_picture = ( isset( $item->user->profile_picture ) ) ? $item->user->profile_picture : '' ;		// アイコン画像

			// 場所情報
			$location_id = ( isset($item->location->id) ) ? $item->location->id : '' ;		// 場所ID
			$location_name = ( isset($item->location->name) ) ? $item->location->name : '' ;		// 場所名
			$location_lat = ( isset($item->location->latitude) ) ? $item->location->latitude : '' ;		// 緯度
			$location_long = ( isset($item->location->longitude) ) ? $item->location->longitude : '' ;		// 経度

			// タグ情報
			$tags = ( isset($item->tags) && !empty($item->tags) ) ? '#' . implode( '、#' , (array)$item->tags ) : '' ;

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

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

			// フルネームがある場合
			if( $user_full_name )
			{
				$html .= 	'<dt>投稿者のフルネーム</dt>' ;
				$html .= 		'<dd>' . $user_full_name . '</dd>' ;
			}

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

			$html .= 	'<dt>メディアID</dt>' ;
			$html .= 		'<dd>' . $id . '</dd>' ;
			$html .= 	'<dt>メディアタイプ</dt>' ;
			$html .= 		'<dd>' . $type . '</dd>' ;
			$html .= 	'<dt>メディアページ</dt>' ;
			$html .= 		'<dd><a href="' . $link . '" target="_blank">' . $link . '</a></dd>' ;
			$html .= 	'<dt>メディア</dt>' ;

			// ユーザーのタグ付けがある場合
			if( isset($item->users_in_photo) && !empty($item->users_in_photo) )
			{
				$html .= 		'<dd>' ;
				$html .= 			'<div style="position:relative; top:0; left:0; overflow:hidden; width:250px; height:250px;">' ;
				$html .= 				'<img src="' . $images . '" style="width:250px; height:250px;">' ;

				// タグ付けされたユーザーを配置していく
				foreach( $item->users_in_photo as $user )
				{
					if( isset($user->user->username) && isset($user->user->profile_picture) && isset($user->position->y) && isset($user->position->x) )
					{
						$x = ( 250 * $user->position->x ) - 15 ;
						$y = ( 250 * $user->position->y ) - 15 ;
						$html .= '<img src="' . $user->user->profile_picture . '" title="' . $user->user->username . '" width="30" height="30" style="position:absolute; top:' . $x . 'px; left:' . $y . 'px; vertical-align:bottom;">' ;
					}
				}

				$html .= 			'</div>' ;
				$html .= 			'<p>※' . count( $item->users_in_photo ) . '人のユーザーがタグ付けされています。</p>' ;
				$html .= 		'</dd>' ;
			}
			else
			{
				$html .= 		'<dd><img class="_img" src="' . $images . '"></dd>' ;
			}

			$html .= 	'<dt>投稿日時</dt>' ;
			$html .= 		'<dd>' . $date . '</dd>' ;
			$html .= 	'<dt>ライク数</dt>' ;
			$html .= 		'<dd>' . $likes . '</dd>' ;
			$html .= 	'<dt>コメント数</dt>' ;
			$html .= 		'<dd>' . $comments . '</dd>' ;

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


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


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

			// ハッシュタグがある場合
			if( $tags )
			{
				$html .= 	'<dt>タグ情報</dt>' ;
				$html .= 		'<dd>' . $tags . '</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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

ライクを付けた作品の取得

「アクセストークンの持ち主」が、ライク(いいね!)を付けたメディアリストを取得することができます。

リクエスト方法

下記URLに、GETメソッドでリクエストを送って下さい。likesの権限が必要です。

GET https://api.instagram.com/v1/users/self/media/liked

パラメータ

access_token
アクセストークン。
count
取得件数。指定しない場合は20
max_like_id
メディアID(ライクを付けたもの限定)を指定する。指定すると、このIDより「過去」に投稿されたメディアを取得する。

サンプルプログラム

PHP

<?php

	// 設定項目
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/users/self/media/liked?access_token=' . $access_token ;		// リクエスト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を作成
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj || !isset($obj->data) )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		foreach( $obj->data as $item )
		{
			// 各データ
			$id = $item->id ;		// メディアID
			$type = $item->type ;		// メディアタイプ
			$link = $item->link ;		// リンク
			$images = $item->images->low_resolution->url ;		// 画像
			$date = $item->created_time ;		// 日付 (UNIX TIMESTAMP)
			$likes = ( isset($item->likes->count) ) ? $item->likes->count : 0 ;		// ライク数
			$comments = ( isset($item->comments->count) ) ? $item->comments->count : 0 ;		// コメント数

			// ユーザー情報
			$user_id = $item->user->id ;		// 投稿者ID
			$user_name = $item->user->username ;		// 投稿者のユーザーネーム
			$user_full_name = ( isset($item->user->full_name) ) ? $item->user->full_name : '' ;		// 投稿者のユーザーネーム
			$user_profile_picture = ( isset( $item->user->profile_picture ) ) ? $item->user->profile_picture : '' ;		// アイコン画像

			// 場所情報
			$location_id = ( isset($item->location->id) ) ? $item->location->id : '' ;		// 場所ID
			$location_name = ( isset($item->location->name) ) ? $item->location->name : '' ;		// 場所名
			$location_lat = ( isset($item->location->latitude) ) ? $item->location->latitude : '' ;		// 緯度
			$location_long = ( isset($item->location->longitude) ) ? $item->location->longitude : '' ;		// 経度

			// タグ情報
			$tags = ( isset($item->tags) && !empty($item->tags) ) ? '#' . implode( '、#' , (array)$item->tags ) : '' ;

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

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

			// フルネームがある場合
			if( $user_full_name )
			{
				$html .= 	'<dt>投稿者のフルネーム</dt>' ;
				$html .= 		'<dd>' . $user_full_name . '</dd>' ;
			}

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

			$html .= 	'<dt>メディアID</dt>' ;
			$html .= 		'<dd>' . $id . '</dd>' ;
			$html .= 	'<dt>メディアタイプ</dt>' ;
			$html .= 		'<dd>' . $type . '</dd>' ;
			$html .= 	'<dt>メディアページ</dt>' ;
			$html .= 		'<dd><a href="' . $link . '" target="_blank">' . $link . '</a></dd>' ;
			$html .= 	'<dt>メディア</dt>' ;

			// ユーザーのタグ付けがある場合
			if( isset($item->users_in_photo) && !empty($item->users_in_photo) )
			{
				$html .= 		'<dd>' ;
				$html .= 			'<div style="position:relative; top:0; left:0; overflow:hidden; width:250px; height:250px;">' ;
				$html .= 				'<img src="' . $images . '" style="width:250px; height:250px;">' ;

				// タグ付けされたユーザーを配置していく
				foreach( $item->users_in_photo as $user )
				{
					if( isset($user->user->username) && isset($user->user->profile_picture) && isset($user->position->y) && isset($user->position->x) )
					{
						$x = ( 250 * $user->position->x ) - 15 ;
						$y = ( 250 * $user->position->y ) - 15 ;
						$html .= '<img src="' . $user->user->profile_picture . '" title="' . $user->user->username . '" width="30" height="30" style="position:absolute; top:' . $x . 'px; left:' . $y . 'px; vertical-align:bottom;">' ;
					}
				}

				$html .= 			'</div>' ;
				$html .= 			'<p>※' . count( $item->users_in_photo ) . '人のユーザーがタグ付けされています。</p>' ;
				$html .= 		'</dd>' ;
			}
			else
			{
				$html .= 		'<dd><img class="_img" src="' . $images . '"></dd>' ;
			}

			$html .= 	'<dt>投稿日時</dt>' ;
			$html .= 		'<dd>' . $date . '</dd>' ;
			$html .= 	'<dt>ライク数</dt>' ;
			$html .= 		'<dd>' . $likes . '</dd>' ;
			$html .= 	'<dt>コメント数</dt>' ;
			$html .= 		'<dd>' . $comments . '</dd>' ;

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


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


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

			// ハッシュタグがある場合
			if( $tags )
			{
				$html .= 	'<dt>タグ情報</dt>' ;
				$html .= 		'<dd>' . $tags . '</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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

人気上昇中の作品を取得

Instagram全体で、人気が上昇しているメディアリストを取得することができます。

リクエスト方法

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

GET https://api.instagram.com/v1/media/popular

パラメータ

access_token
アクセストークン。

サンプルプログラム

PHP

<?php

	// 設定項目
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/media/popular?access_token=' . $access_token ;		// リクエスト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を作成
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj || !isset($obj->data) )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		foreach( $obj->data as $item )
		{
			// 各データ
			$id = $item->id ;		// メディアID
			$type = $item->type ;		// メディアタイプ
			$link = $item->link ;		// リンク
			$images = $item->images->low_resolution->url ;		// 画像
			$date = $item->created_time ;		// 日付 (UNIX TIMESTAMP)
			$likes = ( isset($item->likes->count) ) ? $item->likes->count : 0 ;		// ライク数
			$comments = ( isset($item->comments->count) ) ? $item->comments->count : 0 ;		// コメント数

			// ユーザー情報
			$user_id = $item->user->id ;		// 投稿者ID
			$user_name = $item->user->username ;		// 投稿者のユーザーネーム
			$user_full_name = ( isset($item->user->full_name) ) ? $item->user->full_name : '' ;		// 投稿者のユーザーネーム
			$user_profile_picture = ( isset( $item->user->profile_picture ) ) ? $item->user->profile_picture : '' ;		// アイコン画像

			// 場所情報
			$location_id = ( isset($item->location->id) ) ? $item->location->id : '' ;		// 場所ID
			$location_name = ( isset($item->location->name) ) ? $item->location->name : '' ;		// 場所名
			$location_lat = ( isset($item->location->latitude) ) ? $item->location->latitude : '' ;		// 緯度
			$location_long = ( isset($item->location->longitude) ) ? $item->location->longitude : '' ;		// 経度

			// タグ情報
			$tags = ( isset($item->tags) && !empty($item->tags) ) ? '#' . implode( '、#' , (array)$item->tags ) : '' ;

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

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

			// フルネームがある場合
			if( $user_full_name )
			{
				$html .= 	'<dt>投稿者のフルネーム</dt>' ;
				$html .= 		'<dd>' . $user_full_name . '</dd>' ;
			}

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

			$html .= 	'<dt>メディアID</dt>' ;
			$html .= 		'<dd>' . $id . '</dd>' ;
			$html .= 	'<dt>メディアタイプ</dt>' ;
			$html .= 		'<dd>' . $type . '</dd>' ;
			$html .= 	'<dt>メディアページ</dt>' ;
			$html .= 		'<dd><a href="' . $link . '" target="_blank">' . $link . '</a></dd>' ;
			$html .= 	'<dt>メディア</dt>' ;

			// ユーザーのタグ付けがある場合
			if( isset($item->users_in_photo) && !empty($item->users_in_photo) )
			{
				$html .= 		'<dd>' ;
				$html .= 			'<div style="position:relative; top:0; left:0; overflow:hidden; width:250px; height:250px;">' ;
				$html .= 				'<img src="' . $images . '" style="width:250px; height:250px;">' ;

				// タグ付けされたユーザーを配置していく
				foreach( $item->users_in_photo as $user )
				{
					if( isset($user->user->username) && isset($user->user->profile_picture) && isset($user->position->y) && isset($user->position->x) )
					{
						$x = ( 250 * $user->position->x ) - 15 ;
						$y = ( 250 * $user->position->y ) - 15 ;
						$html .= '<img src="' . $user->user->profile_picture . '" title="' . $user->user->username . '" width="30" height="30" style="position:absolute; top:' . $x . 'px; left:' . $y . 'px; vertical-align:bottom;">' ;
					}
				}

				$html .= 			'</div>' ;
				$html .= 			'<p>※' . count( $item->users_in_photo ) . '人のユーザーがタグ付けされています。</p>' ;
				$html .= 		'</dd>' ;
			}
			else
			{
				$html .= 		'<dd><img class="_img" src="' . $images . '"></dd>' ;
			}

			$html .= 	'<dt>投稿日時</dt>' ;
			$html .= 		'<dd>' . $date . '</dd>' ;
			$html .= 	'<dt>ライク数</dt>' ;
			$html .= 		'<dd>' . $likes . '</dd>' ;
			$html .= 	'<dt>コメント数</dt>' ;
			$html .= 		'<dd>' . $comments . '</dd>' ;

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


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


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

			// ハッシュタグがある場合
			if( $tags )
			{
				$html .= 	'<dt>タグ情報</dt>' ;
				$html .= 		'<dd>' . $tags . '</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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

メディアを検索する

「位置情報」「投稿時期」を条件に絞り込んだメディアリストです。

リクエスト方法

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

GET https://api.instagram.com/v1/media/search

パラメータ

access_token
アクセストークン。
lat
緯度。lngとセットで指定する。
lng
経度。latとセットで指定する。
distance
検索する範囲を「メートル」で指定する。latlngとセットで指定する。初期値は1000で、最大値は5000
min_timestamp
日時をUNIX TIMESTAMPで指定する。指定すると、この日時より「未来」に投稿されたメディアを取得する。
max_timestamp
日時をUNIX TIMESTAMPで指定する。指定すると、この日時より「過去」に投稿されたメディアを取得する。

サンプルプログラム

サンプルデモでは、オーストラリアの水族館周辺の位置情報を元に、メディアを検索しています。

PHP

<?php

	// 設定項目
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/media/search?access_token=' . $access_token . '&lat=-31.8267675&lng=115.7378533&distance=300' ;		// リクエスト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を作成
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj || !isset($obj->data) )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		foreach( $obj->data as $item )
		{
			// 各データ
			$id = $item->id ;		// メディアID
			$type = $item->type ;		// メディアタイプ
			$link = $item->link ;		// リンク
			$images = $item->images->low_resolution->url ;		// 画像
			$date = $item->created_time ;		// 日付 (UNIX TIMESTAMP)
			$likes = ( isset($item->likes->count) ) ? $item->likes->count : 0 ;		// ライク数
			$comments = ( isset($item->comments->count) ) ? $item->comments->count : 0 ;		// コメント数

			// ユーザー情報
			$user_id = $item->user->id ;		// 投稿者ID
			$user_name = $item->user->username ;		// 投稿者のユーザーネーム
			$user_full_name = ( isset($item->user->full_name) ) ? $item->user->full_name : '' ;		// 投稿者のユーザーネーム
			$user_profile_picture = ( isset( $item->user->profile_picture ) ) ? $item->user->profile_picture : '' ;		// アイコン画像

			// 場所情報
			$location_id = ( isset($item->location->id) ) ? $item->location->id : '' ;		// 場所ID
			$location_name = ( isset($item->location->name) ) ? $item->location->name : '' ;		// 場所名
			$location_lat = ( isset($item->location->latitude) ) ? $item->location->latitude : '' ;		// 緯度
			$location_long = ( isset($item->location->longitude) ) ? $item->location->longitude : '' ;		// 経度

			// タグ情報
			$tags = ( isset($item->tags) && !empty($item->tags) ) ? '#' . implode( '、#' , (array)$item->tags ) : '' ;

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

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

			// フルネームがある場合
			if( $user_full_name )
			{
				$html .= 	'<dt>投稿者のフルネーム</dt>' ;
				$html .= 		'<dd>' . $user_full_name . '</dd>' ;
			}

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

			$html .= 	'<dt>メディアID</dt>' ;
			$html .= 		'<dd>' . $id . '</dd>' ;
			$html .= 	'<dt>メディアタイプ</dt>' ;
			$html .= 		'<dd>' . $type . '</dd>' ;
			$html .= 	'<dt>メディアページ</dt>' ;
			$html .= 		'<dd><a href="' . $link . '" target="_blank">' . $link . '</a></dd>' ;
			$html .= 	'<dt>メディア</dt>' ;

			// ユーザーのタグ付けがある場合
			if( isset($item->users_in_photo) && !empty($item->users_in_photo) )
			{
				$html .= 		'<dd>' ;
				$html .= 			'<div style="position:relative; top:0; left:0; overflow:hidden; width:250px; height:250px;">' ;
				$html .= 				'<img src="' . $images . '" style="width:250px; height:250px;">' ;

				// タグ付けされたユーザーを配置していく
				foreach( $item->users_in_photo as $user )
				{
					if( isset($user->user->username) && isset($user->user->profile_picture) && isset($user->position->y) && isset($user->position->x) )
					{
						$x = ( 250 * $user->position->x ) - 15 ;
						$y = ( 250 * $user->position->y ) - 15 ;
						$html .= '<img src="' . $user->user->profile_picture . '" title="' . $user->user->username . '" width="30" height="30" style="position:absolute; top:' . $x . 'px; left:' . $y . 'px; vertical-align:bottom;">' ;
					}
				}

				$html .= 			'</div>' ;
				$html .= 			'<p>※' . count( $item->users_in_photo ) . '人のユーザーがタグ付けされています。</p>' ;
				$html .= 		'</dd>' ;
			}
			else
			{
				$html .= 		'<dd><img class="_img" src="' . $images . '"></dd>' ;
			}

			$html .= 	'<dt>投稿日時</dt>' ;
			$html .= 		'<dd>' . $date . '</dd>' ;
			$html .= 	'<dt>ライク数</dt>' ;
			$html .= 		'<dd>' . $likes . '</dd>' ;
			$html .= 	'<dt>コメント数</dt>' ;
			$html .= 		'<dd>' . $comments . '</dd>' ;

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


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


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

			// ハッシュタグがある場合
			if( $tags )
			{
				$html .= 	'<dt>タグ情報</dt>' ;
				$html .= 		'<dd>' . $tags . '</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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

ハッシュタグでメディアを取得する

指定したハッシュタグが付いたメディアリストを取得することができます。

リクエスト方法

下記URLにGETメソッドでリクエストを送ります。「タグ名」については「タグ名を検索する」の項をご参考下さい。

GET https://api.instagram.com/v1/tags/{タグ名}/media/recent

パラメータ

access_token
アクセストークン。
count
取得件数。指定しない場合は20
min_tag_id
メディアIDを指定する。指定すると、このIDより「未来」に投稿されたメディアを取得する。
max_tag_id
メディアIDを指定する。指定すると、このIDより「過去」に投稿されたメディアを取得する。

サンプルプログラム

サンプルデモでは、「動物園」というハッシュタグが付いたメディアを検索しています。

PHP

<?php

	// 設定項目
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/tags/' . rawurlencode( '動物園' ) . '/media/recent?access_token=' . $access_token ;		// リクエスト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を作成
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj || !isset($obj->data) )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		foreach( $obj->data as $item )
		{
			// 各データ
			$id = $item->id ;		// メディアID
			$type = $item->type ;		// メディアタイプ
			$link = $item->link ;		// リンク
			$images = $item->images->low_resolution->url ;		// 画像
			$date = $item->created_time ;		// 日付 (UNIX TIMESTAMP)
			$likes = ( isset($item->likes->count) ) ? $item->likes->count : 0 ;		// ライク数
			$comments = ( isset($item->comments->count) ) ? $item->comments->count : 0 ;		// コメント数

			// ユーザー情報
			$user_id = $item->user->id ;		// 投稿者ID
			$user_name = $item->user->username ;		// 投稿者のユーザーネーム
			$user_full_name = ( isset($item->user->full_name) ) ? $item->user->full_name : '' ;		// 投稿者のユーザーネーム
			$user_profile_picture = ( isset( $item->user->profile_picture ) ) ? $item->user->profile_picture : '' ;		// アイコン画像

			// 場所情報
			$location_id = ( isset($item->location->id) ) ? $item->location->id : '' ;		// 場所ID
			$location_name = ( isset($item->location->name) ) ? $item->location->name : '' ;		// 場所名
			$location_lat = ( isset($item->location->latitude) ) ? $item->location->latitude : '' ;		// 緯度
			$location_long = ( isset($item->location->longitude) ) ? $item->location->longitude : '' ;		// 経度

			// タグ情報
			$tags = ( isset($item->tags) && !empty($item->tags) ) ? '#' . implode( '、#' , (array)$item->tags ) : '' ;

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

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

			// フルネームがある場合
			if( $user_full_name )
			{
				$html .= 	'<dt>投稿者のフルネーム</dt>' ;
				$html .= 		'<dd>' . $user_full_name . '</dd>' ;
			}

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

			$html .= 	'<dt>メディアID</dt>' ;
			$html .= 		'<dd>' . $id . '</dd>' ;
			$html .= 	'<dt>メディアタイプ</dt>' ;
			$html .= 		'<dd>' . $type . '</dd>' ;
			$html .= 	'<dt>メディアページ</dt>' ;
			$html .= 		'<dd><a href="' . $link . '" target="_blank">' . $link . '</a></dd>' ;
			$html .= 	'<dt>メディア</dt>' ;

			// ユーザーのタグ付けがある場合
			if( isset($item->users_in_photo) && !empty($item->users_in_photo) )
			{
				$html .= 		'<dd>' ;
				$html .= 			'<div style="position:relative; top:0; left:0; overflow:hidden; width:250px; height:250px;">' ;
				$html .= 				'<img src="' . $images . '" style="width:250px; height:250px;">' ;

				// タグ付けされたユーザーを配置していく
				foreach( $item->users_in_photo as $user )
				{
					if( isset($user->user->username) && isset($user->user->profile_picture) && isset($user->position->y) && isset($user->position->x) )
					{
						$x = ( 250 * $user->position->x ) - 15 ;
						$y = ( 250 * $user->position->y ) - 15 ;
						$html .= '<img src="' . $user->user->profile_picture . '" title="' . $user->user->username . '" width="30" height="30" style="position:absolute; top:' . $x . 'px; left:' . $y . 'px; vertical-align:bottom;">' ;
					}
				}

				$html .= 			'</div>' ;
				$html .= 			'<p>※' . count( $item->users_in_photo ) . '人のユーザーがタグ付けされています。</p>' ;
				$html .= 		'</dd>' ;
			}
			else
			{
				$html .= 		'<dd><img class="_img" src="' . $images . '"></dd>' ;
			}

			$html .= 	'<dt>投稿日時</dt>' ;
			$html .= 		'<dd>' . $date . '</dd>' ;
			$html .= 	'<dt>ライク数</dt>' ;
			$html .= 		'<dd>' . $likes . '</dd>' ;
			$html .= 	'<dt>コメント数</dt>' ;
			$html .= 		'<dd>' . $comments . '</dd>' ;

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

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

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

			// ハッシュタグがある場合
			if( $tags )
			{
				$html .= 	'<dt>タグ情報</dt>' ;
				$html .= 		'<dd>' . $tags . '</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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

場所IDで絞り込んで作品を取得

指定した「場所ID」が付いたメディアリストを取得することができます。

リクエスト方法

下記URLにGETメソッドでリクエストを送ります。「場所ID」については「場所IDを検索する」の項をご参考下さい。

GET https://api.instagram.com/v1/locations/{場所ID}/media/recent

パラメータ

access_token
アクセストークン。
min_id
メディアIDを指定する。指定すると、このIDより「未来」に投稿されたメディアを取得する。
max_id
メディアIDを指定する。指定すると、このIDより「過去」に投稿されたメディアを取得する。
min_timestamp
日時をUNIX TIMESTAMPで指定する。指定すると、この日時より「未来」に投稿されたメディアを取得する。
max_timestamp
日時をUNIX TIMESTAMPで指定する。指定すると、この日時より「過去」に投稿されたメディアを取得する。

サンプルプログラム

サンプルデモでは、場所ID:271566098(いとうずの森公園)が付いたメディアを検索しています。

PHP

<?php

	// 設定項目
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/locations/271566098/media/recent?access_token=' . $access_token ;		// リクエスト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を作成
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj || !isset($obj->data) )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		foreach( $obj->data as $item )
		{
			// 各データ
			$id = $item->id ;		// メディアID
			$type = $item->type ;		// メディアタイプ
			$link = $item->link ;		// リンク
			$images = $item->images->low_resolution->url ;		// 画像
			$date = $item->created_time ;		// 日付 (UNIX TIMESTAMP)
			$likes = ( isset($item->likes->count) ) ? $item->likes->count : 0 ;		// ライク数
			$comments = ( isset($item->comments->count) ) ? $item->comments->count : 0 ;		// コメント数

			// ユーザー情報
			$user_id = $item->user->id ;		// 投稿者ID
			$user_name = $item->user->username ;		// 投稿者のユーザーネーム
			$user_full_name = ( isset($item->user->full_name) ) ? $item->user->full_name : '' ;		// 投稿者のユーザーネーム
			$user_profile_picture = ( isset( $item->user->profile_picture ) ) ? $item->user->profile_picture : '' ;		// アイコン画像

			// 場所情報
			$location_id = ( isset($item->location->id) ) ? $item->location->id : '' ;		// 場所ID
			$location_name = ( isset($item->location->name) ) ? $item->location->name : '' ;		// 場所名
			$location_lat = ( isset($item->location->latitude) ) ? $item->location->latitude : '' ;		// 緯度
			$location_long = ( isset($item->location->longitude) ) ? $item->location->longitude : '' ;		// 経度

			// タグ情報
			$tags = ( isset($item->tags) && !empty($item->tags) ) ? '#' . implode( '、#' , (array)$item->tags ) : '' ;

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

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

			// フルネームがある場合
			if( $user_full_name )
			{
				$html .= 	'<dt>投稿者のフルネーム</dt>' ;
				$html .= 		'<dd>' . $user_full_name . '</dd>' ;
			}

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

			$html .= 	'<dt>メディアID</dt>' ;
			$html .= 		'<dd>' . $id . '</dd>' ;
			$html .= 	'<dt>メディアタイプ</dt>' ;
			$html .= 		'<dd>' . $type . '</dd>' ;
			$html .= 	'<dt>メディアページ</dt>' ;
			$html .= 		'<dd><a href="' . $link . '" target="_blank">' . $link . '</a></dd>' ;
			$html .= 	'<dt>メディア</dt>' ;

			// ユーザーのタグ付けがある場合
			if( isset($item->users_in_photo) && !empty($item->users_in_photo) )
			{
				$html .= 		'<dd>' ;
				$html .= 			'<div style="position:relative; top:0; left:0; overflow:hidden; width:250px; height:250px;">' ;
				$html .= 				'<img src="' . $images . '" style="width:250px; height:250px;">' ;

				// タグ付けされたユーザーを配置していく
				foreach( $item->users_in_photo as $user )
				{
					if( isset($user->user->username) && isset($user->user->profile_picture) && isset($user->position->y) && isset($user->position->x) )
					{
						$x = ( 250 * $user->position->x ) - 15 ;
						$y = ( 250 * $user->position->y ) - 15 ;
						$html .= '<img src="' . $user->user->profile_picture . '" title="' . $user->user->username . '" width="30" height="30" style="position:absolute; top:' . $x . 'px; left:' . $y . 'px; vertical-align:bottom;">' ;
					}
				}

				$html .= 			'</div>' ;
				$html .= 			'<p>※' . count( $item->users_in_photo ) . '人のユーザーがタグ付けされています。</p>' ;
				$html .= 		'</dd>' ;
			}
			else
			{
				$html .= 		'<dd><img class="_img" src="' . $images . '"></dd>' ;
			}

			$html .= 	'<dt>投稿日時</dt>' ;
			$html .= 		'<dd>' . $date . '</dd>' ;
			$html .= 	'<dt>ライク数</dt>' ;
			$html .= 		'<dd>' . $likes . '</dd>' ;
			$html .= 	'<dt>コメント数</dt>' ;
			$html .= 		'<dd>' . $comments . '</dd>' ;

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


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


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

			// ハッシュタグがある場合
			if( $tags )
			{
				$html .= 	'<dt>タグ情報</dt>' ;
				$html .= 		'<dd>' . $tags . '</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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

メディアIDから作品を取得

指定したメディアIDの作品情報を取得できます。

リクエスト方法

下記URLにGETメソッドでリクエストを送ります。「メディアID」は各JSONに含まれています。

GET https://api.instagram.com/v1/media/{メディアID}

パラメータ

access_token
アクセストークン。

サンプルプログラム

サンプルデモでは、メディアID:995441237695763249_2056527147の作品を取得しています。

PHP

<?php

	// 設定項目
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/media/995441237695763249_2056527147?access_token=' . $access_token ;		// リクエスト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を作成
	$html .= '<h2>実行結果</h2>' ;

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

			// 各データ
			$id = $item->id ;		// メディアID
			$type = $item->type ;		// メディアタイプ
			$link = $item->link ;		// リンク
			$images = $item->images->low_resolution->url ;		// 画像
			$date = $item->created_time ;		// 日付 (UNIX TIMESTAMP)
			$likes = ( isset($item->likes->count) ) ? $item->likes->count : 0 ;		// ライク数
			$comments = ( isset($item->comments->count) ) ? $item->comments->count : 0 ;		// コメント数

			// ユーザー情報
			$user_id = $item->user->id ;		// 投稿者ID
			$user_name = $item->user->username ;		// 投稿者のユーザーネーム
			$user_full_name = ( isset($item->user->full_name) ) ? $item->user->full_name : '' ;		// 投稿者のユーザーネーム
			$user_profile_picture = ( isset( $item->user->profile_picture ) ) ? $item->user->profile_picture : '' ;		// アイコン画像

			// 場所情報
			$location_id = ( isset($item->location->id) ) ? $item->location->id : '' ;		// 場所ID
			$location_name = ( isset($item->location->name) ) ? $item->location->name : '' ;		// 場所名
			$location_lat = ( isset($item->location->latitude) ) ? $item->location->latitude : '' ;		// 緯度
			$location_long = ( isset($item->location->longitude) ) ? $item->location->longitude : '' ;		// 経度

			// タグ情報
			$tags = ( isset($item->tags) && !empty($item->tags) ) ? '#' . implode( '、#' , (array)$item->tags ) : '' ;

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

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

			// フルネームがある場合
			if( $user_full_name )
			{
				$html .= 	'<dt>投稿者のフルネーム</dt>' ;
				$html .= 		'<dd>' . $user_full_name . '</dd>' ;
			}

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

			$html .= 	'<dt>メディアID</dt>' ;
			$html .= 		'<dd>' . $id . '</dd>' ;
			$html .= 	'<dt>メディアタイプ</dt>' ;
			$html .= 		'<dd>' . $type . '</dd>' ;
			$html .= 	'<dt>メディアページ</dt>' ;
			$html .= 		'<dd><a href="' . $link . '" target="_blank">' . $link . '</a></dd>' ;
			$html .= 	'<dt>メディア</dt>' ;

			// ユーザーのタグ付けがある場合
			if( isset($item->users_in_photo) && !empty($item->users_in_photo) )
			{
				$html .= 		'<dd>' ;
				$html .= 			'<div style="position:relative; top:0; left:0; overflow:hidden; width:250px; height:250px;">' ;
				$html .= 				'<img src="' . $images . '" style="width:250px; height:250px;">' ;

				// タグ付けされたユーザーを配置していく
				foreach( $item->users_in_photo as $user )
				{
					if( isset($user->user->username) && isset($user->user->profile_picture) && isset($user->position->y) && isset($user->position->x) )
					{
						$x = ( 250 * $user->position->x ) - 15 ;
						$y = ( 250 * $user->position->y ) - 15 ;
						$html .= '<img src="' . $user->user->profile_picture . '" title="' . $user->user->username . '" width="30" height="30" style="position:absolute; top:' . $x . 'px; left:' . $y . 'px; vertical-align:bottom;">' ;
					}
				}

				$html .= 			'</div>' ;
				$html .= 			'<p>※' . count( $item->users_in_photo ) . '人のユーザーがタグ付けされています。</p>' ;
				$html .= 		'</dd>' ;
			}
			else
			{
				$html .= 		'<dd><img class="_img" src="' . $images . '"></dd>' ;
			}

			$html .= 	'<dt>投稿日時</dt>' ;
			$html .= 		'<dd>' . $date . '</dd>' ;
			$html .= 	'<dt>ライク数</dt>' ;
			$html .= 		'<dd>' . $likes . '</dd>' ;
			$html .= 	'<dt>コメント数</dt>' ;
			$html .= 		'<dd>' . $comments . '</dd>' ;

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


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


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

			// ハッシュタグがある場合
			if( $tags )
			{
				$html .= 	'<dt>タグ情報</dt>' ;
				$html .= 		'<dd>' . $tags . '</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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

ショートコードから作品を取得

指定したショートコードの作品情報を取得できます。

リクエスト方法

下記URLにGETメソッドでリクエストを送ります。

GET https://api.instagram.com/v1/media/shortcode/{ショートコード}

ショートコードは、各作品のパーマリンクに含まれています。例えば、下記の場合は3Qh4FDMlMVがショートコードとなります。

https://instagram.com/p/3Qh4FDMlMV/ リンク

パラメータ

access_token
アクセストークン。

サンプルプログラム

サンプルデモでは、ショートコード:3Qh4FDMlMVの作品を取得しています。

PHP

<?php

	// 設定項目
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/media/shortcode/3Qh4FDMlMV?access_token=' . $access_token ;		// リクエスト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を作成
	$html .= '<h2>実行結果</h2>' ;

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

			// 各データ
			$id = $item->id ;		// メディアID
			$type = $item->type ;		// メディアタイプ
			$link = $item->link ;		// リンク
			$images = $item->images->low_resolution->url ;		// 画像
			$date = $item->created_time ;		// 日付 (UNIX TIMESTAMP)
			$likes = ( isset($item->likes->count) ) ? $item->likes->count : 0 ;		// ライク数
			$comments = ( isset($item->comments->count) ) ? $item->comments->count : 0 ;		// コメント数

			// ユーザー情報
			$user_id = $item->user->id ;		// 投稿者ID
			$user_name = $item->user->username ;		// 投稿者のユーザーネーム
			$user_full_name = ( isset($item->user->full_name) ) ? $item->user->full_name : '' ;		// 投稿者のユーザーネーム
			$user_profile_picture = ( isset( $item->user->profile_picture ) ) ? $item->user->profile_picture : '' ;		// アイコン画像

			// 場所情報
			$location_id = ( isset($item->location->id) ) ? $item->location->id : '' ;		// 場所ID
			$location_name = ( isset($item->location->name) ) ? $item->location->name : '' ;		// 場所名
			$location_lat = ( isset($item->location->latitude) ) ? $item->location->latitude : '' ;		// 緯度
			$location_long = ( isset($item->location->longitude) ) ? $item->location->longitude : '' ;		// 経度

			// タグ情報
			$tags = ( isset($item->tags) && !empty($item->tags) ) ? '#' . implode( '、#' , (array)$item->tags ) : '' ;

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

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

			// フルネームがある場合
			if( $user_full_name )
			{
				$html .= 	'<dt>投稿者のフルネーム</dt>' ;
				$html .= 		'<dd>' . $user_full_name . '</dd>' ;
			}

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

			$html .= 	'<dt>メディアID</dt>' ;
			$html .= 		'<dd>' . $id . '</dd>' ;
			$html .= 	'<dt>メディアタイプ</dt>' ;
			$html .= 		'<dd>' . $type . '</dd>' ;
			$html .= 	'<dt>メディアページ</dt>' ;
			$html .= 		'<dd><a href="' . $link . '" target="_blank">' . $link . '</a></dd>' ;
			$html .= 	'<dt>メディア</dt>' ;

			// ユーザーのタグ付けがある場合
			if( isset($item->users_in_photo) && !empty($item->users_in_photo) )
			{
				$html .= 		'<dd>' ;
				$html .= 			'<div style="position:relative; top:0; left:0; overflow:hidden; width:250px; height:250px;">' ;
				$html .= 				'<img src="' . $images . '" style="width:250px; height:250px;">' ;

				// タグ付けされたユーザーを配置していく
				foreach( $item->users_in_photo as $user )
				{
					if( isset($user->user->username) && isset($user->user->profile_picture) && isset($user->position->y) && isset($user->position->x) )
					{
						$x = ( 250 * $user->position->x ) - 15 ;
						$y = ( 250 * $user->position->y ) - 15 ;
						$html .= '<img src="' . $user->user->profile_picture . '" title="' . $user->user->username . '" width="30" height="30" style="position:absolute; top:' . $x . 'px; left:' . $y . 'px; vertical-align:bottom;">' ;
					}
				}

				$html .= 			'</div>' ;
				$html .= 			'<p>※' . count( $item->users_in_photo ) . '人のユーザーがタグ付けされています。</p>' ;
				$html .= 		'</dd>' ;
			}
			else
			{
				$html .= 		'<dd><img class="_img" src="' . $images . '"></dd>' ;
			}

			$html .= 	'<dt>投稿日時</dt>' ;
			$html .= 		'<dd>' . $date . '</dd>' ;
			$html .= 	'<dt>ライク数</dt>' ;
			$html .= 		'<dd>' . $likes . '</dd>' ;
			$html .= 	'<dt>コメント数</dt>' ;
			$html .= 		'<dd>' . $comments . '</dd>' ;

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


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


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

			// ハッシュタグがある場合
			if( $tags )
			{
				$html .= 	'<dt>タグ情報</dt>' ;
				$html .= 		'<dd>' . $tags . '</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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

取得できるJSON

取得できるJSONデータの構造は下記の通りです。

JSON

{"pagination":{"next_url":"https:\/\/api.instagram.com\/v1\/users\/self\/feed?access_token=2056527147.5f94b97.bef495e276444377a0e164a34895d427\u0026count=2\u0026max_id=1038146914610830037_173645757","next_max_id":"1038146914610830037_173645757"},"meta":{"code":200},"data":[{"attribution":null,"tags":[],"type":"image","location":null,"comments":{"count":97,"data":[{"created_time":"1437979898","text":"\u304a\u3044\u3057\u305d\u30fc\u2764\ufe0f","from":{"username":"rpadd.d.at","profile_picture":"https:\/\/igcdn-photos-h-a.akamaihd.net\/hphotos-ak-xpt1\/t51.2885-19\/11142239_372563269595439_1781853278_a.jpg","id":"1816554695","full_name":""},"id":"1038173089894750936"},{"created_time":"1437979907","text":"\u8868\u53c2\u9053\u306b\u3044\u308b\u306e\uff1f\uff01\u3044\u3044\u306a\u301curthcafe\u306e\u30bf\u30d4\u30aa\u30ab\u301c\ud83c\udf3f\u2764\ufe0f","from":{"username":"im_yooug","profile_picture":"https:\/\/igcdn-photos-e-a.akamaihd.net\/hphotos-ak-xfa1\/t51.2885-19\/s150x150\/11324471_941011735950228_1110340735_a.jpg","id":"460256933","full_name":"\uad70\uc544 \u3050\u3093"},"id":"1038173169217428190"},{"created_time":"1437980068","text":"\u4ee3\u5b98\u5c71\u3060\u301c\u301c","from":{"username":"po11112","profile_picture":"https:\/\/instagramimages-a.akamaihd.net\/profiles\/anonymousUser.jpg","id":"1577846806","full_name":""},"id":"1038174516511759178"},{"created_time":"1437980114","text":"\u305d\u30fc\u3044\u3048\u3070\u30a2\u30eb\u30c1\u30fc \u30b9\u30ea\u30e0\u59cb\u3081\u3066\u307f\u305f\u3093\u3060\u3051\u3069\u3059\u3054\u3044\u6c57\u51fa\u308b\u3057\u4fbf\u79d8\u3057\u306a\u304f\u306a\u3063\u3066\u3080\u304f\u307e\u306a\u304f\u306a\u3063\u305f\u3057\uff19\u338f\u3082\u6e1b\u91cf\u51fa\u6765\u305f\u3088\u2728\ud83d\udc96","from":{"username":"kndusaorii","profile_picture":"https:\/\/igcdn-photos-a-a.akamaihd.net\/hphotos-ak-xaf1\/t51.2885-19\/s150x150\/11327002_880902748651416_1060854769_a.jpg","id":"2048676887","full_name":"\u8fd1\u85e4\u8a69\u7e54"},"id":"1038174907479612262"},{"created_time":"1437980123","text":"\u3048~\u3001\u62b9\u8336\u3082\u30bf\u30d4\u30aa\u30ab\u3082\u5927\u597d\u304d\ud83d\ude33\ud83d\udc95","from":{"username":"ea0929","profile_picture":"https:\/\/igcdn-photos-h-a.akamaihd.net\/hphotos-ak-xaf1\/t51.2885-19\/11356429_394942277366767_1700039213_a.jpg","id":"683572781","full_name":"ea"},"id":"1038174982599596908"},{"created_time":"1437980147","text":"\u304a\u3044\u3057\u305d(\u00b4\uff65\u03c9\uff65\uff40) \u30d2\u30eb\u30ca\u30f3\u30c7\u30b9\u306e\u30c0\u30a4\u30a8\u30c3\u30c8\u4f01\u753b\u3067\u3084\u3063\u3066\u305f \u30b9\u30ea\u30e0\u30ed\u30a4\u30bc\u304b\u306a\u308a\u826f\u3044\u3088\u30fc\u2661\u2661 \uff11\u30f6\u6708\u3067\uff11\uff13\u338f\u75e9\u305b\u3066\u6d6e\u816b\u307f\u3082\u53d6\u308c\u305f\uff5e\u2661\u2661 \u58f2\u308a\u5207\u308c\u3067\uff12\u30f6\u6708\u8cb7\u3048\u306a\u304b\u3063\u305f\u3051\u3069 \u4eca\u306a\u3089\u3059\u3050\u8cb7\u3048\u308b\u307f\u305f\u3044\u3060\u3057\u304a\u3059\u3059\u3081\u3060\u3088\u30fc\uff01","from":{"username":"yt.0511.1","profile_picture":"https:\/\/igcdn-photos-d-a.akamaihd.net\/hphotos-ak-xtp1\/t51.2885-19\/11191537_1403336113322715_1515484176_a.jpg","id":"2021239789","full_name":"\u77f3\u5ddd \u771f\u7406"},"id":"1038175185419361146"},{"created_time":"1437980156","text":"\u6771\u4eac\u306b\u3057\u304b\u306a\u3044\u3093\u3067\u3059\u304b\uff1f\uff1f","from":{"username":"ea0929","profile_picture":"https:\/\/igcdn-photos-h-a.akamaihd.net\/hphotos-ak-xaf1\/t51.2885-19\/11356429_394942277366767_1700039213_a.jpg","id":"683572781","full_name":"ea"},"id":"1038175256328264577"},{"created_time":"1437980158","text":"\u305d\u308c\u3001\u304a\u3044\u3057\u3044\u306e\uff1f\u308f\u3089","from":{"username":"aiaiai.flw","profile_picture":"https:\/\/igcdn-photos-f-a.akamaihd.net\/hphotos-ak-xfa1\/t51.2885-19\/11419271_1458124094507021_1346935916_a.jpg","id":"1966618429","full_name":""},"id":"1038175271662640005"}]},"filter":"Normal","created_time":"1437976916","link":"https:\/\/instagram.com\/p\/5oPi0rC9ry\/","likes":{"count":18120,"data":[{"username":"mihi041415","profile_picture":"https:\/\/igcdn-photos-h-a.akamaihd.net\/hphotos-ak-xap1\/t51.2885-19\/10808797_1449070908733247_1630902939_a.jpg","id":"2138535724","full_name":"mie.c"},{"username":"massiro_bianca","profile_picture":"https:\/\/igcdn-photos-h-a.akamaihd.net\/hphotos-ak-xaf1\/t51.2885-19\/s150x150\/11351583_1607942369488535_921927721_a.jpg","id":"2138807613","full_name":""},{"username":"misaki_shirahase","profile_picture":"https:\/\/igcdn-photos-e-a.akamaihd.net\/hphotos-ak-xaf1\/t51.2885-19\/11242267_1462020940778452_1129001739_a.jpg","id":"2139375310","full_name":"Misaki Shirahase"},{"username":"sea_marin0407","profile_picture":"https:\/\/igcdn-photos-d-a.akamaihd.net\/hphotos-ak-xaf1\/t51.2885-19\/11271054_464261223739779_393207026_a.jpg","id":"2138832023","full_name":"MARI __\u2661."}]},"images":{"low_resolution":{"url":"https:\/\/scontent.cdninstagram.com\/hphotos-xpa1\/t51.2885-15\/s320x320\/e15\/10575965_683313581801763_150941431_n.jpg","width":320,"height":320},"thumbnail":{"url":"https:\/\/scontent.cdninstagram.com\/hphotos-xpa1\/t51.2885-15\/s150x150\/e15\/10575965_683313581801763_150941431_n.jpg","width":150,"height":150},"standard_resolution":{"url":"https:\/\/scontent.cdninstagram.com\/hphotos-xpa1\/t51.2885-15\/s640x640\/e35\/sh0.08\/10575965_683313581801763_150941431_n.jpg","width":640,"height":640}},"users_in_photo":[],"caption":{"created_time":"1437976916","text":"A little break from work with takeout boba macha tea!\n\u3060\u3044\u3059\u304d\u306a\u30aa\u30fc\u30ac\u30cb\u30c3\u30af\u30bf\u30d4\u30aa\u30ab\u62b9\u8336\u30c6\u30a3\u30fc\ud83d\ude19\ud83d\ude19\ud83d\ude19\ud83c\udf33chu","from":{"username":"rolaofficial","profile_picture":"https:\/\/igcdn-photos-a-a.akamaihd.net\/hphotos-ak-xpa1\/t51.2885-19\/10831852_1395578547402472_2095049928_a.jpg","id":"173645757","full_name":"Rolaofficial"},"id":"1038148079805258677"},"user_has_liked":false,"id":"1038148077825546994_173645757","user":{"username":"rolaofficial","profile_picture":"https:\/\/igcdn-photos-a-a.akamaihd.net\/hphotos-ak-xpa1\/t51.2885-19\/10831852_1395578547402472_2095049928_a.jpg","id":"173645757","full_name":"Rolaofficial"}},{"attribution":null,"tags":[],"type":"image","location":null,"comments":{"count":53,"data":[{"created_time":"1437979185","text":"\u53ef\u611b\u3044(*^\u25bd^*)","from":{"username":"km03010309","profile_picture":"https:\/\/igcdn-photos-h-a.akamaihd.net\/hphotos-ak-xfa1\/t51.2885-19\/s150x150\/11249732_425494117641255_150362915_a.jpg","id":"2078630222","full_name":"KM0919"},"id":"1038167114622163264"},{"created_time":"1437979491","text":"\u30ca\u30f3\u30d0\u30fc\u30d7\u30ec\u30fc\u30c8\u5927\u4e08\u592b\uff1f\u7b11","from":{"username":"chihirola0420","profile_picture":"https:\/\/igcdn-photos-d-a.akamaihd.net\/hphotos-ak-xaf1\/t51.2885-19\/11350810_441311566048963_1830779971_a.jpg","id":"1919305069","full_name":""},"id":"1038169675966175704"},{"created_time":"1437979751","text":"\u304b\u3063\u3053\u3044\u30fc\uff01","from":{"username":"ribonxoxo","profile_picture":"https:\/\/igcdn-photos-g-a.akamaihd.net\/hphotos-ak-xfa1\/t51.2885-19\/11117150_443570662471510_1377622748_a.jpg","id":"1699123380","full_name":""},"id":"1038171858665200248"},{"created_time":"1437979793","text":"\u30ed\u30fc\u30e9\u306b\u4f1a\u3044\u305f\u3044\ud83d\ude22\u2764\ufe0f","from":{"username":"mona3rl","profile_picture":"https:\/\/igcdn-photos-g-a.akamaihd.net\/hphotos-ak-xaf1\/t51.2885-19\/11250108_364308080429958_659180120_a.jpg","id":"1052465800","full_name":"mona"},"id":"1038172210022046365"},{"created_time":"1437979835","text":"\u96d1\u8a8c\u306e\u30da\u30fc\u30b8\u307f\u305f\u3044\uff01\u30ab\u30c3\u30b3\u30a4\u30a4\ud83d\udc99\ud83d\udc9c","from":{"username":"im_yooug","profile_picture":"https:\/\/igcdn-photos-e-a.akamaihd.net\/hphotos-ak-xfa1\/t51.2885-19\/s150x150\/11324471_941011735950228_1110340735_a.jpg","id":"460256933","full_name":"\uad70\uc544 \u3050\u3093"},"id":"1038172564415568561"},{"created_time":"1437979877","text":"\u304b\u308f\u3044\u3044\u3058\u3083\u3093(\u00b4\uff65\u03c9\uff65\uff40) \u30d2\u30eb\u30ca\u30f3\u30c7\u30b9\u306e\u30c0\u30a4\u30a8\u30c3\u30c8\u4f01\u753b\u3067\u3084\u3063\u3066\u305f \u30b9\u30ea\u30e0\u30ed\u30a4\u30bc\u304b\u306a\u308a\u826f\u3044\u3088\u30fc\u2661\u2661 \uff11\u30f6\u6708\u3067\uff11\uff13\u338f\u75e9\u305b\u3066\u6d6e\u816b\u307f\u3082\u53d6\u308c\u305f\uff5e\u2661\u2661 \u58f2\u308a\u5207\u308c\u3067\uff12\u30f6\u6708\u8cb7\u3048\u306a\u304b\u3063\u305f\u3051\u3069 \u4eca\u306a\u3089\u3059\u3050\u8cb7\u3048\u308b\u307f\u305f\u3044\u3060\u3057\u304a\u3059\u3059\u3081\u3060\u3088\u30fc\uff01","from":{"username":"ktuk0013","profile_picture":"https:\/\/igcdn-photos-g-a.akamaihd.net\/hphotos-ak-xpa1\/t51.2885-19\/s150x150\/10948694_1599714563624502_282954968_a.jpg","id":"2127024026","full_name":""},"id":"1038172915688528591"},{"created_time":"1437980029","text":"\u3042\u305f\u3057\u3082\u4eca\u65e5\u3001\u30d6\u30e9\u30c3\u30af\u3053\u30fc\u3067\ud83d\udcbc\ud83d\udc82\ud83d\udc3c","from":{"username":"miku.3939.love","profile_picture":"https:\/\/igcdn-photos-a-a.akamaihd.net\/hphotos-ak-xaf1\/t51.2885-19\/s150x150\/11380263_1651041385109552_1688859563_a.jpg","id":"2065287697","full_name":"MIKU"},"id":"1038174195521674034"},{"created_time":"1437980194","text":"\u304a\u3063\u3068\uff01\u30ca\u30f3\u30d0\u30fc\u30d7\u30ec\u30fc\u30c8\u304c\u2025","from":{"username":"asami_misa","profile_picture":"https:\/\/igcdn-photos-e-a.akamaihd.net\/hphotos-ak-xfa1\/t51.2885-19\/10522312_297468310432644_937594513_a.jpg","id":"1426131670","full_name":"asami-yokoyama(\u062a)\u266a"},"id":"1038175576403991446"}]},"filter":"Normal","created_time":"1437976777","link":"https:\/\/instagram.com\/p\/5oPR5WC9rV\/","likes":{"count":14758,"data":[{"username":"yuuchan11020920","profile_picture":"https:\/\/igcdn-photos-d-a.akamaihd.net\/hphotos-ak-xaf1\/t51.2885-19\/s150x150\/11264613_1594844704110387_44512871_a.jpg","id":"2139465408","full_name":"(\u65e7)\u5c0f\u897f\u512a\u672a"},{"username":"massiro_bianca","profile_picture":"https:\/\/igcdn-photos-h-a.akamaihd.net\/hphotos-ak-xaf1\/t51.2885-19\/s150x150\/11351583_1607942369488535_921927721_a.jpg","id":"2138807613","full_name":""},{"username":"_ntk_yt_","profile_picture":"https:\/\/igcdn-photos-e-a.akamaihd.net\/hphotos-ak-xfa1\/t51.2885-19\/11372453_897459420302028_1522455490_a.jpg","id":"2139423766","full_name":"\uff85\uff6f\uff81\uff6c\uff7f(15)"},{"username":"sea_marin0407","profile_picture":"https:\/\/igcdn-photos-d-a.akamaihd.net\/hphotos-ak-xaf1\/t51.2885-19\/11271054_464261223739779_393207026_a.jpg","id":"2138832023","full_name":"MARI __\u2661."}]},"images":{"low_resolution":{"url":"https:\/\/scontent.cdninstagram.com\/hphotos-xfa1\/t51.2885-15\/s320x320\/e15\/11349290_1618360888444304_1458093219_n.jpg","width":320,"height":320},"thumbnail":{"url":"https:\/\/scontent.cdninstagram.com\/hphotos-xfa1\/t51.2885-15\/s150x150\/e15\/11349290_1618360888444304_1458093219_n.jpg","width":150,"height":150},"standard_resolution":{"url":"https:\/\/scontent.cdninstagram.com\/hphotos-xfa1\/t51.2885-15\/s640x640\/e35\/sh0.08\/11349290_1618360888444304_1458093219_n.jpg","width":640,"height":640}},"users_in_photo":[{"position":{"y":0.728,"x":0.372},"user":{"username":"togaarchives","profile_picture":"https:\/\/instagramimages-a.akamaihd.net\/profiles\/profile_808245365_75sq_1388054314.jpg","id":"808245365","full_name":"Official Toga Instagram"}}],"caption":{"created_time":"1437976777","text":"Black OOTD on a summer day\ud83d\ude0e\u26c5\ufe0f@togaarchives","from":{"username":"rolaofficial","profile_picture":"https:\/\/igcdn-photos-a-a.akamaihd.net\/hphotos-ak-xpa1\/t51.2885-19\/10831852_1395578547402472_2095049928_a.jpg","id":"173645757","full_name":"Rolaofficial"},"id":"1038147368233196405"},"user_has_liked":false,"id":"1038146914610830037_173645757","user":{"username":"rolaofficial","profile_picture":"https:\/\/igcdn-photos-a-a.akamaihd.net\/hphotos-ak-xpa1\/t51.2885-19\/10831852_1395578547402472_2095049928_a.jpg","id":"173645757","full_name":"Rolaofficial"}}]}

各プロパティの説明

dataプロパティの中に、投稿日順(未来→過去)にソートされたメディアリストのデータが含まれています。「写真」と「動画」のデータが混在していて、「動画」の場合だけ、videoプロパティが存在し、それ以外は同じ構造になっています。キャプションは、「投稿者による1つ目のコメント」の扱いで、「コメントID」が付与されます。例えば、作品投稿時にキャプションを付けていなくても、作品投稿者がコメント欄にコメントを投稿すれば、1つ目のコメントが「キャプション」と認識されます。

pagination
ページネーション(次ページ情報)。
next_url
次ページのリクエストURL。
next_max_id
次ページのMAX ID。
code
ステータスコード。200ならリクエストが成功。
data[]
個々のメディアデータ(配列形式)。
data[]->id
投稿のメディアID。
data[]->tags[]
投稿に付けられたハッシュタグ(配列形式)。
data[]->type
投稿のメディアタイプ。
image … 写真
video … 動画
data[]->location[]->latitude
緯度。
data[]->location[]->longitude
経度。
data[]->location[]->name
場所名。
data[]->location[]->id
場所ID。
comments
作品に付いたコメント情報。
comments->count
コメント数。
comments->data[]
個々のコメントデータ(配列形式で最新8件まで)。
comments[]->data[]->created_time
コメントの投稿日時。
comments[]->data[]->text
コメントのテキスト。
comments[]->data[]->from
コメントを付けたユーザー情報。中身はユーザーのJSONと同じ。
comments[]->data[]->id
コメントID。
filter
加工フィルターの種類。
created_time
メディアの投稿日時。
link
メディアページのURL。
likes
作品に付いたライクの情報。
likes->count
ライク数。
likes->data[]
ライクを付けたユーザーデータ(配列形式)。
images
メディアの画像情報。メディアが動画の場合はサムネイルの情報となる。
images->low_resolution
306x306の画像情報。
images->thumbnail
150x150の画像情報。
images->standard_resolution
640x640の画像情報。
videos
メディアの動画情報。メディアが写真の場合は存在しない。
videos->low_resolution
480x480の動画情報。
videos->standard_resolution
640x640の動画情報。
users_in_photo[]
タグ付けされたユーザー情報(配列形式)。
users_in_photo[]->position->y
Y座標。写真の「高さ」にこの値をかける。
users_in_photo[]->position->x
X座標。写真の「横幅」にこの値をかける。
users_in_photo[]->user[]
タグ付けされた個々のユーザー情報(配列形式)。
caption
キャプションの情報。キャプションとは、作品の説明となるコメントで、投稿者が付けた一番最初のコメントと同じ。
caption->created_time
キャプションの作成日時。
caption->text
キャプションのテキスト。
caption->from
キャプション作成者のユーザー情報。すなわち、投稿者の情報。
caption->id
キャプションのコメントID。
user_has_liked
自分(アクセストークンの持ち主)がこの投稿をライクしてるか?
user
投稿者のユーザー情報。

埋め込み用HTMLコードの生成

Instagramには、上記のような埋め込み用コンテンツが用意されています。下記埋め込み用HTMLコードの赤文字部分を、APIで取得できる「メディアページのURL」とそのまま差し替えることで、既に適切にデザインされた画像や動画を出力することができます。

HTML

<iframe src="https://instagram.com/p/3Qh4FDMlMV/embed/" width="612" height="710" frameborder="0" scrolling="no" allowtransparency="true"></iframe>

タグ付けされたユーザーの取得

タグ付けされたユーザーにアイコンを付ける
タグ付けされたユーザーにアイコンを付ける

Instagramには、写真の好きな位置にユーザーをタグ付けできる機能があり、APIを利用して、それらタグ付けされたユーザー達のデータを取得することができます。IDや名前だけではなく「写真のどの位置にタグ付けされたか」を示す、「X座標」「Y座標」を取得することができるので、上記のように、その位置にユーザーアイコンを重ねる、といった遊び要素を実現できます。

取得できる「X座標」「Y座標」の値は、それぞれ0.74531250.4296875といったように割合になっています。例えば、表示する画像のサイズが640x640ならば、まずは、それぞれを掛け合わせて640 * 0.7453125 = 477640 * 0.4296875 = 275と、ピクセル値を算出しましょう。

算出したそれぞれのピクセル値のまま位置指定すると、指定した位置には、アイコンの「左端上端」がきます。これをアイコンの中心が来るようにするには、アイコンの幅、高さ、それぞれの2分の1の値を引いてあげましょう。具体的には次のような計算になります。

X座標
(640 * 0.7453125) - (アイコンの幅 / 2)
Y座標
(640 * 0.4296875) - (アイコンの高さ / 2)

このように取得できた「X座標」「Y座標」と、スタイルシートのpositiontopleftを組み合わせることで、上記サンプルのように、適切にアイコンを配置することができます。この機能はサンプルプログラムにも備わっているので、参考にしてみて下さい。ちなみに本家Instagramアプリだと、アイコンではなく、名前テキストが配置されていますね。

つながり [Relationship]

この章では、特定のユーザーとの「つながり」を調べたり、フォロー、アンフォローなどする方法を紹介していきます。

フォローしているユーザーの取得

「ユーザー [Users]」の章で解説しています。

フォロワーの取得

「ユーザー [Users]」の章で解説しています。

フォローリクエスト中のユーザーの取得

「ユーザー [Users]」の章で解説しています。

つながりを調べる

指定したユーザーと自分(アクセストークンの持ち主)の間にはどのような「つながり」があるのか、調べます。

リクエスト方法

下記URLにGETメソッドでリクエストを送ることで調べることができます!「ユーザーID」は、相手のIDとなります。アプリにrelationshipsの権限が必要です。

GET https://api.instagram.com/v1/users/{ユーザーID}/relationship

パラメータ

access_token
アクセストークン。

取得できるJSON

リクエストに成功すると、下記内容のJSONを取得できます。この場合、アクセストークンの主は相手のことをフォローしていて、相手は、アクセストークンの主のことをフォローしていません。

JSON

{"meta":{"code":200},"data":{"outgoing_status":"none","target_user_is_private":false,"incoming_status":"followed_by"}}

各プロパティの解説

outgoing_status
アクセストークンの主から、相手へのステータス。
target_user_is_private
相手は非公開ユーザーか、否か。
incoming_status
相手から、アクセストークンの主へのステータス。

下記はステータスを示すコードの説明です。

follows
自分は指定ユーザーをフォローしている。
followed_by
自分は指定ユーザーにフォローされている。
requested
自分は指定ユーザーにフォローリクエストをしている。
none
何の関係もない。

サンプルプログラム

サンプルデモでは、このブログのアカウントとの関係性を調べています。よろしければ、フォローしたり、フォローを外したりするなどして、取得できるデータの違いを確認してみて下さいね。

PHP

<?php

	// 設定項目
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/users/1349593219/relationship?access_token=' . $access_token ;		// リクエスト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を作成
	$html .= '<h2>実行結果</h2>' ;

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

	// 取得したデータ
	$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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

つながりを変更する

このエンドポイントを有効にするためには、Instagramにリクエストを送り、承認を得る必要があります。指定したユーザーをフォロー(アンフォロー)したり、ブロック(アンブロック)したりと、「つながり」を変更することができます。

リクエスト方法

下記URLに、POSTメソッドでリクエストを送ります。relationshipsの権限が必要です。

POST https://api.instagram.com/v1/users/{ユーザーID}/relationship

パラメータ

access_token
アクセストークン。
action
どのように変更するのかを指定する。
follow … フォローする
unfollow … フォローを解除する
block … ブロックする
unblock … ブロックを解除する
approve … フォローリクエストを受け入れる
ignore … フォローリクエストを無視する

サンプルプログラム

サンプルデモでは、このブログのアカウントを対象ユーザーに指定して、フォローをするように設定されています。ただし、前述の通り、このプログラムを有効にするには、Instagramに別途、承認を得る必要があり、このサンプルデモは対応していないため、400のエラーになります。

PHP

<?php

	// 設定項目
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/users/1349593219/relationship' ;		// リクエストURL

	// パラメータ
	$params = array(
		'access_token' => $access_token ,
		'action' => 'follow' ,
	) ;

	// アイテムデータをJSON形式で取得する (CURLを使用)
	$curl = curl_init() ;

	// オプションのセット
	curl_setopt( $curl , CURLOPT_URL , $request_url ) ;
	curl_setopt( $curl , CURLOPT_HEADER, 1 ) ; 
	curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , 'POST' ) ;			// メソッド
	curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ;								// 証明書の検証を行わない
	curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ;								// curl_execの結果を文字列で返す
	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を作成
	$html .= '<h2>実行結果</h2>' ;

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

	// 取得したデータ
	$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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

コメント [Comment]

Instagram APIでは作品の投稿はできませんが、コメントの投稿ができます。この章では、APIを通して、コメントリストを取得する方法、そしてコメントを投稿する方法を紹介します。

コメントの取得

指定した作品のコメントリストを取得します。「メディアリスト」で取得するJSONにも、コメントデータが含まれますが、最新の8件までしか含まれません。このAPIでは、全てのコメントリストを取得することが可能です。

リクエスト方法

下記URLにGETメソッドでリクエストを送ることで調べることができます!commentsの権限が必要です。

GET https://api.instagram.com/v1/media/{メディアID}/comments

パラメータ

access_token
アクセストークン。

取得できるJSON

コメントリストのJSONデータは下記の通りです。

JSON

{"meta":{"code":200},"data":[{"created_time":"1438004171","text":"\u30a2\u30eb\u30da\u30f3\u30eb\u30fc\u30c8\u306e\u88cf\u5c71\u307f\u305f\u3044\u306a\u3068\u3053\u308d\u3067\u5076\u7136\u3001\u898b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3057\u305f\uff01","from":{"username":"arayutw","profile_picture":"https:\/\/igcdn-photos-b-a.akamaihd.net\/hphotos-ak-xaf1\/t51.2885-19\/11376682_1634451346768409_1710840484_a.jpg","id":"2056527147","full_name":"\u3042\u3089\u3086"},"id":"1038376707812381655"},{"created_time":"1438004221","text":"\u898b\u5b66\u8005\u304c\u7fa4\u304c\u3063\u3066\u305f\u3051\u3069\u3001\u5168\u7136\u98db\u3076\u6c17\u914d\u304c\u3042\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002","from":{"username":"syncerjp","profile_picture":"https:\/\/igcdn-photos-h-a.akamaihd.net\/hphotos-ak-xfa1\/t51.2885-19\/11271944_1663069317259287_313236559_a.jpg","id":"1349593219","full_name":"Syncer"},"id":"1038377129826471938"},{"created_time":"1438004236","text":"\u30ec\u30a2\u306a\u9ce5\u3067\u3057\u305f\u301c\u3002","from":{"username":"arayutw","profile_picture":"https:\/\/igcdn-photos-b-a.akamaihd.net\/hphotos-ak-xaf1\/t51.2885-19\/11376682_1634451346768409_1710840484_a.jpg","id":"2056527147","full_name":"\u3042\u3089\u3086"},"id":"1038377253071900688"}]}

サンプルプログラム

コメントを取得するサンプルです。こちらの投稿に付けられたコメントを取得しています。よろしければ、気軽にコメントを付けて動作を確認して下さい。

PHP

<?php

	// 設定項目
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/media/995444506896782101_1349593219/comments?access_token=' . $access_token ;		// リクエスト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を作成
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj || !isset($obj->data) )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		// コメントを解析
		foreach( $obj->data as $item )
		{
			// 各データの整理
			$id = $item->id ;		// コメントID
			$text = $item->text ;	// コメント本文
			$created_time = $item->created_time ;		// 投稿日時
			$from_id = $item->from->id ;		// ユーザーID
			$from_username = $item->from->username ;		// ユーザー名
			$from_profile_picture = ( isset( $item->from->profile_picture ) ) ? $item->from->profile_picture : '' ;		// アイコン画像
			$from_full_name = ( isset( $item->from->full_name ) ) ? $item->from->full_name : '' ;		// フルネーム

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

			// ブラウザに出力
			$html .= '<dl>' ;
			$html .= 	'<dt>ユーザーID</dt>' ;
			$html .= 		'<dd>' . $from_id . '</dd>' ;
			$html .= 	'<dt>ユーザー名</dt>' ;
			$html .= 		'<dd>' . $from_username . '</dd>' ;

			// フルネーム
			if( $from_full_name )
			{
				$html .= 	'<dt>フルネーム</dt>' ;
				$html .= 		'<dd>' . $from_full_name . '</dd>' ;
			}

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

			$html .= 	'<dt>コメント</dt>' ;
			$html .= 		'<dd>' . $text . '</dd>' ;
			$html .= 	'<dt>投稿日時</dt>' ;
			$html .= 		'<dd>' . $date . '</dd>' ;
			$html .= 	'<dt>コメントID</dt>' ;
			$html .= 		'<dd>' . $id . '</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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

コメントの投稿

Instagram APIでコメントを投稿するには、Instagram TEAMに申請を送り、リクエストURLへアクセスする許可を得る必要があります。本格的なwebサービスを構築する方は、ぜひこの機能を利用してみて下さい。なお、commentsの権限が必要です。

リクエスト方法

下記URLにPOSTメソッドでリクエストを送ります。

POST https://api.instagram.com/v1/media/{メディアID}/comments

パラメータ

access_token
アクセストークン。
text
コメントのテキスト。

サンプルプログラム

下記はコメントを投稿するためのサンプルプログラムです。当サイトのアプリケーションは承諾を得ていないため、エラーが発生します。

PHP

<?php

	// 設定項目
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/media/995444506896782101_1349593219/comments' ;		// リクエストURL

	// パラメータ
	$params = array(
		'access_token' => $access_token ,
		'text' => 'これは、APIを利用して投稿したコメントです。' ,
	) ;

	// アイテムデータをJSON形式で取得する (CURLを使用)
	$curl = curl_init() ;

	// オプションのセット
	curl_setopt( $curl , CURLOPT_URL , $request_url ) ;
	curl_setopt( $curl , CURLOPT_HEADER, 1 ) ; 
	curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , 'POST' ) ;			// メソッド
	curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ;								// 証明書の検証を行わない
	curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ;								// curl_execの結果を文字列で返す
	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を作成
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj || !isset($obj->data) )
	{
		$html .= '<p>リクエストに失敗してしまいました…。設定を再確認して下さい。</p>' ;
	}

	// 取得したデータ
	$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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

コメントの削除

このエンドポイントを利用するためには、コメントの投稿と同様、別途、Instagramに許可を得る必要があります。commentsの権限が必要です。

リクエスト方法

下記URLにDELETEメソッドでリクエストを送って下さい。コメントを投稿した「メディアID」に加えて、コメント自体のIDも必要です。

DELETE https://api.instagram.com/v1/media/{メディアID}/comments/{コメントID}

パラメータ

access_token
アクセストークン。

サンプルプログラム

前述した「コメントの投稿」と同様、Instagramの許可を得ていないため、デモではエラーになります。

PHP

<?php

	// 設定項目
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/media/995444506896782101_1349593219/comments/1038376707812381655' ;		// リクエストURL

	// パラメータ
	$params = array(
		'access_token' => $access_token ,
		'text' => 'これは、APIを利用して投稿したコメントです。' ,
	) ;

	// アイテムデータをJSON形式で取得する (CURLを使用)
	$curl = curl_init() ;

	// オプションのセット
	curl_setopt( $curl , CURLOPT_URL , $request_url ) ;
	curl_setopt( $curl , CURLOPT_HEADER, 1 ) ; 
	curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , 'DELETE' ) ;			// メソッド
	curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ;								// 証明書の検証を行わない
	curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ;								// curl_execの結果を文字列で返す
	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を作成
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj || !isset($obj->data) )
	{
		$html .= '<p>リクエストに失敗してしまいました…。設定を再確認して下さい。</p>' ;
	}

	// 取得したデータ
	$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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

ライク [Like]

APIを経由して、作品に「ライク」を付けたり消したりすることができます。この章では、「ライク」に関する操作を解説していきます。

ライクの取得

指定した作品にライクを付けたユーザーの一覧を取得します。

リクエスト方法

下記URLにGETメソッドでリクエストを送ることで調べることができます!commentsの権限が必要です。

GET https://api.instagram.com/v1/media/{メディアID}/likes

ライクを付けた作品を取得

指定した作品のライクではなく、自分がこれまでにライクを付けた作品を振り返るエンドポイントは、「メディア [Media]」の章で説明しています。

リクエスト方法

下記URLにGETメソッドでリクエストを送ることで調べることができます!commentsの権限が必要です。

GET https://api.instagram.com/v1/media/{メディアID}/likes

パラメータ

access_token
アクセストークン。

取得できるJSON

リクエストが成功すると、下記構造のJSONデータを取得できます。

JSON

{"meta":{"code":200},"data":[{"username":"yoho1223","profile_picture":"https:\/\/instagramimages-a.akamaihd.net\/profiles\/profile_37004093_75sq_1372140186.jpg","id":"37004093","full_name":"yoho1223"},{"username":"diselmo","profile_picture":"https:\/\/igcdn-photos-a-a.akamaihd.net\/hphotos-ak-xaf1\/t51.2885-19\/11282307_673473852786528_1343715740_a.jpg","id":"25148615","full_name":"Elmo\u2716\u6d2a\u4e8e\u5a77"}]}

サンプルプログラム

コメントを取得するサンプルです。こちらの投稿に付けられたコメントを取得しています。よろしければ、気軽にコメントを付けて動作を確認して下さい。

PHP

<?php

	// 設定項目
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/media/995444506896782101_1349593219/likes?access_token=' . $access_token ;		// リクエスト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を作成
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj || !isset($obj->data) )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		// コメントを解析
		foreach( $obj->data as $item )
		{
			// 各データの整理
			$from_id = $item->from->id ;		// ユーザーID
			$from_username = $item->from->username ;		// ユーザー名
			$from_profile_picture = ( isset( $item->from->profile_picture ) ) ? $item->from->profile_picture : '' ;		// アイコン画像
			$from_full_name = ( isset( $item->from->full_name ) ) ? $item->from->full_name : '' ;		// フルネーム

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

			// ブラウザに出力
			$html .= '<dl>' ;
			$html .= 	'<dt>ユーザーID</dt>' ;
			$html .= 		'<dd>' . $from_id . '</dd>' ;
			$html .= 	'<dt>ユーザー名</dt>' ;
			$html .= 		'<dd>' . $from_username . '</dd>' ;

			// フルネーム
			if( $from_full_name )
			{
				$html .= 	'<dt>フルネーム</dt>' ;
				$html .= 		'<dd>' . $from_full_name . '</dd>' ;
			}

			// アイコン画像
			if( $from_profile_picture )
			{
				$html .= 	'<dt>アイコン画像</dt>' ;
				$html .= 		'<dd><img class="_img" src="' . $from_profile_picture . '"></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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

ライクを付ける

指定した作品にハートマークの「ライク」を付けます。

リクエスト方法

下記のように組み立てたURLにPOSTメソッドでリクエストを送ります。likesの権限が必要です。それに加えて、ご利用には、Instagramの承認が必要です。

POST https://api.instagram.com/v1/media/{メディアID}/likes

パラメータ

access_token
アクセストークン。

サンプルプログラム

ライクを付けるサンプルプログラムです。対象はこちらの投稿です。ただし…、このアプリケーションはInstagramにそのための承認を得てないため、ライクを付けることはできず、エラーが発生してしまいます。

PHP

<?php

	// 設定項目
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/media/995591414852244002_1349593219/likes' ;		// リクエストURL

	// パラメータ
	$params = array(
		'access_token' => $access_token ,
	) ;

	// アイテムデータをJSON形式で取得する (CURLを使用)
	$curl = curl_init() ;

	// オプションのセット
	curl_setopt( $curl , CURLOPT_URL , $request_url ) ;
	curl_setopt( $curl , CURLOPT_HEADER, 1 ) ; 
	curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , 'POST' ) ;			// メソッド
	curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ;								// 証明書の検証を行わない
	curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ;								// curl_execの結果を文字列で返す
	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を作成
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj || !isset($obj->data) )
	{
		$html .= '<p>リクエストに失敗してしまいました…。設定を再確認して下さい。</p>' ;
	}

	// 取得したデータ
	$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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

ライクを取り消す

指定した作品に付けたライクを取り消します。ご利用には、Instagramの承認が必要です。

リクエスト方法

下記URLにDELETEメソッドでリクエストを送って下さい。DELETEは聞き慣れないメソッドかもしれませんが、POSTメソッドを送る処理と内容はほとんど変わりません。likesの権限が必要です。

DELETE https://api.instagram.com/v1/media/{メディアID}/likes

パラメータ

access_token
アクセストークン。

サンプルプログラム

ライクを取り消すための、PHPのサンプルプログラムを用意しました。こちらの投稿を対象にしています。ライクを付けるプログラムと同様に、アプリケーションが許可を得ていないため、サンプルデモのリクエストは必ずエラーになります。

PHP

<?php

	// 設定項目
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/media/995591414852244002_1349593219/likes' ;		// リクエストURL

	// パラメータ
	$params = array(
		'access_token' => $access_token ,
	) ;

	// アイテムデータをJSON形式で取得する (CURLを使用)
	$curl = curl_init() ;

	// オプションのセット
	curl_setopt( $curl , CURLOPT_URL , $request_url ) ;
	curl_setopt( $curl , CURLOPT_HEADER, 1 ) ; 
	curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , 'DELETE' ) ;			// メソッド
	curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ;								// 証明書の検証を行わない
	curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ;								// curl_execの結果を文字列で返す
	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を作成
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj || !isset($obj->data) )
	{
		$html .= '<p>リクエストに失敗してしまいました…。設定を再確認して下さい。</p>' ;
	}

	// 取得したデータ
	$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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

ハッシュタグ [Tags]

ハッシュタグに関する情報を取得するためのエンドポイントを紹介しています。

個別のタグ情報

タグ名を指定して、そのハッシュタグに関する情報を取得します。

リクエスト方法

下記URLにGETメソッドでリクエストを送って下さい。「タグ名」は日本語部分をURLエンコードしましょう。

GET https://api.instagram.com/v1/tags/{タグ名}

パラメータ

access_token
アクセストークン。

取得できるJSON

リクエスト成功時に取得できるJSONです。取得するタグは1つのため、dataプロパティが配列ではない点にご注意下さい。

JSON

{"meta":{"code":200},"data":{"media_count":18493,"name":"\u516b\u666f\u5cf6\u30b7\u30fc\u30d1\u30e9\u30c0\u30a4\u30b9"}}

サンプルプログラム

例えば、「八景島シーパラダイス」というハッシュタグ名の情報を取得するサンプルプログラムが下記です。

PHP

<?php

	// 設定項目
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/tags/' . rawurlencode( '八景島シーパラダイス' ) . '?access_token=' . $access_token ;		// リクエスト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を作成
	$html .= '<h2>実行結果</h2>' ;

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

			// 各データの整理
			$media_count = $item->media_count ;		// 投稿数
			$name = $item->name ;		// ハッシュタグ名

			// ブラウザに出力
			$html .= '<dl>' ;
			$html .= 	'<dt>ハッシュタグ名</dt>' ;
			$html .= 		'<dd>' . $name . '</dd>' ;
			$html .= 	'<dt>投稿数</dt>' ;
			$html .= 		'<dd>' . $media_count . '</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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

タグが付いた作品

指定したハッシュタグが付いた作品を検索する方法は、「メディア [Media]」の章で解説しています。

タグを検索する

指定したキーワードに関するハッシュタグの一覧を取得します。

リクエスト方法

下記URLにGETメソッドでリクエストを送って下さい。「タグ名」は日本語部分をURLエンコードしましょう。

GET https://api.instagram.com/v1/tags/search

パラメータ

access_token
アクセストークン。
q
検索キーワード。

取得できるJSON

リクエストに成功すると、dataプロパティに配列形式で、ヒットした複数のタグ情報が含まれています。

JSON

{"meta":{"code":200},"data":[{"media_count":1204988,"name":"\u6771\u4eac"},{"media_count":221906,"name":"\u6771\u4eac\u30c7\u30a3\u30ba\u30cb\u30fc\u30e9\u30f3\u30c9"},{"media_count":174705,"name":"\u6771\u4eac\u30c9\u30fc\u30e0"},{"media_count":167170,"name":"\u6771\u4eac\u30bf\u30ef\u30fc"},{"media_count":127548,"name":"\u6771\u4eac\u30c7\u30a3\u30ba\u30cb\u30fc\u30b7\u30fc"}]}

サンプルプログラム

例えば、「東京」というキーワードでハッシュタグを検索するサンプルプログラムが下記です。

PHP

<?php

	// 設定項目
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/tags/search?q=' . rawurlencode( '東京' ) . '&access_token=' . $access_token ;		// リクエスト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を作成
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj || !isset($obj->data) )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		// 解析
		foreach( $obj->data as $item )
		{
			// 各データの整理
			$media_count = $item->media_count ;		// 投稿数
			$name = $item->name ;		// ハッシュタグ名

			// ブラウザに出力
			$html .= '<dl>' ;
			$html .= 	'<dt>ハッシュタグ名</dt>' ;
			$html .= 		'<dd>' . $name . '</dd>' ;
			$html .= 	'<dt>投稿数</dt>' ;
			$html .= 		'<dd>' . $media_count . '</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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

場所 [Locations]

場所に関する情報を取得するためのエンドポイントを紹介しています。

個別の場所情報

場所IDを指定して、そのロケーションに関する情報を取得します。

リクエスト方法

下記URLにGETメソッドでリクエストを送って下さい。場所IDは、「場所の検索」のエンドポイントで確認できます。

GET https://api.instagram.com/v1/locations/{場所ID}

パラメータ

access_token
アクセストークン。

取得できるJSON

リクエスト成功時に取得できるJSONです。場所IDとともに、緯度、経度も確認することができます。

JSON

{"meta":{"code":200},"data":{"latitude":36.42607694,"id":"479542822","longitude":136.935537609,"name":"\u8336\u5e97 \u307e\u3064\u3084"}}

サンプルプログラム

富山県の相倉合掌造り集落にある「まつや」というお店(ID:479542822)の場所情報を取得してみましょう。

PHP

<?php

	// 設定項目
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/locations/479542822?access_token=' . $access_token ;		// リクエスト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を作成
	$html .= '<h2>実行結果</h2>' ;

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

			// 各データの整理
			$id = $item->id ;		// 場所ID
			$name = $item->name ;		// 場所名
			$latitude = $item->latitude ;		// 緯度
			$longitude = $item->longitude ;		// 経度

			// ブラウザに出力
			$html .= '<dl>' ;
			$html .= 	'<dt>場所ID</dt>' ;
			$html .= 		'<dd>' . $id . '</dd>' ;
			$html .= 	'<dt>場所名</dt>' ;
			$html .= 		'<dd>' . $name . '</dd>' ;
			$html .= 	'<dt>緯度</dt>' ;
			$html .= 		'<dd>' . $latitude . '</dd>' ;
			$html .= 	'<dt>経度</dt>' ;
			$html .= 		'<dd>' . $longitude . '</dd>' ;
			$html .= 	'<dt>地図</dt>' ;
			$html .= 		'<dd><a href="https://www.google.co.jp/maps/@' . $latitude . ',' . $longitude . ',15z" target="_blank">Google Mapsで位置を確認する</a></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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

場所に投稿された作品

指定した場所に投稿された作品の一覧を取得するには、「メディア [Media]」の章をご参考下さい。

場所を検索する

位置座標、またはFoursquareのIDを指定するなどして、それに関連するロケーションを検索します。

リクエスト方法

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

GET https://api.instagram.com/v1/locations/search

パラメータ

access_token
アクセストークン。
lat
緯度。lngとセットで指定する。
lng
経度。latとセットで指定する。
distance
検索する範囲を「メートル」で指定する。latlngとセットで指定する。初期値は1000で、最大値は5000
facebook_places_id
Facebook PlaceのID。
foursquare_id
foursquare v1(旧バージョン)のvenue ID(非推奨)。
foursquare_v2_id
foursquare v2(現行バージョン)のvenue ID。

取得できるJSON

リクエスト成功時に取得できるJSONです。dataプロパティに、条件にマッチしたロケーションが配列形式で含まれています。

JSON

{"meta":{"code":200},"data":[{"latitude":36.7012167,"id":"535440076","longitude":137.2132087,"name":"Toyama Station"},{"latitude":36.7012167,"id":"705315609","longitude":137.2132087,"name":"Toyama Station"},{"latitude":36.7012167,"id":"263420170","longitude":137.2132087,"name":"Dentetsu Toyama Station"},{"latitude":36.7012167,"id":"702206436","longitude":137.2132087,"name":"Toyama Station"},{"latitude":36.701018827,"id":"19008485","longitude":137.213374972,"name":"\u30f4\u30a3\u30c9\u30d5\u30e9\u30f3\u30b9 JR\u5bcc\u5c71\u5e97"},{"latitude":36.70105121,"id":"746863569","longitude":137.213513977,"name":"\u897f\u753a\u5927\u559c\u3000\u3068\u3084\u30de\u30eb\u30b7\u30a7\u5e97"}]}

サンプルプログラム

富山駅の位置座標を指定して、その周辺に登録されているロケーションを検索してみましょう。

PHP

<?php

	// 設定項目
	$access_token = '' ;	// アクセストークン
	$request_url = 'https://api.instagram.com/v1/locations/search?lat=36.701226&lng=137.21319&access_token=' . $access_token ;		// リクエスト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を作成
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj || !isset($obj->data) )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		// 解析する
		foreach( $obj->data as $item )
		{
			// 各データの整理
			$id = $item->id ;		// 場所ID
			$name = $item->name ;		// 場所名
			$latitude = $item->latitude ;		// 緯度
			$longitude = $item->longitude ;		// 経度

			// ブラウザに出力
			$html .= '<dl>' ;
			$html .= 	'<dt>場所ID</dt>' ;
			$html .= 		'<dd>' . $id . '</dd>' ;
			$html .= 	'<dt>場所名</dt>' ;
			$html .= 		'<dd>' . $name . '</dd>' ;
			$html .= 	'<dt>緯度</dt>' ;
			$html .= 		'<dd>' . $latitude . '</dd>' ;
			$html .= 	'<dt>経度</dt>' ;
			$html .= 		'<dd>' . $longitude . '</dd>' ;
			$html .= 	'<dt>地図</dt>' ;
			$html .= 		'<dd><a href="https://www.google.co.jp/maps/@' . $latitude . ',' . $longitude . ',15z" target="_blank">Google Mapsで位置を確認する</a></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://instagram.com/accounts/manage_access/" target="_blank">https://instagram.com/accounts/manage_access/</a></p>' ;

?>

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

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

リアルタイムAPI

Web Hookというシステムをご存知でしょうか?通常、APIは、開発者側がサービス(Instagram)側に向かってリクエストを送り、データを受け取るものですが、この機能を利用すれば、設定したイベントが発生した時に、サービス側が開発者側の指定したURLに対して、通知(リクエスト)を送ってくれるようになります。

Instagram APIにもこのWeb Hookに似た通知機能、「リアルタイムAPI」が存在します。この章ではInstagramのリアルタイムAPIの使い方を、分かりやすいように紹介していきます!

イベント一覧

まずは、どのようなイベントが発生した時に通知を送ってくれるのかを見てみましょう。開発者は、下記4種類のイベント(通知条件)を設定することができます。

Users
アプリを認証している「ユーザー」が新しい作品を投稿した時。
Tags
指定した「ハッシュタグ名」が付けられた作品が投稿された時。
Locations
指定した「場所ID」が付けられた作品が投稿された時。
Geographies
指定した「位置範囲内」で作品が投稿された時。

リクエスト方法

それでは実際に、「リアルタイムAPI」の通知を受けるために、イベントを設定してみましょう。設定方法は、下記URLにPOSTメソッドでリクエストを送信します。各イベントにより、必要となるパラメータが違うので、それぞれ紹介していきます。

POST https://api.instagram.com/v1/subscriptions/

パラメータ

各イベントごとに専用のパラメータがあるので、それぞれ説明します。なお、全てのパラメータが必須です。

Users

client_id
クライアントID。
client_secret
クライアントシークレット。
object
userを指定する。
aspect
mediaを指定する。
verify_token
「合い言葉」となるキーを指定する。
callback_url
通知を受け取るプログラムが設置してあるURLを指定する。

Tags

指定した「タグ名」を付けた作品が投稿された時に、Instagram側から通知を受け取ることができます。対象は、アプリを認証しているユーザーだけではなく、Instagramの全ユーザーです。Tagsを設定するには、下記のパラメータを指定します。

client_id
クライアントID。
client_secret
クライアントシークレット。
object
tagを指定する。
aspect
mediaを指定する。
object_id
通知対象となる「ハッシュタグ名」を指定する。
verify_token
「合い言葉」となるキーを指定する。
callback_url
通知を受け取るプログラムが設置してあるURLを指定する。

Locations

指定した「場所ID」に関連付いた作品が投稿された時に、Instagram側から通知を受け取ることができます。対象はTagsと同様、Instagramの全ユーザーです。Locationsを設定するには、下記のパラメータを指定します。

client_id
クライアントID。
client_secret
クライアントシークレット。
object
locationを指定する。
aspect
mediaを指定する。
object_id
通知対象となる「場所ID」を指定する。
verify_token
「合い言葉」となるキーを指定する。
callback_url
通知を受け取るプログラムが設置してあるURLを指定する。

Geography

「場所ID」ではなく、開発者が独自に設定した「位置範囲内」のGEOデータが付いた作品が投稿された時に、Instagram側から通知を受け取ることができます。対象はInstagramの全ユーザーです。Geographyを設定するには、下記のパラメータを指定します。

client_id
クライアントID。
client_secret
クライアントシークレット。
object
geographyを指定する。
aspect
mediaを指定する。
lat
緯度を指定する。
lng
経度を指定する。
radius
半径をメートルで指定する。
verify_token
「合い言葉」となるキーを指定する。
callback_url
通知を受け取るプログラムが設置してあるURLを指定する。

登録する

通常のAPIとは違い、少しだけややこしいのが、このリアルタイムAPIの悩みどころ…。ということで、簡単に流れを紹介していきます。まずは上記で説明した通り、適切にリクエストを送信します。問題は、その後の流れです。

リクエストを送ると、Instagram側は、リクエストを送ってきたプログラムを待たせておいてその間に、「callback_urlに指定したURL」に対して、GETメソッドで、下記の3つのパラメータを送ってきます。PHPなら$_GET["hub_verify_token"]などで、それぞれ受け取れますね。

myscript.php?hub_verify_token=...&hub_challenge=...&hub_mode=...

各パラメータの説明

hub_verify_token
こちらがverify_tokenに設定した「合い言葉」となるキー。
hub_challenge
Instagram側が発行した確認用のキー。
hub_mode
値は必ず、subscribe

これを受けて、開発者のプログラム側(callback_urlに指定したURL)は、送られてきた「確認用のキー」を、Instagram側にレスポンスで返してやる必要があります。「”レスポンスで返す”ってなんやねん!馬鹿野郎!」と思った方、大変申し訳ございません。具体的には、echoで出力してやるだけなんです。

PHP

// 送られてきた「確認用のキー」をレスポンスで返す = 出力する
echo $_GET[ 'hub_challenge' ] ;

はい、これだけ。これを受けてInstagram側は、「よし、こいつ(開発者側)のプログラムは正常に動いてるな、それなら通知を開始してやろう」となるわけです。こうしてやっと、先ほどから待たせていた、「最初にリクエストを送ってきたプログラム」に対して、「登録受け付けたで!」というJSONデータを返却し、ここで晴れて登録が完了します。

取得できるJSON

登録を受け付けた際に返却されるJSONデータは下記の通りです。objectには「通知の種類」を表すコードが、object_idには、Tagsならタグ名、Locationsなら場所IDというように、条件に指定した「値」が含まれています。

ここで重要なのが、「Geography」の場合です。独自に設定した位置範囲の情報は、1つのIDとして登録され、「ジオID」となり、object_idに格納されます。この「ジオID」は言わば、独自に作った「場所ID」みたいなものですが、「場所ID検索」ではメディアリストを取得できません。代わりに「ジオID検索」で取得することができるようになります。

JSON

{
	"meta": {
		"code": 200
	},
	"data": {
		"object": "tag",
		"object_id": "yamada",
		"aspect": "media",
		"callback_url": "http://syn...php",
		"type": "subscription",
		"id": "8101428"
	}
}

各プロパティの説明

code
ステータスコード。200ならリクエストが成功。
data->object
通知の種類。
user … ユーザーが投稿した
tag … ハッシュタグが付いた投稿があった
location … 場所IDに投稿があった
geography … 位置範囲内に投稿があった
data->object_id
通知の条件。objecttaglocationgeographyの場合にのみ含まれる。
data->callback_url
通知が送られたURL。
data->id
通知ID。

サンプルプログラム

下記がInstagramで「リアルタイムAPI」を登録するための、サンプルプログラムです。3〜6行目、そして17〜25行目を調整して下さいね。$callback_urlにはこのプログラムのURLを指定して下さい。

PHP

<?php

	// 設定
	$client_id = '' ;		// クライアントID
	$client_secret = '' ;		// クライアントシークレット
	$callback_url = 'http://.../myscript.php' ;		// コールバックURL
	$verify_token = 'aikotoba' ;		// 合い言葉となるキー

	// 登録時の、Instagram側の確認用アクセスを受ける
	if( $_SERVER['REQUEST_METHOD'] == 'GET' && isset($_GET['hub_verify_token']) && $_GET['hub_verify_token'] == $verify_token && isset($_GET['hub_challenge']) && isset($_GET['hub_mode']) && $_GET['hub_mode'] == 'subscribe' )
	{
		// 確認用のキーを返却する
		echo $_GET[ 'hub_challenge' ] ;
		exit ;
	}
 
	// パラメータを連想配列形式で指定(サンプルはGeographyの場合)
	$params = array(
		'client_id' => $client_id ,
		'client_secret' => $client_secret ,
		'object' => 'geography' ,
		'aspect' => 'media' ,
		'lat' => '35.798535' ,
		'lng' => '139.7940011' ,
		'radius' => '1000' ,
		'verify_token' => $verify_token ,
		'callback_url' => $callback_url ,
	) ;

	// POSTリクエストを送信し、返ってきたJSONデータをオブジェクト形式に変換
	// JSONデータが返ってくる前に待たされて、8〜13行目が行なわれる
	$json = @file_get_contents(
		'https://api.instagram.com/v1/subscriptions/' ,
		false,stream_context_create( array( 'http' => array(
			'method' => 'POST' ,
			'content' => http_build_query( $params ) ,
		)))
	) ;

	// 取得したJSONをオブジェクトに変換
	$obj = json_decode( $json ) ;
 
	// 各データの整理
	$id = $obj->data->id ;		// 通知ID
	$url = 'https://api.instagram.com/v1/subscriptions?client_id=' . $params['client_id'] . '&client_secret=' . $params['client_secret'] ;		// 登録状況の確認用URL

	// HTML用
	$html = '' ;

	// 取得したデータ
	$html .= '<h2>取得したデータ</h2>' ;
	$html .= '<p>リアルタイム通知を登録しました。通知IDは<mark>' . $id . '</mark>です。</p>" : "<p>登録に失敗しました…。パラメータがおかしいか、重複登録です。</p>' ;
	$html .= 	'<h3>JSON</h3>' ;
	$html .= 	'<p><textarea rows="8">' . $json . '</textarea></p>' ;
	$html .= 	'<h3>登録状況の確認</h3>' ;
	$html .= 	'<p><a href="' . $url . '" target="_blank">' . $url . '</a></p>' ;

?>

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

プログラムに、受けたい通知タイプのパラメータを適切に設定して起動すれば、下記構造のJSONを受け取ることができます。「Geography」を登録した場合のサンプルです。object_idに格納されている6088330が、指定した位置範囲を反映した「ジオID」です。「通知ID」と混同しないように気を付けて下さい。

JSON

{"meta":{"code":200},"data":{"object":"geography","object_id":"12912333","aspect":"media","callback_url":"https:\/\/syncer.jp\/myscript.php","type":"subscription","id":"19246783"}}

確認する

現在、Instagramにどれくらいのリアルタイム通知を登録しているのか、確認するためには、下記のURLにアクセスして下さい。現在の登録状況を示したJSONデータが返ってきます。

GET https://api.instagram.com/v1/subscriptions?client_id={クライアントID}&client_secret={クライアントシークレット}

下記は3つの通知を登録している場合のJSONです。

JSON

{"meta":{"code":200},"data":[{"object":"geography","object_id":"12912332","aspect":"media","callback_url":"https:\/\/syncer.jp\/myscript.php","type":"subscription","id":"19246782"},{"object":"geography","object_id":"12912333","aspect":"media","callback_url":"https:\/\/syncer.jp\/myscript.php","type":"subscription","id":"19246783"},{"object":"geography","object_id":"12912331","aspect":"media","callback_url":"https:\/\/syncer.jp\/myscript.php","type":"subscription","id":"19246781"}]}

削除する

Instagramのリアルタイム通知を取り消す方法を紹介します。

リクエスト方法

下記URLに、DELETEメソッドでリクエストを送信します。

DELETE https://api.instagram.com/v1/subscriptions

パラメータ

client_id
クライアントID。
client_secret
クライアントシークレット。
object
削除するタイプを指定する。そのタイプに所属する通知が全て削除されるので注意すること。
all … 全ての通知を削除
user … Usersを削除
tag … Tagsを削除
location … Locationsを削除
geography … Geographyを削除
id
削除する通知IDを指定する。

サンプルプログラム

下記はリアルタイムAPIの通知を全て削除するためのサンプルプログラムです。

PHP

<?php

	// 設定
	$client_id = '' ;		// クライアントID
	$client_secret = '' ;		// クライアントシークレット

	// パラメータを連想配列形式で指定
	$params = array(
		'client_id' => $client_id ,
		'client_secret' => $client_secret ,
		'object' => 'all' ,
	) ;

	// POSTリクエストを送信し、返ってきたJSONデータをオブジェクト形式に変換
	// JSONデータが返ってくる前に待たされて、8〜13行目が行なわれる
	$json = @file_get_contents(
		'https://api.instagram.com/v1/subscriptions?' . http_build_query( $params ) ,
		false,stream_context_create( array( 'http' => array(
			'method' => 'DELETE' ,
		)))
	) ;

	// 取得したJSONをオブジェクトに変換
	$obj = json_decode( $json ) ;
 
	// HTML用
	$html = '' ;

	// 確認用のURL
	$url = 'https://api.instagram.com/v1/subscriptions?client_id=' . $params['client_id'] . '&client_secret=' . $params['client_secret'] ;		// 登録状況の確認用URL

	// 取得したデータ
	$html .= '<h2>実行結果</h2>' ;
	$html .= '<p>削除リクエストを送信しました。</p>' ;
	$html .= 	'<h3>JSON</h3>' ;
	$html .= 	'<p><textarea rows="8">' . $json . '</textarea></p>' ;
	$html .= 	'<h3>登録状況の確認</h3>' ;
	$html .= 	'<p><a href="' . $url . '" target="_blank">' . $url . '</a></p>' ;

?>

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

受信する

最後に、Instagram APIの「リアルタイム通知」を受け取る方法を紹介します。リアルタイム通知は設定したイベントが起こったタイミングで、$callback_urlで指定したURLに対して、POSTメソッドで下記のJSONデータを送信してきます。

送られてくるJSON

JSON

[
	{
		"subscription_id": "1",
		"object": "user",
		"object_id": "1234",
		"changed_aspect": "media",
		"time": 1297286541,
		"data": {
			"media_id": "759036190747972777_295878252"
		}
	}
]

各プロパティの説明

object
通知の種類。
user … ユーザーが投稿した
tag … ハッシュタグが付いた投稿があった
location … 場所IDに投稿があった
geography … 位置範囲内に投稿があった
object_id
通知の条件。objecttaglocationgeographyの場合にのみ含まれる。
time
イベントが発生した日時。UNIX TIMESTAMP形式。
data->media_id
投稿された作品のメディアID。

JSONの受け取り方

このJSONデータは、特定のPOSTパラメータに含まれているわけではないため、下記のように「読み込み専用のストリーム」にアクセスして取得することが可能です。

PHP

// 読み込み専用のストリームにアクセスし、JSONデータを取得
$json = @file_get_contents( 'php://input' ) ;

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

あとは、例えばUsersだったら、object_idに含まれる「ユーザーID」を参照して、「このユーザーが更新したから、このユーザーのデータを取りに行って、色々と更新!」というように、自身が運営するwebサービスなどの仕様に合わせて、システムを作っていって下さいね。

[X-Hub-Signature]の使い方

さて、Instagram側から通知がJSONデータとして送られてくるのはいいですが、「誰が送ってきたか分からない」のはセキュリティ的に怖いですよね…。実際に、通知を受け取るプログラムの設置URLを知っていれば、悪意のある誰でもがInstagramを装ってJSONデータを送りつけることが可能です。

そういった問題を解決する方法として、「X-Hub-Signatureを利用した認証システム」が存在します。ざっくり言うと、開発者側とInstagram側しか知り得ない「クライアントシークレット」を元にした署名で、Instagramが偽物じゃないことを確認する認証方法です。

具体的な認証方法

通知で送られてくるリクエストのヘッダー内の、x-hub-signatureを参照すると、そこに「署名」が含まれています。次のように確認することができます。

PHP

$headers = getallheaders() ;
$hub_signature = $headers['x-hub-signature'] ;

この「署名」は、次のように、HMAC方式を使用して生成したハッシュ値($hash)と、同じ値になります。$jsonは「受け取ったJSONデータ」、$client_secretは「クライアントシークレット」です。

PHP

$hash = hash_hmac( 'sha1' , $json , $client_secret ) ;

つまり、次の条件を満たせば、「クライアントシークレット」を知っているInstagram側からの通知であると判断できますねー。

$hub_signature = $hash

POST、DELETEメソッド利用の申請

InstagramのAPIで、POST、DELETEメソッドを利用するには、Instagramに承認を得る必要があります。これは、例えば、自動で大量に宣伝投稿するようなスパムを防ぐためですね。どうやらテスト用に試すことは無理そうなので、残念ながら私はこの記事で作動させているアプリケーションで承認を得ていません。

権限の申請フォーム
権限の申請フォーム

承認が降りる基準は厳しいようで、ビジネス用で既に公開されているアプリケーションに限られているようです。例えば、この記事のデモ用のアプリケーションのような、テスト用、開発段階のアプリケーションでは却下されるみたいです。平たく言うならば、個人サイトでは気軽に使えないと思っておけばいいんじゃないでしょうか。

申請したい人は、下記ページにアクセスして下さいね。

[Enforce signed header]の使い方

Enforce signed header
Enforce signed header

「アプリ登録」の際、「まだ未段階なので"Enforce signed header"にはチェックを入れないでおいて下さい」と、ちょっと無責任気味にお願いしたあの件です。せっかくなので解説します。

[Enforce signed header]とは?

Instagram APIではユーザーデータを変更するための、POST、DELETEメソッドを用いるリクエストにおいて、通常のリクエストに加えて、「適切な署名を発行しないとリクエストを受け付けない!」というセキュリティ設定ができます。

  • [POST] /users/{user_id}/relationship [つながりの変更]
  • [POST] /media/{media_id}/comments [コメントの投稿]
  • [DELETE] /media/{media_id}/comments/{comment_id} [コメントの削除]
  • [POST] /media/{media_id}/likes [ライクを付ける]
  • [DELETE] /media/{media_id}/likes [ライクを取り消す]

これによって、仮にユーザーのアクセストークンが流出してしまった場合でも、犯人は「署名」が作れない限り、上記のリクエストを実行することができないようになります。大幅なセキュリティ向上が望めるわけですねー。

署名を作成する方法

この「署名($signature)」は「クライアントシークレット($client_secret)」と「サーバーのIPアドレス($ip)」を元に、具体的には次のように作ることができます。

PHP

$signature = hash_hmac( 'sha256' , $ip , $client_secret , false ) ;

こうして出来上がった「署名($signature)」をパイプライン(|)で区切って「IPアドレス($ip)」と一緒にし、X-Insta-Forwarded-Forと名付けたリクエストヘッダーに値として設定することで、「署名による認証」をクリアすることが可能です。

X-Insta-Forwarded-For: $ip | $signature

サンプルプログラム

それでは、この署名を作成し、リクエストを送る方法を紹介します。あるメディアにライクを付けるという想定だと、次のようになります。

PHP

<?php

	// 設定項目
	$access_token = '' ;
	$client_secret = '' ;
	$request_url = 'https://api.instagram.com/v1/media/995591414852244002_1349593219/likes' ;		// リクエストURL

	// パラメータ
	$params = array(
		'access_token' => $access_token ,
	) ;

	// IPアドレスを求める
	$ip = gethostbyname( 'syncer.jp' ) ;

	// 署名の作成
	$signature = hash_hmac( 'sha256' , $ip , $client_secret , false ) ;

	// ヘッダーの値の作成
	$request_header = join( '|' , array( $ip , $signature ) ) ;

	// アイテムデータをJSON形式で取得する (CURLを使用)
	$curl = curl_init() ;

	// オプションのセット
	curl_setopt( $curl , CURLOPT_URL , $request_url ) ;
	curl_setopt( $curl , CURLOPT_HEADER, 1 ) ; 
	curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , 'POST' ) ;			// メソッド
	curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ;								// 証明書の検証を行わない
	curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ;								// curl_execの結果を文字列で返す
	curl_setopt( $curl , CURLOPT_HTTPHEADER , array( 'X-Insta-Forwarded-For: ' . $request_header ) ) ;			// ヘッダー
	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を作成
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj || !isset($obj->data) )
	{
		$html .= '<p>リクエストに失敗してしまいました…。設定を再確認して下さい。</p>' ;
	}

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

iOS用のURLスキーム

iPhoneでリンクをクリックしたら、直接アプリを開かせることができるURLスキームの一覧です。これらは大抵、Androidでも同じように動作します。

InstagramのURLスキーム一覧

下記は利用できるURLスキームの一覧です。サンプルのリンクは、iOS端末、またはAndroid端末でクリックしてみて下さい。アプリケーションがインストールされていることが前提です。

instagram://app
Instagramのアプリを起動する。
例: instagram://app
instagram://camera
Instagram内のカメラを起動する。
例: instagram://camera
instagram://media?id={メディアID}
メディアIDを指定することで、アプリを起動し、その投稿ページに移動させる。
例: instagram://media?id=995441237695763249_2056527147
instagram://user?username={ユーザーネーム}
ユーザーネーム(@arayutw)を指定することで、アプリを起動し、そのユーザーのプロフィールページに移動させる。
例: instagram://user?username=arayutw
instagram://location?id={ロケーションID}
ロケーションIDを指定することで、アプリを起動し、その地域のページに移動させる。
例: instagram://location?id=479542822
instagram://tag?name={タグ名}
タグ名を指定することで、アプリを起動し、そのタグの検索結果に移動させる。
例: instagram://tag?name=cat

端末を判別するには?

URLスキームは、デスクトップPC、Androidなど、対応していない機種でクリックしても何も起こりません。iOSのユーザーだけに表示する必要があります。例えば、PHPで端末を正確に判別するには、Mobile DetectというPHPライブラリがお手軽でお勧めです。

ネット上の一部解説記事について

InstagramのAPIは大変人気で、ネット中に「使い方」についての素晴らしい記事がありました。ただ、その中で気になったのが「jQueryでInstagram APIを使う」という趣旨の記事です。これらの記事の中には、サーバーサイド(phpとかPerlとか)を通さずにクライアントサイド(JavaScript)だけで処理を完了させているものが多数あります。

アクセストークンが知られるリスク

そのJavaScript(jQuery)のソースコードを確認すると、当然ですがアクセストークンが丸見えになる仕様でした。これは大変危険な使い方だと思います。パーミッションの設定によっては、アクセストークンを見た悪意ある人物が勝手にフォローしたりコメントを削除したりライクを付けたり、といったことが可能になります。

「Enforce signed headerによる署名」を利用すれば、「変更関連(POST、DELETE)の悪戯」は防げますが、記事中でそういった点に触れられていることもなく、「アクセストークンが丸見えになる危険性」については想定外なんだと推察します。

ネット上にある「使い方」を参考にする際は、今回の例だったら「アクセストークンが丸見えになるとはどういうことか」というように、リスクを意識するようにして下さい。このページの記事だって、素人が書いていることなので、問題点が含まれてないという保証は全くありません。むしろ「APIを動かすためのサンプル」という趣旨なので、エラー処理など一切なく、仮にそのままwebサービスに流用すると様々な不具合が発生するはずです。あくまでも下地としてご利用下さい…。

JavaScript(jQuery)で利用する方法

「アクセストークンを使ってデータを取得する」という部分だけをサーバーサイド(PHPなど)に任せて、それら以外をクライアントサイド(JavaScriptなど)に任せるようにすれば、アクセストークンを隠しながら、JavaScriptでAPIを利用することが可能になります。例えば下記のように構成しましょう。jQueryを利用しています。

PHP

<?php

//POSTリクエストの場合のみ受付
if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
	// アクセストークン
	$access_token = '29587...fa062d9' ;

	// JSONデータを取得して出力
	echo @file_get_contents( 'https://api.instagram.com/v1/users/self/media/recent/?access_token=' . $access_token ) ;

	// 終了
	exit ;

}

JavaScript

$(function()
{
	$.ajax({
		url: 'PHPファイルのURL' ,
		type: 'POST' ,
		dataType: 'json' ,
		success: function( json )
		{
			//データの取得に成功した時の処理
			//〜
		} ,
		error: function()
		{
			//データ取得に失敗した時の処理
			//〜
		}
	}) ;
}) ;

APIを使ったwebサービスまとめ

InstagramのAPIを利用して、どのようなwebサービスが作られているのか。紹介していきます。これから制作するサービスの参考にしてみて下さい。

INUSTAGRAM

INUSTAGRAM
INUSTAGRAM

犬の画像をただひたすらに閲覧できるのが、この「イヌスタグラム」です。「タグで作品を取得する」か「リアルタイムAPI」辺りを利用して、「DOG」「犬」などのタグが付いた写真を取得、紹介しているんだと思います。Instagram APIを最もオーソドックスに使ったwebサービスと言えるんじゃないでしょうか。これの姉妹サイトとして「ネコスタグラム」もありますが、犬派の私はこちらを紹介しました。

jLeaguram

jLeaguram
jLeaguram

動物じゃなく「夜景」「廃墟」など、他のカテゴリにも応用できそうですねー。と思っていたところ、発見したのがこのサイト。「サッカー」に関連した写真を専門に見ることができるwebサービスです。「スポーツ」という発想はありませんでした。

IROSTAGRAM

IROSTAGRAM
IROSTAGRAM

こちらは、「色」からInstagramの写真を検索できるwebサービスです。Instagramから写真を取得するのに加えて、「色分析をして分類する」という独自の処理を組み合わせている例ですねー。

Bijostagram

Bijostagram
Bijostagram

さらには「美女」を専門にした、男性にとっては、まさに「神サービス」も存在しました(笑)。と、それだけではなく、こちらのサービスはただ美女の画像を集めるというだけではなく、顔画像認識と、タグ、コメント内容の解析を駆使し、プログラムに機械学習をさせながら、日々、精度を向上させているそうです。なるほど、このサイトで表示される写真は、本当にテーマ通りのものばかりです。

Instagramは投稿作品が豊富にあるのが魅力な反面、釣りタグや、関係ないタグ付けなどが横行していて、例えば、特定のタグを指定しても関係ない写真ばかり取得してしまうのが悩みの種でもあります。そんな中、こういった「自動で取捨選択するシステム作り」が実現されているのを見ると、俄然やる気が出てきませんか?個人的に、このサイトはシステム面が気になって見に行ってしまうサイトです。

まだまだ「ソラスタグラム」「ウミスタグラム」「チンチラグラム」「オサカナグラム」「カピバラグラム」などなど、世の中に需要はたくさんあると思うので、みなさんも、ぜひ作成してみてはいかがでしょうか?

photoll

photoll
photoll

こちらは「撮影スポット」の情報をシェアするSNS、「photoll」です。ローンチしたばかりで、ユーザーによる投稿が少ない状況を、APIを利用してInstagramから関連作品を引っ張ってくることによって、補っています。Instagram APIをサービスのメインではなく、補助的役割として活用している例ですね。

この巨大な規模のSNSは、なんと個人で作成したらしいです。こういうサービスって、これだけ大きいと上手く回り出すまでが大変なんですが、個人的に頑張ってほしいと思っているサイトです。全然関係ないんですが、短いドメインって美しいですよね。2015年7月頃に確認したところ、残念ながら閉鎖されていました。

i-am-cc.org

i-am-cc.org
i-am-cc.org

Instagramに「クリエイティブ・コモンズ・ライセンス」を設定することができるwebサービスです。ユーザーはこのサイトに登録し、ライセンスを明示することで、作品を他人に利用してもらうことが可能になります。その精神もアイデアも大変素晴らしいInstagram APIの活用方法だと思います。

1/365gram

1/365gram
1/365gram

Instagramに投稿した写真をカレンダー形式で振り返ることができるwebサービス。TwitterでいうTwilogみたいなタイプです。こうやって見せ方を変えるだけでも大変魅力になるんだなーと、センスが足りずに真似できない自分は思うのでした。

Marimelody wears dress in November.

Marimelody wears dress in November.
Marimelody wears dress in November.

こちらも面白いwebサイトを発見したのでご紹介。11月のファッション、「ノベンバコーデ」を紹介しているサイトです。このサイトは作者の方がInstagramに投稿した11月の写真を一覧形式で表示しています。APIはwebサービスを作成する用途だけでなく、個人的なライフログや情報をまとめるための手段としても活用されるべきで、とても良い事例だと思いました。

ダウンロード