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を使って処理後にスライダー化します。
以上です!意外に簡単なので使う場面あればどうぞ。