TwitterのOAuth認証なボットを書くのは簡単

Twitterボットを書くこと自体はとても簡単だけれど、OAuth認証?面倒そう!って人がいそうなので、全然そんなこともないよ、と言う話を書いておこうと思う。いろいろ探すといくらでも出てくる情報ではあるのだけれど、APIへのアクセスをライブラリに任せているのならば、要するに問題はどうやってAccess Tokenを取得するかってことだけになると思うので、それについて。

ここではPerlのNet::Twitterを使って書くけれど、どんなライブラリでもたいして変わらないだろうと推測される。

Net::TwitterでOAuth

Net::Twitter::Role::OAuthのperldoc見て!と言ったら元も子もないので(本当にそれだけの話だけれど)、サンプルコードで。これもperldocに書いてある。

use Net::Twitter;
my $nt = Net::Twitter->new(
    traits          => ['API::REST', 'OAuth'],
    consumer_key    => '...',
    consumer_secret => '...',
);
$nt->access_token('...');
$nt->access_token_secret('...');

# あとはいつも通りで

さて、ここでconsumer_keyとconsumer_secretは、dev.twitter.comから登録出来るアプリケーションのConsumer Key/Secretなので疑問はないだろう(ボットならクライアントアプリとして登録しておくこと)。問題は、access_tokenとaccess_token_secretをどうやって取得するのか(面倒くさそう!)というところ。

Access Tokenを取得する

これもNet::Twitter::Role::OAuthのサンプルコードを見ると書いてあるのだけれど、ちょっとだけ書き直してみた。

#!perl
use strict;
use warnings;
use Net::Twitter;

print "Consumer Key:\n";
my $consumer_key = <STDIN>;
chomp $consumer_key;

print "Consumer Secret:\n";
my $consumer_secret = <STDIN>;
chomp $consumer_secret;

print <<EOD;
--- CONSUMER KEY AND SECRET ---
consumer_key    : $consumer_key
consumer_secret : $consumer_secret
EOD

my $nt = Net::Twitter->new(
    traits          => ['API::REST', 'OAuth'],
    consumer_key    => $consumer_key,
    consumer_secret => $consumer_secret,
);

print "Authorize this app at ", $nt->get_authorization_url, " and enter the PIN#\n";

my $pin = <STDIN>;
chomp $pin;

my($access_token, $access_token_secret, $user_id, $screen_name) = $nt->request_access_token(verifier => $pin);

print <<EOD;
--- ACCESS TOKEN ---
access_token        : $access_token
access_token_secret : $access_token_secret
user_id             : $user_id
screen_name         : $screen_name
EOD

これを実行すると、まずはconsumer key/secretを聞かれる。アプリケーション登録時のものを答えるだけなので、コピペでなんとかなるだろう。

そのまま進むと、認証用URIが表示される。ここにボットを動かしたいアカウントでログインした状態のブラウザでアクセスする。そうするといつもの「許可」「拒否」のページになるので、「許可」してPINを得る。

スクリプトに戻りPINをペーストして実行を続ければ、無事Access TokenとAccess Token Secretが得られるはずだ。あとはこれをconfigに書くなりbotにハードコードするなりすれば、その先はこれまで通りのやり方で済む。

まとめ

OAuthが面倒と言っているのは、認証実装上の諸問題をNet::Twitterなどのライブラリに任せるならば、Access Tokenの取得フェーズが面倒と言う話であり、それは上記のような専用の取得スクリプトを用意しておくことで簡単に解決出来る。

おまけ

ちなみに、アプリケーション登録をしたアカウントとボットを動かすアカウントが同じ場合は、dev.twitter.comに書いてあるAccess Tokenを使えば良い*1ので、上記の操作すら不要です。

*1:右カラムのMy Access Tokenからアクセス出来ます