いよいよAPIを叩いてみます。
# ■なにかつぶやいてみる例
# このソースはかなり簡略化してますので、自分のソースに合った改変は必須かと思います。
# statuses/updateを使用して、結果をXMLで受け取る例です。
use LWP::UserAgent;
use Encode;
use Net::OAuth;
$Net::OAuth::PROTOCOL_VERSION = Net::OAuth::PROTOCOL_VERSION_1_0A;
# 前回取得したアクセストークンとシークレット
my $access_token = 'アクセストークン';
my $access_secret = 'トークンシークレット';
# 各APIメソッド毎にURLとリクエストメソッドが異なるので注意
my $API_Method_url = 'https://twitter.com/statuses/update.xml';
my $request_method = 'POST';
# なにかつぶやく
my $message = 'PENTAX K-7は良いカメラだぜぃ';
# OAuthリクエスト
my $request = Net::OAuth->request("protected resource")->new(
consumer_key => 'Twitterから取得したキー',
consumer_secret => 'Twitterから取得しシークレット',
request_url => $API_Method_url,
request_method => $request_method,
signature_method => 'HMAC-SHA1',
timestamp => time,
nonce => 'ランダム文字列', # 毎回変更
token => $access_token,
token_secret => $access_secret,
extra_params => { status => decode_utf8($message) },
);
# extra_paramsに各APIメソッドのパラメータ値のハッシュをセットする(今回は"status")
# decode_utf8についてはNet::OAuthのドキュメント(下記URL)を見てください。
# http://search.cpan.org/~kgrennan/Net-OAuth-0.19/lib/Net/OAuth.pm#I18N
$request->sign;
my $ua = LWP::UserAgent->new;
my $http_hdr = HTTP::Headers->new('User-Agent' => $ClientUA_name);
my $http_req = HTTP::Request->new($request_method, $API_Method_url, $http_hdr, $request->to_post_body);
my $http_res = $ua->request($http_req);
# 結果のXML
my $res_xml = $http_res->content;
これでつぶやくはず。。。
あ、ソースは全部utf8で書いてます。
あ、エラー処理とか全力で省いてます。
あ、今回色々試したい事もあったので、Net::OAuthにしましたですが、Net::Twitterとか使ったほうが、以外に簡単かもしれませんよ?w
2010/02/06追記: Syntax-Hilighter入れてみたw
さて、先の記事でリクエストトークンを取得しましたが、このままでは使えない訳で、このトークン値を使って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."\n\n";
リダイレクトすると、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
まず、Twitterのアプリ登録ページで各種設定を行い、Consumer KeyとConsumer Secretを取得します。とりあえず後でも変更は可能なので、アプリ名とか決まって無くても、間に合わせで設定しても大丈夫。
ただ、Application Typeの設定によって、承認済リクエストトークンとヴェリファイアの取得方法が変わって来るので、ココはきちんと設定しておきましょう。今回の例はブラウザベースで話を進めます。
で、コンシューマキーとシークレットを取得したら、その各値を使ってRequestTokenを取得します。
# ■リクエストトークンの取得
# このソースは簡略化してますので、自分のソースに合った改変は必須かと思います。
use LWP::UserAgent;
use Net::OAuth;
$Net::OAuth::PROTOCOL_VERSION = Net::OAuth::PROTOCOL_VERSION_1_0A;
my $request_token_url = 'http://twitter.com/oauth/request_token';
my $request_method = 'GET';
my $request = Net::OAuth->request("request token")->new(
consumer_key => 'Twitterから取得したキー',
consumer_secret => 'Twitterから取得しシークレット',
request_url => $request_token_url,
request_method => $request_method,
signature_method => 'HMAC-SHA1',
timestamp => time,
nonce => 'ランダム文字列', #要毎回変更
callback => 'http://yoursite', #アプリ登録時のコールバックアドレス
);
# nonceとtimestampについてはhttp://oauth.net/core/1.0/#nonce を参照
$request->sign;
my $ua = LWP::UserAgent->new;
my $http_hdr = HTTP::Headers->new('Authorization' => $request->to_authorization_header);
my $http_req = HTTP::Request->new($request_method, $request_token_url, $http_hdr);
my $http_res = $ua->request($http_req);
my $RequestTokenStr = $http_res->content;
以上w
$RequestTokenStrには
「oauth_token=[未承認RequestToken値]&oauth_token_secret=[ReuestTokenSecret値]&oauth_callback_confirmed=true」な感じで値が返りますので、Net::OAuth->responseや、その他お好みの方法で各値に分解します。
2010/02/06追記: Syntax-Hilighter入れてみたw
TwitterのOAuthについて、大まかな流れとしては、
①Twitterでアプリケーション登録を行う
②①で取得したコンシューマキーとシークレットを使って、未承認リクエストトークンとシークレットを取得
③未承認リクエストトークンを使ってTwitterにリダイレクト
④アプリケーションの承認(ユーザ側)
⑤コールバック用スクリプトで、承認済みリクエストトークンとベリファイアを受け取る
⑥リクエストトークンとベリファイアを使ってアクセストークンとシークレットを取得する
⑦アクセストークンとシークレットでAPIを叩く
ざっとこんな感じ。。。w
今の所アクセストークンの有効期限は無いみたいなので、一度取得したらそのまま使い続けられるようです。
使ったOAuthの為のモジュールはNet::OAuthで、OAuthのヘッダやPOST値を生成してLWP::UserAgentでGET/POSTします。
# URLエンコード $str =~ s/([^\w ])/'%'. unpack( 'H2', $1 )/eg; $str =~ tr/ /+/; # URLデコード $str =~ tr/+/ /; $str =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack( 'H2', $1 )/eg; # URLエンコード use URI::Escape; $str = uri_escape( $str ); # URLデコード use URI::Escape; $str = uri_unescape( $str );
# 昔はこんな風にselectで代用してた select(undef, undef, undef, 0.5); # 500ms(0.5秒)のsleep # Time::HiResが使えるなら、usleepを使いませう # usleepは1秒以下のsleepが可能 # 引数はμ秒で指定、戻り値は実際にsleepしたμ秒 use Time::HiRes qw( usleep ); $micsec = usleep( 500000 ); # 500ms(0.5秒)のsleep $micsec = usleep( 1000 ); # 1ms(0.001秒)のsleep $micsec = usleep( 10 ); # 10μs(0.00001秒)のsleep # CPAN - Time::HiRes - http://search.cpan.org/dist/Time-HiRes/ #
Posting tweet...
Powered by Twitter Tools
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|---|---|---|---|---|---|---|
| « 4月 | ||||||
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 | 31 | ||
RSS 2.0
atom