TwitterクライアントのOAuth認証(Zend_Oauth) – シンプルなTwitterクライアントの作成 –

Twitterは6月にBasic認証が廃止されます。代替えとしてOAuth認証が採用されました。今や何処も彼処もOAuthについての記事を見かけますが、Zend_Oauthを用いての実装例があまり無いようで…..。Zend Framework をシステムに採用しているLogoswareとしては***と言う事でここに簡単な実装例を書いておきます。

基本的にこちらのサイトを模倣し実装しました。http://bit.ly/a32VvB

【Writing A Simple Twitter Client – シンプルなTwitterクライアントの作成 -】

使用ライブラリ
Zend FrameworkのOAuthライブラリ
Zend Frameworkをダウンロードして下さい。古いVersionにはZend_Oauthが入っていないのでなるべく新しいVersionにして下さい。(ここではZendFramework-1.10.1-minimalを使用)

使用ファイル
callback.php, clear.php, common.php, index.php, tweet.php , twitter.css

DocumentRoot
css
-twitter.css
-callback.php
-clear.php
-common.php
-index.php
-tweet.php

大まかな手順
1.Twitterにアプリケーション登録の申請。consumerKey, consumerSecretを発行する。
2.OAuthパラメータ値をZend_Oauth_Consumerに設定
3.requestTokenを取得しOAuth認証
4.accessTokenを取得する
5.tweetをPOSTする
6.timelineGETで取得する

Twitterにアプリケーション登録の申請
割愛させて頂きます。こちらのサイトが参考になるかと思います。http://bit.ly/a00E2Q

OAuthパラメータ値をZend_Oauth_Consumerに設定
早速Zend_Oauthの設定ファイルを作成しましょう。
まずはcommon.phpを作成してください。

 '1.0', // there is no other version...
  'requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER,
  'signatureMethod' => 'HMAC-SHA1',
  'callbackUrl' => "http://{$host}/twitter/callback.php",
  'requestTokenUrl' => 'http://twitter.com/oauth/request_token',
  'authorizeUrl' => 'http://twitter.com/oauth/authorize',
  'accessTokenUrl' => 'http://twitter.com/oauth/access_token',
  'consumerKey' => 'Twitterアプリ登録時に発行されるランダムな文字列',
  'consumerSecret' => 'Twitterアプリ登録時に発行されるランダムな文字列'
);
session_start();
$consumer = new Zend_Oauth_Consumer($configuration);

今回はphp以外のデータストレージを使用しないのでsessionをフル活用します。
ここでsession_start()関数を叩いておきます。

それぞれ

パラメータ 説明
version OAuthのversionを指定。指定しないことも可能
requestScheme Authorizationヘッダ以外にもPOSTではRequest Body,GETではquery_stringを指定可
signatureMethod 署名方式:PLAINTEXTまたはHMAC-SHA1 を指定
callbackUrl 認証後に遷移する戻り先URLを指定。Twitterにアプリ登録時に設定したURL(80/443番ポート)を設定。戻り先URLがない場合は’oob’を指定可能
requestTokenUrl requestToken取得時に利用するURL
authorizeUrl 認証画面URL
accessTokenUrl accessToken取得時に利用するURL
consumerKey Twitterアプリ登録時に発行されるランダムな文字列
consumerSecret Twitterアプリ登録時に発行されるランダムな文字列

requetTokenを取得しOAuth認証
index.php

getRequestToken();
  $_SESSION['TWITTER_REQUEST_TOKEN'] = serialize($token);

  $consumer->redirect();
}
/*
以下 html部分
......
*/

認証していない場合はクライアントからTwitterにOAuthでAPIをたたきrequestTokenを取得。
Twitterに認証をお願いしています。

accessTokenを取得する
callback.php

getAccessToken($_GET,
                                       unserialize($_SESSION['TWITTER_REQUEST_TOKEN']));
  }catch (Exception $ex){
    $ex->getMessage();
  }
  $_SESSION['TWITTER_ACCESS_TOKEN'] = serialize($token);
  $_SESSION['TWITTER_REQUEST_TOKEN'] = null;

  header('Location: ' . URL_ROOT . '/index.php');
}
else {
  exit('無効なコールバック要求されました。おっと。申し訳ありません。');
}

認証を終えるとTwitterが上記common.phpで指定したcallbackUrlを呼び出してくれます。
ここではaccessTokenをsessionに入れておきます。

TweetをPOSTする
tweet.php

getHttpClient($configuration);
  $client->setUri('http://twitter.com/statuses/update.json');
  $client->setMethod(Zend_Http_Client::POST);
  $client->setParameterPost('status', $_POST['status']);
  $response = $client->request();

  $data = json_decode($response->getBody());
  $result = $response->getBody();
  if (isset($data->text)) {
    $result = 'true';
  }

  header('Location: ' . URL_ROOT . '?result=' . $result);
}
else {
  exit('無効なTweetが要求されました。');
}

認証で取得したaccessTokenを用いtweetをTwetterにpostします。
responseの形式をjsonに指定していますが他にxmlを指定することができます。ここではresponseは使用しません。
詳しくはTwitter API Wikiを参照
Twitter REST API Method: statuses/update

以上でOAuthを用い認証そしてPOSTまでの手順になります。ホントにシンプルです。
以下はtwieetをPOST後timelineを表示させます。

timelineGETで取得する
Twitterからのレスポンスはjson or xmlの形で返されます。
以下はjson形式のresponseをphp用にdecodeした形です。

stdClass Object
(
  [in_reply_to_user_id] =>
  [contributors] =>
  [source] => client
  [created_at] => Sat May 22 21:33:34 +0000 2010
  [in_reply_to_screen_name] =>
  [place] =>
  [favorited] =>
  [truncated] =>
  [in_reply_to_status_id] =>
  [coordinates] =>
  [user] => stdClass Object
  (
    [favourites_count] => number
    [description] =>
    [lang] => ja
    [profile_background_color] => EDECE9
    [profile_image_url] => http://a1.twimg.com/profile_images/912973500/TwitterID_normal.jpg
    [time_zone] => Tokyo
    [profile_sidebar_fill_color] => a7d6ac
    [statuses_count] => number
    [screen_name] => logosware
    [following] =>
    [created_at] => Sat May 30 03:36:56 +0000 2009
    [followers_count] => number
    [contributors_enabled] =>
    [profile_background_image_url] => http://s.twimg.com/a/TwitterID/images/themes/theme1/bg.png
    [profile_text_color] => 052115
    [friends_count] => number
    [profile_background_tile] =>
    [protected] =>
    [url] =>
    [geo_enabled] =>
    [name] => logosware
    [profile_sidebar_border_color] => D3D2CF
    [profile_link_color] => 088253
    [location] => つくば
    [id] => 43473241
    [verified] =>
    [notifications] =>
    [utc_offset] => 32400
  )
  [geo] =>
  [id] => 145175******
  [text] => つくばってイノベーションだよね?
)

response中身は極々単純で分かりやすいです。
それではタイムライン表示させてみます。
index.phpの続き

getHttpClient($configuration);
  $client->setUri('http://twitter.com/statuses/home_timeline.json');
  $client->setMethod(Zend_Http_Client::GET);
  $response = $client->request();

  $_data = json_decode($response->getBody());
  if (count($_data)>0) {
    $_SESSION['TWITTER_RESULT'] = $_data;
  }
}

echo '';
?>

aceessTokenを用いhome timelineをGETで取得します。
responseの形式をjsonに指定していますが他にxml, atomを指定することができます。
詳しくはTwitter API Wikiを参照
Twitter REST API Method: statuses home_timeline




  <title>Logosware twitter lite client</title>
  
    function imposemax(Object)
    {
      return (Object.value.length &lt;= 140);
    }
  
  




    <p style="background-color: lightgreen">正常にtweetしました!
      <br />- You successfully sent your tweet!<br /></p>
    <p>&nbsp;<br /></p>

    <p style="background-color: red">
      おっと! あなたのtweetはTwitterが受け付けてくれなかったようです。考えられる原因:
    </p>
    <div style="background-color: red"><br /></div>
    <p>&nbsp;<br /></p>

  <p>簡易Twitterクライアント <br />
    - All that work on Zend_Oauth, and all you do is send Tweets with it?
    <br /><br />
  </p>
  <form action="tweet.php" method="post">
    <p>TweetをPOSTします。140文字でなにを言いたいですか? <br /></p>
    <p>
      <textarea name="status" rows="4" cols="70%"></textarea>
      <br />
    </p>
  </form>

ここまでが投稿フォームになります。ゴニョゴニョやっていますが好きに実装したらいいと思います。


  <div class="wrapper">
  <div class="section">
  <div>

    <h1 id="heading">result</h1>



    <ol class="statuses">

  $data){
  ?&gt;
      &lt;li style=&quot;background-color: ;" id="status_14505086646"
        class="hentry u-user-&gt;screen_name?&gt; status"&gt;
        <span class="thumb vcard author">
          &lt;a class=&quot;tweet-url profile-pic url&quot;
            href=&quot;http://twitter.com/user-&gt;screen_name?&gt;"&gt;
            &lt;img height=&quot;48&quot; width=&quot;48&quot; class=&quot;photo fn&quot; alt=&quot;user-&gt;name ?&gt;"
              src="user-&gt;profile_image_url ?&gt;"/&gt;
          </a>
        </span>
        <span class="status-body">
          <span class="status-content">
            <strong>
              &lt;a href=&quot;http://twitter.com/user-&gt;screen_name?&gt;"
                class="tweet-url screen-name" &gt;
                user-&gt;screen_name?&gt;
              </a>
            </strong>
            <span class="entry-content">
              text?&gt;
            </span>
          </span>
          <span class="meta entry-meta">
            &lt;a rel=&quot;bookmark&quot; class=&quot;entry-date&quot;
              href=&quot;http://twitter.com/user-&gt;screen_name?&gt;/status/id?&gt;"&gt;
              <span class="published timestamp">
                  created_at?&gt;
              </span>
            </a>
            <span>
              source?&gt;から
            </span>
          </span>
        </span>
      </li>

    </ol>


  </div>
  </div>
  </div>

  <p><br /><br />セッションをクリアし再度OAuth認証します。<br />
  Clear session&amp;Access Token</p>


htmlも混ざって色合い的にちょっと見にくいかと思いますがaceessTokenを用いGETで取得したresponseの中身を表示させています。
以上でシンプルなTwitterクライアントの完成です。
今回はOAuthがメインのため実装した機能はtimeline表示とtweet更新だけですが他にもTwitter APIは様々な機能が実装できます。
Twitter API Wiki / FrontPage

作成したTwitterクライアントのファイルを置いておきます(css同梱)。MVC, オブジェクト指向なにそれな内容ですが何かの足しになれば私としても嬉しいです。

The following two tabs change content below.

ロゴスウェア

ロゴスウェア株式会社は、インターネットや情報技術を使って学習に革新的進化をもたらす製品を開発することを目標に、2001年7月に設立されたテクノロジー系ベンチャー企業です。

Comments are closed.