Twitter oauth認証をphp、PECL oauthを使って通す方法

  • 概要

TwitterAPIにphp5 + PECL oauth + curlを使ってoauth認証を通し書き込みをする
一連の流れです

この流れは「ブラウザアプリケーション」での流れになります


  • 準備

http://dev.twitter.com/apps より「新しいアプリケーションを登録する」をクリック

アプリケーション名:    (アプリの名前を入れましょう。これがTweetの下に表示されるものになります)
アプリケーションの説明: (アプリの説明を入れましょう)
アプリケーションのウェブサイトURL (これがTweetの下に表示される名前のリンクものになります)
所属会社/団体 (特に入力の必要はなさそうです)
アプリケーションの種類 (ブラウザアプリケーションを選択してください)
コールバックURL: (下記のコールバックプログラムを置く場所のURLです)
Default Access type: ( Read & Write を選んでください)
アプリケーションのアイコン: (見栄えのいいのを設定しておくのがいいのではないか・と・・BOTであれば特に必要ないかな)


Consumer key と Consumer secret が発行されるので、この値を各PGに設定する


  • 処理フロー

login.phpにアクセスする。
 このタイミングでrequest_tokenが発行されるので、request_token-oauth_tokenは引数で持ちまわってくれるが
 request_token-oauth_token_secretは保持しないといけないので、cookieなどに保存しておく
  *request_tokenはワンタイムセッションな情報。一連の処理が済んでしまえば必要ないし、再利用も出来ない。
アクセスすると、認証URLが発行されるので
そのURLにアクセスすると、ブラウザでログインしていない状態ならログインを求められ、
引き続き、アプリケーションを許可するかを聞いてくるので「許可をクリックする」



Twitter側で認証処理が動き出し、最後にcallback.phpのページに自動的に移る。
このタイミングでaccess_tokenが発行される。
これがbasic認証に当たるユーザのID,PASSの変わりに成るもの。
このaccess_tokenの各値をDBに保存などしておき、
そのユーザのつぶやきとして処理したいときに使う


tweet.phpにアクセスする。
発行されたaccess_tokenを用いてTweet(update.xml)が行われる。


  • 注意すること

キーやシークレットキーが3つあるので、混乱しがち・・
気をつけないと、ハマリマス


  • プログラム
 <?php
 
 $req_token_url = 'http://twitter.com/oauth/request_token';
 
 $consumer_key = 'アプリケーションを登録したときに発行されたConsumer key';
 $consumer_secret = 'アプリケーションを登録したときに発行されたConsumer secret';
 
 $oauth = new OAuth($consumer_key,$consumer_secret,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);
 $request_token = $oauth->getRequestToken($req_token_url);
 setcookie('request_token_oauth_token_secret', $request_token['oauth_token_secret']);
 
 echo  'http://twitter.com/oauth/authorize?oauth_token='.$request_token['oauth_token'];
 <?php
 
 $consumer_key = 'アプリケーションを登録したときに発行されたConsumer key';
 $consumer_secret = 'アプリケーションを登録したときに発行されたConsumer secret';
 
 $oauth = new OAuth($consumer_key,$consumer_secret,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);
 
 $oauth->setToken($_GET['oauth_token'],$_COOKIE['request_token_oauth_token_secret']);
 $access_token = $oauth->getAccessToken('http://api.twitter.com/oauth/access_token');
 
 
 echo "access_token_oauth_token        :".$access_token["oauth_token"]       ."<br>\n";
 echo "access_token_oauth_token_secret :".$access_token["oauth_token_secret"]."<br>\n";
 echo "access_token_user_id            :".$access_token["user_id"]           ."<br>\n";
 echo "access_token_screen_name        :".$access_token["screen_name"]       ."<br>\n";
 <?php
 
 $consumer_key = 'アプリケーションを登録したときに発行されたConsumer key';
 $consumer_secret = 'アプリケーションを登録したときに発行されたConsumer secret';
 
 $oauth = new OAuth($consumer_key,$consumer_secret,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);
 
 $access_token["oauth_token"] ="callback.phpで発行されたaccess_token_oauth_token";
 $access_token["oauth_token_secret"] ="callback.phpで発行されたaccess_token_oauth_token_secret";
 
 
 //つぶやきたい文章 ただし、同じ文章を連続投稿するとエラーになるので注意!(403になる様子)
 $params = array( 'status' => 'mou ittyo-' );
 $oauth->setToken($access_token["oauth_token"],$access_token["oauth_token_secret"]);
 $oauth->fetch('http://api.twitter.com/1/statuses/update.xml', $params, OAUTH_HTTP_METHOD_POST );
 var_dump( json_decode( $oauth->getLastResponse() ) );

setToken($access_token["oauth_token"],$access_token["oauth_token_secret"]);
//$oauth->fetch( $twurl , $params, OAUTH_HTTP_METHOD_POST );
//echo $oauth->getLastResponse() ;


//アンフォローする
//$userid="5117831"; //< http://twitter.com/imaiworks のID
//$twurl="http://api.twitter.com/1/friendships/destroy/".$userid.".xml";
//$oauth->setToken($access_token["oauth_token"],$access_token["oauth_token_secret"]);
//$oauth->fetch( $twurl , $params, OAUTH_HTTP_METHOD_POST );
//echo $oauth->getLastResponse() ;


//つぶやく ただし、同じ文章を連続投稿するとエラーになるので注意!(403になる様子)
$params = array( 'status' => 'つぶやきます' );
$oauth->setToken($access_token["oauth_token"],$access_token["oauth_token_secret"]);
$oauth->fetch('http://api.twitter.com/1/statuses/update.xml', $params, OAUTH_HTTP_METHOD_POST );
var_dump( json_decode( $oauth->getLastResponse() ) );


2010/5/10 tweet.phpのconsumer_key、consumer_secret の説明に記述ミスがあったので修正しました