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からアクセス出来ます