cakephp

年末に「spacegram」というサイトを作成しました。
(宇宙以外も表示されちゃうのでどうにかしないとですけど)

その際に、CakePHPでInstagramのAPIを使ってみたので使い方など。

CoreのHttpSocket使ってゴニョゴニョしても良かったんですけど、
既に公開されているライブラリがあったのでそれを使いました。

環境

      CakePHP2.0.4
      PHP5.3.8
      ライブラリ:Instaphp

APIを使用する準備

ディベロッパー用のページにアクセスして、メニューのManageから必要な手続きを行います。http://instagram.com/developer/
今回必要なのは「CLIENT ID」と「CLIENT SECRET」

Instaphpを配置する

github からInstaphpを取得しvendorsに配置します

https://github.com/sesser/Instaphp

今回はここに配置しました。
app/Vendor/Instaphp

Instaphpの設定ファイルを作る

以下のファイルをコピーして自分用の設定ファイルを作成します。
app/Vendor/Instaphp/config.sample.xml

app/Vendor/Instaphp/config.xml

InstagramのAPIで取得した「CLIENT ID」と「CLIENT SECRET」と「CALLBACK URL」を書きます。

<?xml version="1.0" encoding="utf-8" ?>
<Config>
    <Instagram>
        <Endpoint timeout="10">https://api.instagram.com</Endpoint>
        <Version>v1</Version>
        <ClientId>「CLIENT ID」</ClientId>
        <ClientSecret>「CLIENT SECRET」</ClientSecret>
        <Scope>comments+likes+relationships</Scope>
        <OAuthPath>/oauth/authorize/?client_id={ClientId}&amp;response_type=code&amp;redirect_uri={RedirectUri}</OAuthPath>
        <OAuthTokenPath>/oauth/access_token/</OAuthTokenPath>
    </Instagram>
    <Instaphp>
        <RedirectUri>「CALLBACK URL」</RedirectUri>
        <CACertBundlePath></CACertBundlePath>
        <Cache Engine="File" Enabled="true">
            <Settings>
                <Setting Path="tmp/cache"/>
                <Setting TTL="+2 Minutes"/>
            </Settings>
        </Cache>
    </Instaphp>
</Config>

Controller

Controllerはこんな感じ。この例ではPopularを取得しています。

App::import('Vendor', 'Instaphp/Instaphp');
class StagramController extends AppController {

    public function index() {
        $api = Instaphp\Instaphp::Instance();
        $response = $api->Media->Popular();
        if (empty($this->response->error)) {
            $mediaData = $response->data;
            $this->set(compact('mediaData'));
        } else {
            $error = $response->error;
            $this->set(compact('mediaData'));
        }
    }
}

View

Viewでは取得内容を表示するだけ。

<ul>
<?php foreach ($mediaData as $item): ?>
    <li>
        <?php printf('<img src="%s" alt="%s">', $item->images->thumbnail->url, $item->caption->text); ?>
    </li>
<?php endforeach; ?>
</ul>

その他

検索する場合はこんな感じ
パラメーターはInstagramのAPIで確認してください。

$response = $api->Media->Search(Array(    ));

タグで検索する場合はこんな感じ

$response = $api->Tags->Recent(検索したいタグ);

Likeを取得する場合はこんな感じ

$response = $api->Media->Likes(取得したい画像のID);

簡単ですね。CakePHPで使用されてるみたいなのですんなり出来ましたが、プラグインでもよかった気がしますね。
OAuth認証も出来るみたいですけど、今回は使っていません。

また、こちらのブログを運営されている@polidogさんがcomponentを公開されているのでそっちを使ってみるのもありかもです。

https://github.com/polidog/InstagramApiComponent