Perl + Net::Twitter + OAuth で自分のリスト内の人を別アカウントで全部followしちゃうよ

タイトルが長い!


最近tweenがリストを取得してくれなくなってしまった。フォローして振り分けるとか方法は色々あると思いますが、今回は別アカウントを作ってそいつにフォローさせたい。

昔はtwitterBasic認証でアクセスできたのですが、最近は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。

  • consumer_key、consumer_secret(アプリケーションごとに固有)
  • access_token、access_token_secret(ユーザーごとに固有)

この2ペアさえ覚えておけば問題ないでしょう。詳しくはこちらのサイトが参考になります。特に公式ドキュメントのサンプルコードはそのままコピペで使えそう。

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"などと言われると何とも恐れ多いというか何というか。