twitterでoauth認証
ネットに情報そこそこあると思うけど、わかりにくいので自分用メモ
- アプリをtwitterに登録する必要がある(タイプはブラウザかクライアントのどっちか)
- 登録するとConsumer keyとConsumer secretが発行される
- このキーを使って、今度はアクセストークンを取得するコード実行
- URL表示されるのでブラウザにコピペするとPIN番号が表示される
- トークン取得コードでPINを入れると、トークンが得られる
- 全部そろうと、oauth認証が可能になる。
うーん。面倒くさい。この仕組は2-legs oauthらしい。
雅叙園でのOpenSocialのセミナーで、mixiアプリは2-legs oauthだから
secretキーが流出したら困るので、
DeNAは、3-legs oauthとか説明されていた。
あと、twitterでは、公式RTはoauth認証しないと結果が得られないっぽい?(将来BASIC認証は廃止の予定)
なんとか認証できるようになったので、公式RTにも対応出来そうです。
ネットで拾ってきたトークン取得コード(トークンは一度取得すれば変わらないらしいので)
#!/user/bin/perl use strict; use warnings; use utf8; use Encode; use Net::Twitter; binmode STDOUT, ':encoding(shiftjis)'; binmode STDERR, ":encoding(shiftjis)"; my $nt = Net::Twitter->new( traits => ['API::REST', 'OAuth'], consumer_key => "your key", consumer_secret => "your secret key", ); my $access_token; my $access_token_secret; unless ( $nt->authorized ) { # The client is not yet authorized: Do it now print "Authorize this app at ", $nt->get_authorization_url, " and enter the PIN#\n"; my $pin = <STDIN>; # wait for input chomp $pin; my($access_token, $access_token_secret, $user_id, $screen_name) = $nt->request_access_token(verifier => $pin); # save_tokens($access_token, $access_token_secret); # if necessary print "Access token: ", $access_token, "\n"; print "Access token secret: ", $access_token_secret, "\n"; }
得たトークンを使って公式RT(自分を公式RTしたtweetのリスト)を取得するコード
#!/usr/bin/perl -w use strict; use warnings; use CGI; use LWP::UserAgent; use Net::OAuth; use Data::Random qw(rand_chars); $Net::OAuth::PROTOCOL_VERSION = Net::OAuth::PROTOCOL_VERSION_1_0A; my $consumer_key = 'your key'; my $consumer_secret = 'your secret key'; my $access_token = 'your token'; my $access_token_secret = 'your token secret'; my $url = 'http://api.twitter.com/1/statuses/retweets_of_me.xml'; my $method = 'GET'; my $query = CGI->new; my $request = Net::OAuth->request('protected resource')->new( consumer_key => $consumer_key, consumer_secret => $consumer_secret, request_url => $url, request_method => $method, signature_method => 'HMAC-SHA1', timestamp => time, nonce => join('', rand_chars(ssize => 16, set => 'alphanumeric')), token => $access_token, token_secret => $access_token_secret, extra_params => {count => '200'}); $request->sign; my $ua = LWP::UserAgent->new; my $response; if ($method eq 'GET') { $response = $ua->get($request->to_url); } else { $response = $ua->post($request->to_url); } print $query->header('application/atom+xml; charset=utf-8'); print $response->content;
XML::Simpleでパースしようとすると
not well-formed (invalid token)
が出て動かないよー。えーん。
ググったらeucに変換してutfにしたらできたとか、妖しい記事はっけん。