さて、先の記事でリクエストトークンを取得しましたが、このままでは使えない訳で、このトークン値を使ってTwitterにリダイレクトしてユーザの承認を行います。
この辺の処理はブラウザ/デスクトップベースのクライアントかによっても違ってきますし、Botのようなクライアントなら自分で承認すればOKですが、他のユーザが使う場合なら各ユーザに承認してもらう必要もあり、各トークンの管理等も含めて複雑になって行きます。
今回はbotがつぶやく仕様、これです。
botがつぶやくには、つぶやくTwitterアカウントでログインして、アプリの承認を自分で行います。
# 前回のソースから直接承認画面にリダイレクトする場合。 my $authorize_url = 'http://twitter.com/oauth/authorize'; my $request_token = '[取得したリクエストトークン]'; print "Location: ".$authorize_url."?oauth_token=".$request_token." ";
リダイレクトすると、Twitteのアプリ承認画面が開きます。
この画面で許可を選択すれば、コールバックURLへリダイレクトされます。
※デスクトップクライアントの場合は、ここで暗証番号らしき数字が表示されるみたいです。それは、またの機会に確認してみます。
コールバックURLにリダイレクトされると同時に、承認済リクエストトークンとヴェリファイア値がPOSTされるので、適当な方法でこのPOST値を拾います。簡単な方法だとCGIモジュールとか。。。
で、今度はこの各値を使って、アクセストークンとシークレットを取得します。
# アクセストークンとシークレットの取得 --------------------
# このソースは簡略化してますので、自分のソースに合った改変は必須かと思います。
use CGI;
use LWP::UserAgent;
use Net::OAuth;
$Net::OAuth::PROTOCOL_VERSION = Net::OAuth::PROTOCOL_VERSION_1_0A;
my $q = CGI->new;
my $access_token = $q->param('oauth_token'); #承認済みトークン
my $access_verifier = $q->param('oauth_verifier'); #ヴェリファイア
my $access_token_url = 'http://twitter.com/oauth/access_token';
my $request_method = 'POST'; #アクセストークン取得はpostなので注意
my $request = Net::OAuth->request("access token")->new(
consumer_key => 'Twitterから取得したキー',
consumer_secret => 'Twitterから取得しシークレット',
request_url => $access_token_url,
request_method => $request_method,
signature_method => 'HMAC-SHA1',
timestamp => time,
nonce => 'ランダム文字列', #毎回変更
callback => '',
token => $access_token,
verifier => $access_verifier,
token_secret => '',
);
my $ua = LWP::UserAgent->new;
my $http_hdr = HTTP::Headers->new('User-Agent' => $ClientUA_name);
my $http_req = HTTP::Request->new($request_method, $access_token_url, $http_hdr, $request->to_post_body);
my $http_res = $ua->request($http_req);
my $AccessTokenStr = $http_res->content;
こんな感じです。$AccessTokenStrは前回同様に分解して下さい。
2010/02/06追記: Syntax-Hilighter入れてみたw