CatalystとOAuth::LiteでNet::Twitter::Liteしてみるテスト。
ちなみになんで,perlかというと。。。。oauthするのになんとなく一番楽そうな気がしたから!(・д・`)
事前準備としてはhttp://dev.twitetr.com/appsでアプリケーションを登録して,コンシューマキーとコンシューマシークレットキーを取得する。
登録する際に,コールバックURLを決定(今回はhttp://yoursite.com/auth_callbackとした)して事前に「ブラウザアプリケーション」としておく。
ちなみに自分としてアクセスするだけならば,My AccessTokenからoauth_tokenとoauth_token_secretが取得できるので,コールバックは利用しなくてもおk。不特定多数のユーザに利用してもらう場合は,コールバックに渡ってくるので,あらかじめ受け取り場所として設定しておく必要がある。
Viewはroot.ttのみ,Modelはなし。ほぼControllerだけでやってます。Const::TOKENSに取得したconsumer keyとcumsumer secretがはいってます。
SampleApp/lib/SampleApp/Controller/Root.pmの修正。
sub index : Path :Args(0) {
my ( $self, $c ) = @_;
my $consumer = OAuth::Lite::Consumer->new(SampleApp::Const::TOKENS);
my $request_token = $consumer->get_request_token();
my $uri = URI->new($consumer->{authorize_path});
$uri->query($consumer->gen_auth_query("GET",$consumer->{site},$request_token));
$c->stash->{authquery} = $uri->as_string;
$c->stash->{template} = 'root.tt';
}
AuthCallback.pmの作成
tanu@owl:~/SampleApp$ script/sampleapp_create.pl controller AuthCallback exists "/home/tanu/SampleApp/script/../lib/SampleApp/Controller" exists "/home/tanu/SampleApp/script/../t" created "/home/tanu/SampleApp/script/../lib/SampleApp/Controller/AuthCallback.pm" created "/home/tanu/SampleApp/script/../t/controller_AuthCallback.t"
AuthCallback.pmの修正
渡ってきたTokenをこの例ではセッションに渡してるけど,実際はDBに入れたほうがいいかもしれない。
*OAuth::Lite::Util::encode_param = sub {
my $param = shift;
URI::Escape::uri_escape_utf8($param, '^\w.~-');
};
sub index :Regex('^auth_callback') :Args(0) {
my ( $self, $c ) = @_;
my $consumer = OAuth::Lite::Consumer->new(SampleApp::Const::TOKENS);
my $access_token = $consumer->get_access_token(
token => $c->request->params->{oauth_token},
verifier => $c->request->params->{oauth_verifier}
);
my $twitter = Net::Twitter::Lite->new(SampleApp::Const::TOKENS);
$twitter->access_token($access_token->{token});
$twitter->access_token_secret($access_token->{secret});
$c->stash->{template}='root.tt';
$c->stash->{friends}=$twitter->friends();
$c->stash->{timeline}=$twitter->user_timeline();
$c->session->{token}=$access_token->{token};
$c->session->{secret}=$access_token->{secret};
$c->session->{name}=$user->{name};
}
Tweet.pmも作成。
sub index :Regex('^tweet') :Args(0) {
my ( $self, $c ) = @_;
$c->stash->{template} = 'root.tt';
$c->stash->{token} = $c->request->params->{token};
$c->stash->{secret} = $c->request->params->{secret};
my $tweet = $c->request->params->{tweet};
$c->stash->{tweet} = $tweet;
my $twitter = Net::Twitter::Lite->new(SampleApp::Const::TOKENS);
$twitter->access_token($c->session->{token});
$twitter->access_token_secret($c->session->{secret});
$c->stash->{timeline} = $twitter->user_timeline();
$twitter->update({'status'=>$tweet});
}
root.tt
<html> <body> [% IF c.session.token == '' %] <a href='[% c.stash.authquery %]'>twitter認証</a> [% ELSE %] <form id='tweetform' action='tweet' method='post'> <textarea cols="40" rows="2" id='tweet' name='tweet'></textarea> <input type='submit' /> </form> <p>last:[% c.stash.tweet %]</p> [%FOREACH tweet=c.stash.timeline %] <p>[% tweet.text %]</p> [%END%] [% END %] </body> </html>
これでとりあえずつぶやけた。
作ってみておもったんだけど,ユーザ名とかパスワードがほんとに一切出てこない。すげー。なんか違和感感じてしまうのはそういうアプリを作りなれてないからなんだろうな。。。