Perl + Net::Twitter + OAuth で自分のリスト内の人を別アカウントで全部followしちゃうよ
タイトルが長い!
最近tweenがリストを取得してくれなくなってしまった。フォローして振り分けるとか方法は色々あると思いますが、今回は別アカウントを作ってそいつにフォローさせたい。
昔はtwitterはBasic認証でアクセスできたのですが、最近はOAuthを使わなきゃいけないらしい。ので、手順をまとめる。
アプリケーション登録申請
http://dev.twitter.com/ の "Register an app" (http://dev.twitter.com/apps/new) から申請して、"Consumer key" と "Consumer secret" を取得します。
アクセストークン取得
自分のアクセストークンであれば、http://dev.twitter.com/apps/ でアプリケーションを選んだ後 "My Access Token" から "Access Token (oauth_token)" と "Access Token Secret (oauth_token_secret)" をメモしておきます。
アプリを登録したIDとは別のIDで使う場合は、PINコードを取得してからアクセストークンを取得する流れになります。
use strict; use warnings; use Net::Twitter; my $nt = Net::Twitter->new( traits => [qw/OAuth/], consumer_key => "MY-CONSUMER-KEY", consumer_secret => "MY-CONSUMER-SECRET", ); print "Authorize this app and enter the PIN# from:\n", $nt->get_authorization_url, "\n\nPIN = "; my $pin = <STDIN>; # wait for input $pin =~ tr/\x0A\x0D//d; my($access_token, $access_token_secret, $user_id, $screen_name) = $nt->request_access_token(verifier => $pin); print "\n"; print "verifier : $pin\n"; print "access_token : $access_token\n"; print "access_token_secret : $access_token_secret\n"; print "user_id : $user_id\n"; print "screen_name : $screen_name\n";
多分こんな感じのコードで。get_authorization_url() で出力されるURLにブラウザでアクセスすると、おなじみの許可する/しないを選択する画面が出てくるので、許可するとPINコードが表示されるはずです。
表示されたPINコードを標準入力から入力すると、アクセストークンが取得できます。
OAuthを使ったtwitter操作
実際はsecret(秘密鍵?)を使って暗号化したデータを何回かやり取りしないといけないらしいのですが、ライブラリーを使う分には難しいことは考えなくてOK。
この2ペアさえ覚えておけば問題ないでしょう。詳しくはこちらのサイトが参考になります。特に公式ドキュメントのサンプルコードはそのままコピペで使えそう。
- Net::Twitter::Role::OAuth - Net::Twitter role that provides OAuth instead of Basic Authentication - metacpan.org
- http://perl-mongers.org/2010/06/_perltwitteroauth.html
- http://techno-st.net/2009/11/26/twitter-api-oauth-0.html
use strict; use warnings; use Net::Twitter; my $nt = Net::Twitter->new( traits => [qw/API::REST API::Lists OAuth/], consumer_key => "MY-CONSUMER-KEY", consumer_secret => "MY-CONSUMER-SECRET", ); # access token of the list owner my $access_token_l = "ACCESS-TOKEN-1"; my $access_token_secret_l = "ACCESS-TOKEN-SECRET-1"; # access token of follower my $access_token_f = "ACCESS-TOKEN-2"; my $access_token_secret_f = "ACCESS-TOKEN-SECRET-2"; # get members from list $nt->access_token($access_token_l); $nt->access_token_secret($access_token_secret_l); # my $lists = $nt->get_lists({user => 'kkobayashi'}); for(my $cursor = -1, my $r; $cursor; $cursor = $r->{next_cursor}){ $r = $nt->list_members({ user => 'kkobayashi', list_id => 15462199, # @kkobayashi/voice cursor => $cursor, }); ### $r foreach my $user (@{$r->{users}}){ $list_members{$user->{screen_name}} = $user; } } ### %list_members ### follow members of the list (unless already followed) $nt->access_token($access_token_f); $nt->access_token_secret($access_token_secret_f); ### get friends my %friends; for(my $cursor = -1, my $r; $cursor; $cursor = $r->{next_cursor}){ $r = $nt->friends({ cursor => $cursor }); ### $r foreach my $user (@{$r->{users}}){ $friends{$user->{screen_name}} = $user; } } ### %friends ### add friends foreach my $screen_name (keys %list_members){ ### $screen_name my $r = $nt->create_friend($screen_name) unless exists $friends{$screen_name}; ### $r }
リストのIDが分からないときはget_lists()で調べてきます。リストのメンバーくらい認証なしでできて欲しい気はするのですが・・・。APIドキュメントによると認証必須らしい。うーむ。
http://dev.twitter.com/doc/get/:user/:list_id/members
リストの所有者とフォロー追加したい人が別アカウントなので、access_token/access_token_secret を設定しなおしてます。
それにしても、目的のリストは声優さんしか入っていないので、"friends"などと言われると何とも恐れ多いというか何というか。