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
- Amazon Linux(EC2)と PHPSTORM で Xdebug を行う - 2018年9月26日
- やらないことの合意 - 2018年6月27日
- 卒園アルバムとプロジェクトマネジメント - 2018年3月30日
大まかな手順
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 <= 140); } <p style="background-color: lightgreen">正常にtweetしました! <br />- You successfully sent your tweet!<br /></p> <p> <br /></p> <p style="background-color: red"> おっと! あなたのtweetはTwitterが受け付けてくれなかったようです。考えられる原因: </p> <div style="background-color: red"><br /></div> <p> <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){ ?> <li style="background-color: ;" id="status_14505086646" class="hentry u-user->screen_name?> status"> <span class="thumb vcard author"> <a class="tweet-url profile-pic url" href="http://twitter.com/user->screen_name?>"> <img height="48" width="48" class="photo fn" alt="user->name ?>" src="user->profile_image_url ?>"/> </a> </span> <span class="status-body"> <span class="status-content"> <strong> <a href="http://twitter.com/user->screen_name?>" class="tweet-url screen-name" > user->screen_name?> </a> </strong> <span class="entry-content"> text?> </span> </span> <span class="meta entry-meta"> <a rel="bookmark" class="entry-date" href="http://twitter.com/user->screen_name?>/status/id?>"> <span class="published timestamp"> created_at?> </span> </a> <span> source?>から </span> </span> </span> </li> </ol> </div> </div> </div> <p><br /><br />セッションをクリアし再度OAuth認証します。<br /> Clear session&Access Token</p>
htmlも混ざって色合い的にちょっと見にくいかと思いますがaceessTokenを用いGETで取得したresponseの中身を表示させています。
以上でシンプルなTwitterクライアントの完成です。
今回はOAuthがメインのため実装した機能はtimeline表示とtweet更新だけですが他にもTwitter APIは様々な機能が実装できます。
Twitter API Wiki / FrontPage
作成したTwitterクライアントのファイルを置いておきます(css同梱)。MVC, オブジェクト指向なにそれな内容ですが何かの足しになれば私としても嬉しいです。
Comments are closed.