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