OAuth::Lite::ConsumerでTwitter. It's what's happening. OAuthを使ってみた。
what's OAuth
An open protocol to allow secure API authorization in a simple and standard method from desktop and web applications.
OAuthはオープンプロトコルであり、デスクトップ、WebアプリケーションなどにセキュアなAPI認可 (authorization) の標準的手段を提供します。
特徴
認証までの流れは、以下のブログを参照ください。(個人的には、とても分かりやすかったです。)
twitterでOAuthを使う方法(その1:認証まで): てっく☆ゆきろぐ
今回作ったもの
Twitter. It's what's happening. OAuthを使い、現在時刻をつぶやくサンプルアプリを作成しました。
構成は以下の通り。
プログラム
事前準備として、Twitterでのアプリケーション登録(consumer_key/consumer_secretの取得)が必要です。
- request.cgi
#!/usr/bin/perl use strict; use warnings; use utf8; use OAuth::Lite::Consumer; use URI; use CGI; my $q = CGI->new(); $q->charset('utf-8'); my $consumer = OAuth::Lite::Consumer->new( consumer_key => '事前に取得したconsumer_key', consumer_secret => '事前に取得したconsumer_secret', site => 'http://twitter.com/', request_token_path => 'http://twitter.com/oauth/request_token', access_token_path => 'http://twitter.com/oauth/access_token', authorize_path => 'http://twitter.com/oauth/authorize', callback_url => '事前に登録したCallback URL(callback.cgi)', ); my $request_token = $consumer->get_request_token(); my $uri = URI->new('http://twitter.com/oauth/authorize'); $uri->query( $consumer->gen_auth_query('GET', 'http://twitter.com', $request_token) ); print $q->redirect($uri->as_string); exit;
- callback.cgi
#!/usr/bin/perl use strict; use warnings; use utf8; use OAuth::Lite::Consumer; use URI; use CGI; use JSON; my $q = CGI->new(); $q->charset('utf-8'); my $consumer = OAuth::Lite::Consumer->new( consumer_key => '事前に取得したconsumer_key', consumer_secret => '事前に取得したconsumer_secret', site => 'http://twitter.com/', request_token_path => 'http://twitter.com/oauth/request_token', access_token_path => 'http://twitter.com/oauth/access_token', authorize_path => 'http://twitter.com/oauth/authorize', ); my $oauth_token = $q->param('oauth_token'); my $oauth_verifier = $q->param('oauth_verifier'); my $access_token = $consumer->get_access_token( token => $oauth_token, verifier => $oauth_verifier, ); my $res = $consumer->request( method => 'POST', url => q{http://twitter.com/statuses/update.json}, token => $access_token, params => { status => scalar localtime, token => $access_token, }, ); if ($res->is_success){ my $status = from_json($res->decoded_content || $res->content); print $q->redirect('http://twitter.com/' . $status->{user}->{screen_name} . '/status/' . $status->{id}); } else { print $q->redirect('http://twitter.com/'); } exit;