twitterでoauth認証

ネットに情報そこそこあると思うけど、わかりにくいので自分用メモ


twitteroauth認証でログインするには、

  • アプリを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にしたらできたとか、妖しい記事はっけん。