Instagramフィード取得

Pocket

Instagram APIを未申請の利用はSandboxモードのみです。
Sandboxモードは最新のフィード20枚のみ取得できます(2016年9月時点)。

目標

該当ユーザーの最新フィードを取得します。

最新フィード取得

フィード取得に必要な情報は下記2つです。

  • ユーザーID
  • アクセストークン

(ユーザーID ,アクセストークンを取得済みのとき)最新のフィードを取得するリクエストです。

https://api.instagram.com/v1/users/<user_id>/media/recent?access_token=<access_token>

ユーザーID取得

ユーザーIDはユーザー名から調べることができます(ユーザー名とユーザーIDは異なります。)
ユーザーIDは下記URLでユーザー名から検索できます。

» Find my Instagram User ID

アクセストークン取得

アクセストークンの取得に必要な情報は下記32つです。

  • CLIENT ID
  • REDIRECT URI

クライアントをInstagram APIのManage Clients > Register a New Clientで登録します。

REDIRECT URIはクライアントを登録するときに指定します。アクセストークンを取得するリクエストのredirect_uriパラメーターへここで設定した値を指定します。

CLIENT IDはクライアントを登録した際に自動で発行されます。

アクセストークンは下記リクエストで取得できます。

https://instagram.com/oauth/authorize/?client_id=&redirect_uri=&response_type=token

上記によるアクセストークン取得はimplicit Authenticationになります。
Instagram API管理画面のManage Clients > SecurityでDisable implicit OAuthのチェックを外してください。

REDIRECT URIへ返されるレスポンス例

http://www.example.com/#access_token=xxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

WordPressでフィードを取得するサンプル

<?php
/**
 * Instagra サムネイル表示
 *
 * @package    InfoTown
 * @subpackage SNS
 * @author     Hiroshi Sawai <info@info-town.jp>
 * @copyright  Hiroshi Sawai
 * @version    1.0.0
 * @since      1.0.0
 */
// themes/mytheme/includes/sns/instagram.php
class Instagram {
    // user情報
    private $user_name;
    private $user_id;
    private $access_token;
    private $api_uri;
    // cURL接続情報
    private $options;
    private $url;
    private $ch;
    private $count;

    function __construct( $params ) {
        $default                       = array(
            'request_type' => 0,
            'count'        => 6,
        );
        $params                        = array_merge( $default, $params );
        $this->options['request_type'] = 0;
        $this->ch                      = curl_init();
        $this->api_url                 = $params['api_url'] . $params['user_id'] . '/media/recent?access_token=' . $params['access_token'];
        $this->count                   = $params['count'];
        $this->uri                     = $this->api_url . '&count=' . $this->count;
    }

    public function get($type='json') {
        $json   = $this->fetch();
        $images = $this->format( $json );
        if ('json' === $type) {
            return $images;
        }
        if ('html' === $type) {
            $this->output($images);
        }

        return $images;
    }

    /**
     * Instagram APIで画像情報取得(JSON)
     *
     * @return mixed 取得したJSON
     */
    private function fetch() {
        curl_setopt( $this->ch, CURLOPT_URL, $this->uri );
        curl_setopt( $this->ch, CURLOPT_POST, $this->options['request_type'] );
        if ( ! empty( $options['post'] ) ) {
            curl_setopt( $this->ch, CURLOPT_POSTFIELDS, $options['post'] );
        }
        curl_setopt( $this->ch, CURLOPT_SSL_VERIFYPEER, false );
        curl_setopt( $this->ch, CURLOPT_RETURNTRANSFER, 1 );
        $json = curl_exec( $this->ch );
        curl_close( $this->ch );

        return $json;
    }

    /**
     * 画像情報をJSONから表示用配列に整形
     *
     * @param  string $json JSON形式の画像情報
     *
     * @return mixed 表示用に整形した画像情報配列
     */
    private function format( $json ) {
        // 画像情報(JSON)を配列へ
        $images = array();
        if ( ! empty( $json ) ) {
            foreach ( json_decode( $json )->data as $item ) {
                $src      = $item->images->standard_resolution->url;
                $thumb    = $item->images->thumbnail->url;
                $url      = $item->link;
                $images[] = array(
                    "src"   => htmlspecialchars( $src ),
                    "thumb" => htmlspecialchars( $thumb ),
                    "url"   => htmlspecialchars( $url ),
                );
            }
        }

        return $images;
    }

    /**
     * 画像出力
     */
    private function output( $images ) {
        if ( ! empty( $images ) ) {
            echo '<ul>';
            foreach ( $images as $image ) {
                echo '<li><a href="' . $image['url'] . '"><img src="' . $image['thumb'] . '"></a></li>';
            }
            echo '</ul>';
        }
    }
}

表示したいテンプレートへの記載です。

require_once( get_template_directory() . '/includes/sns/instagram.php' );

$params    = array(
    'user_name'    => 'example',
    'user_id'      => 'xxxxxxxxxxx',
    'access_token' => 'xxxxxxxxxxx',
    'api_url'      => 'https://api.instagram.com/v1/users/',
    'count'        => 6,
);
$instagram = new Instagram( $params );
$instagram->get('html');

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。