Category Archives: Cakephp

みなさんこんにちはこんばんは。イッシーです:.゚٩(・ิᴗ・ิ๑)۶:.。+゚

androidのトピックになる予定ですがCakeになりました。さて、日本人はtwitterが大好きですね。そんなご時世なのでtwitterと連携したアプリケーションの開発なんてお話もいっぱいあります。では早速実装しましょう。

【ステップ1】

車輪の再発明は面倒なので既存のモジュールをダウンロードして以下のディレクトリ構成となるように配置します。

./vendors/OAuth/OAuth.php
./vendors/OAuth/oauth_consumer.php
./vendors/OAuth/LICENSE.txt

【ステップ2】

コントローラクラスにインポートします。

App::import('Vendor', 'oauth', array('file' => 'OAuth'.DS.'oauth_consumer.php'));

require_once的な感じです。

【ステップ3】

twitterで登録して取得した情報を元にして以下のメソッドをコントローラに準備します。

class HogeController extends AppController {
    /**
     * _createConsumer
     */

    protected function _createConsumer()
    {
        return new OAuth_Consumer(
            'アプリケーションのコンシューマーキー',
            'アプリケーションのコンシューマーシークレット'
        );
    }
}

【ステップ4】

いよいよtwitterの認証を使います。まず、HogeControllerにリダイレクト用のtwitterアクションを作ります。未認証のリクエストトークンをURLにつけてユーザをリダイレクトさせる部分です。

    /**
     * twitter
     * リダイレクトします
     */

    public function twitter()
    {
        $requestToken = $this->_createConsumer()->getRequestToken(
            'https://api.twitter.com/oauth/request_token',// エンドポイントとも言うんでしょうかね
            'http://hogehoge.plusr.co.jp/users/register'// 自分のサイトのユーザ登録用のURL...(a)
        );
        $this->Session->write('request_token', $requestToken);// セッションにリクエストトークンを保存
        $this->redirect('https://api.twitter.com/oauth/authorize?oauth_token=' . $requestToken->key);// twitter側にリダイレクト
    }

【ステップ5】

twitterの(未認証のリクエストトークンをクエリにつけて訪問した)画面でユーザがOKすると(リクエストトークンが認証され)自分のサイト(a)に戻ってきます。自前サーバで(コンシューマ)承認済みのリクエストトークン、コンシューマキー、コンシューマシークレットで生成したサイン値などをパラメータとして送信し、アクセス・トークンの発行をtwitter(https://api.twitter.com/oauth/access_token)に要求します。このトークンを保存してあげればいいわけです。

    /**
     * register
     * 登録
     */

    public function register()
    {
        $consumer = $this->_createConsumer();
        $token    = $consumer->getAccessToken(
            'https://api.twitter.com/oauth/access_token',
            $this->Session->read('request_token')
        );// セッションに保存してあるリクエストトークンをセットしてアクセストークンを要求
        if($token != ''){
            $twitter = $consumer->get(
                $token->key,
                $token->secret,
                'http://twitter.com/account/verify_credentials.json',
                array()
            );// twitter上におけるユーザの情報を取得(optional)
            $twitter = json_decode($twitter, true);
           
            // 登録 or 更新 (内部でどちらか判定して保存)...(b)
            $registeredId = $this->User->register(array(
                'twitter_id'   => $twitter['id_str'],
                'twitter_name' => $twitter['screen_name'],
                'token_key'    => $token->key,// ユーザのトークン
                'token_secret' => $token->secret,// ユーザのシークレット
            ));
           
            $user['User']["token_key"]    = $token->key;
            $user['User']["token_secret"] = $token->secret;
            $this->Auth->login($user);
        }
    }

上述のようにすることでログインができるようになります。

【ステップ6】

あとは上述の(b)でDBに保存したキーとシークレットを元にしてtwitterのAPIを利用します。

情報をポストする場合

以下のようにすることでユーザの代わりに投稿ができます。

$consumer = $this->_createConsumer();
$consumer->post(
    $token_key,// DBに保存したキー
    $token_secret,// DBに保存したシークレット
    'http://api.twitter.com/1/statuses/update.json',
    array(
        'status' => $content
    )
);

情報を取得する場合

以下のようにすることでユーザがフォローしている人を取得できます。

$consumer = $this->_createConsumer();
$friends = $consumer->get(
    $token_key,// DBに保存したキー
    $token_secret,// DBに保存したシークレット
    "http://api.twitter.com/1/statuses/friends.json?id={$id}"// ユーザのtwitter id
);

いかがでしょうか?既存のプラグインを使うことですごく簡単に実装できました。リファレンスを見るとRESTful APIのURLが載ってますので参考にしてみてください。