Instagram API から投稿画像を取得しスライダー/カルーセル表示

ファッション/アパレル系の企業サイトだと、画像投稿系ソーシャルサービスを利用されているのも増えて、公式サイトにもそのデータを表示したい!ケースも増えてきました。

今日はインスタから画像を取得し、bx-sliderでカルーセル表示させるメモです。

■Instagram API

InstagramのAPIの利用方法や取得パラメータについては下記がとても参考になります。
Instagram APIでwebサービスを作りたい全ての人に向けて書きました

■bx-slider

スライダープラグインのダウンロードはこちら
jQuery Content Slider | Responsive jQuery Slider | bxSlider

全体的な流れ

  • configファイルの設置
  • instagram API からの取得PHPの設置
  • javascriptで取得データをhtmlに埋め込み
  • 埋め込みデータを元にスライダー化

おおまかには上記のような手順です。

configファイルの設置

<?php
define("USER_ID",       "");
define("CLIENT_ID",     "");
define("CLIENT_SECTET", "");
define("ACCESS_TOKEN",  "");
?>

上記のものにそれぞれユーザーデータなどを入れて、config.phpとして保存します。
httpでアクセス出来ない箇所に置きましょう。

instagram API からの取得PHPの設置

先ほど保存したconfig.phpをインクルード。
APIからデータを取得、整形し、JSONへ。

このファイルは、instagram.phpとして保存。

<?php
include_once('../../config.php');

$resArr = array();

if($_GET['mode']=='top') {
	// 時刻
	$resArr['time'] = urlencode(date('Y/m/d H:i:s'));

	// インスタ
	$CNT = 0;
	$photo_api_url = 'https://api.instagram.com/v1/users/self/media/recent?access_token=' . ACCESS_TOKEN . '&count=10'; // 10件取得
	$photo_datas   = json_decode(@file_get_contents($photo_api_url));

	foreach($photo_datas->data as $VAL) {

		$resArr['insta'][$CNT]['images'] = urlencode($VAL->images->low_resolution->url);
		$resArr['insta'][$CNT]['links']  = urlencode($VAL->link);
		$resArr['insta'][$CNT]['caption']  = mb_strimwidth( $VAL->caption->text, 0, 30, "...", "UTF-8" );
		$resArr['insta'][$CNT]['date']  = $VAL->created_time;
		$CNT++;
	}

	// JSON
	echo json_encode($resArr);
	exit;
}
?>

取得できるパラメータは以下の通り。
僕はキャプションのテキストを引っ張りましたが、このデータにはハッシュタグも含まれていますのでご注意下さい。

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 コメントを付けたユーザー情報。
comments->data[]->id コメントID。
filter 加工フィルターの種類。
created_time メディアの投稿日時。
link メディアページのURL。
likes{} 作品に付いたライクの情報。
likes->count ライク数。
likes->data[] ライクを付けたユーザーデータ(配列形式)。
images メディアの画像情報。メディアが動画の場合はサムネイルの情報となる。
images->low_resolution{} 306×306の画像情報。
images->thumbnail{} 150×150の画像情報。
images->standard_resolution{} 640×640の画像情報。
videos メディアの動画情報。メディアが写真の場合は存在しない。
videos->low_resolution{} 480×480の動画情報。
videos->standard_resolution{} 640×640の動画情報。
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{} 投稿者のユーザー情報。

 

javascriptで取得データをhtmlに埋め込み

今度は先ほどのinstagram.phpにアクセスし、データを取得、japascriptで指定要素にappendします。
この例では、htmlに空のdiv.instagramを設けておき、そこにデータを追加します。

$(function() {

	$.ajax({
		type: 'GET',
		url: 'instagram.php',
		data: { mode: 'top' },
		success: function(res) {
			dat = JSON.parse(res);
			for (var i=0 ; i<=9 ; i++){
				var md = new Date( Number( dat.insta[i].date+'000' ) );
				var y = md.getFullYear();
				var m = md.getMonth()+1;
				var d = md.getDate();
				$('.instagram').eq(0).append('<li><a href="' + decodeURIComponent(dat.insta[i].links) + '" target="_blank"><img src="' + decodeURIComponent(dat.insta[i].images) + '"><dl><dt>' + y + '-' + m + '-' + d +'</dt><dd>' + dat.insta[i].caption + '</dd></dl></a></li>');
		}
		},
		complete : function(res) {

			$('.instagram').bxSlider({
			  minSlides: 3,
			  maxSlides: 3,
				moveSlides: 1,
				slideWidth: 110,
				slideMargin: 0,
				pager: false,
				auto: true,
				infiniteLoop: false,
				hideControlOnEnd: true,
				preloadImages: 'all',
				swipeThreshold: 5,
				oneToOneTouch: false
			});
		} // end complete
	});

} // end ajax

});

スライダー化するのはデータ取得してhtmlに追加した後でないと、bx-sliderは正常に動かないのでajaxのコールバック、completeを使って処理後にスライダー化します。

以上です!意外に簡単なので使う場面あればどうぞ。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です