Twitterでフォローしてる人全員をリストに追加するPerlスクリプト

を書いた。コンシューマーキーとかは各自で取得してください(適当)

#!/usr/bin/perl
# フォローしてる人全員を「all」という名前のリストに追加する
# 事前に「all」リストを作成しておく必要あり
use utf8;
use strict;
use warnings;
use Net::Twitter;
binmode STDOUT, ":encoding(cp932)"; #Windows環境
#use Data::Dumper;

my $nt = Net::Twitter->new(
	traits => [qw/AutoCursor API::RESTv1_1 RetryOnError OAuth/],
	consumer_key    => "",
	consumer_secret => "",
); 


my($access_token, $access_token_secret) = ("", ""); 
$nt->access_token($access_token);
$nt->access_token_secret($access_token_secret);

my $my_screen_name = "tk4168"; #自分のユーザ名

# 全フォローを取得
print "フォローリストを取得しています。\n";
my $ids = $nt->friends_ids;

# リストに追加(APIの仕様上、1回につき100ユーザまで)
print "リストに追加しています。\n";
for (my $i = 0; $i < @$ids; $i += 100) {
	my $slice_end_index; #100ユーザごとに配列スライスするが、最後のスライス時の範囲だけ異なる
	if ($i + 99 < @$ids) {
		$slice_end_index = $i + 99;
	}
	else {
		$slice_end_index = @$ids - 1;
	}
	
	my @userids = @{$ids}[$i .. $slice_end_index];

	eval { $nt->members_create_all({owner_screen_name => $my_screen_name, slug => "all", user_id => \@userids}); };
	if ( $@ ) {
		print "リスト追加時にエラーが発生しました。一部のユーザが追加されていない可能性があります。\n再度実行すると追加できるかもしれません。\n";
	}
}

# 自分をリストに追加
$nt->add_list_member({owner_screen_name => $my_screen_name, slug => "all", screen_name => $my_screen_name});

# リストに追加されなかった人を抽出
# ※デバッグ用。members_create_allは1回で全メンバーを追加できないことがある。その場合は何回か実行するとよい。
# また、たまにTwitterの不具合で、アカウント削除されたユーザがフォローに含まれたまま残っていることがあるが、
# その「ユーザ」はリストには追加できないので失敗するという事象がある)

my @list_members;

for (my $cursor = -1, my $r; $cursor; $cursor = $r->{next_cursor}) {
	$r = $nt->list_members({owner_screen_name => $my_screen_name, slug => "all", cursor => $cursor});
	for (@{ $r->{users} }) {
		push @list_members, $_->{id};
	}
}


print "以下のユーザはリストに追加されませんでした。\n";
for (@{$ids}) {
	my $id = $_;
	print $id . "\n" if (! (grep {$_ eq $id} @list_members));
}

print "処理が終了しました。\n";