Created
November 17, 2012 15:00
-
-
Save popkirby/4096603 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use strict; | |
use utf8; | |
use feature ':5.10'; | |
use threads; | |
use Net::Twitter; | |
use Config::Simple; | |
binmode STDIN, ":utf8"; | |
binmode STDOUT, ":utf8"; | |
# 変なの | |
# ・ぱーる | |
# ・threadsがつかいます | |
# ・Net::TwitterとConfig::SimpleとSSLのなんかつかいます | |
# ・こんしゅーまーなんとかは書き換え | |
# | |
# 設定保存用にsettings.iniってファイルをカレントディレクトリに | |
# | |
# [general] | |
# number=0 | |
# | |
# って内容でつくっとかないと死ぬ | |
# 詳細な使い方はソース読もう | |
# 設定保存用 | |
my $cfg = new Config::Simple("settings.ini"); | |
my @accounts = (); | |
my @selected = (); | |
my @threads; | |
# 初期化 | |
sub init{ | |
my $num = $cfg->param("general.number"); | |
my $i = 0; | |
for($i = 1; $i <= $num; $i++){ | |
$accounts[$i] = Net::Twitter->new( | |
traits => [ 'API::REST', 'OAuth' ], | |
consumer_key => 'ここ', | |
consumer_secret => 'ここも', | |
); | |
} | |
&restore_selection(); | |
return; | |
} | |
# 最初の | |
sub init_cfg{ | |
print "createing settings file...\n"; | |
$cfg->save(); | |
print "add account first.\n"; | |
&add_account(); | |
@selected = [1]; | |
&select_user_in(1); | |
return; | |
} | |
# アカウント増やす | |
sub add_account{ | |
my $twit = Net::Twitter->new( | |
traits => [ 'API::REST', 'OAuth' ], | |
consumer_key => 'ここ', | |
consumer_secret => 'ここも', | |
); | |
push(@accounts, $twit); | |
print "access this url: " . $twit->get_authorization_url . "\n"; | |
print "input PIN: "; | |
my $pin = <STDIN>; | |
chomp $pin; | |
my($access_token, $access_token_secret, $user_id, $screen_name) = $twit->request_access_token(verifier => $pin); | |
&save_config($access_token, $access_token_secret, $screen_name); | |
return; | |
} | |
# 設定を保存 | |
sub save_config{ | |
my($access_token, $access_token_secret, $screen_name) = ($_[0], $_[1], $_[2]); | |
my $number = $cfg->param("general.number"); | |
if(!defined($number)){ | |
$number = 0; | |
} | |
my $newnum = $number + 1; | |
$cfg->param("user$newnum.name", $screen_name); | |
$cfg->param("user$newnum.accesstoken", $access_token); | |
$cfg->param("user$newnum.accesssecret", $access_token_secret); | |
$cfg->param("general.number", $newnum); | |
&save_selection(); | |
$cfg->save(); | |
return; | |
} | |
sub save_selection{ | |
$cfg->param("general.selection", join(' ', @selected)); | |
$cfg->save(); | |
return; | |
} | |
sub restore_selection{ | |
my @sel = split(/ /, $cfg->param("general.selection")); | |
@selected = @sel; | |
&select_user_in(); | |
return; | |
} | |
# ユーザを選択 | |
sub select_user{ | |
print "select user: "; | |
my $select = <STDIN>; | |
chomp($select); | |
@selected = split(/ /, $select); | |
&select_user_in(); | |
&save_selection(); | |
return; | |
} | |
sub read_config{ | |
my $num = $_[0]; | |
return ($cfg->param("user$num.accesstoken"), $cfg->param("user$num.accesssecret")); | |
} | |
sub output_user{ | |
my $i = 0; | |
my $num = $cfg->param("general.number"); | |
for($i = 1; $i <= $num; $i++){ | |
my $name = $cfg->param("user$i.name"); | |
print "$i: $name\n"; | |
} | |
} | |
sub select_user_in{ | |
my $i = 0; | |
my $num = $cfg->param("general.number"); | |
for($i = 1; $i <= $num; $i++ ) { | |
my @token = &read_config($i); | |
$accounts[$i]->access_token($token[0]); | |
$accounts[$i]->access_token_secret($token[1]); | |
} | |
return; | |
} | |
sub help{ | |
print << "END_OF_HELP"; | |
r4s.pl help | |
help: show this help | |
create: get access token | |
users: show configured users | |
select: select user by number | |
selected: show selected user by number | |
do: do r4s! | |
exit: exit | |
END_OF_HELP | |
} | |
# 選択してるユーザを表示 | |
sub show_selected{ | |
print "selected user: " . join(" ", @selected) . "\n"; | |
return; | |
} | |
# 本体 | |
sub do_bakugeki{ | |
print "Enter name of the targetting user: \@"; | |
my $name = <STDIN>; | |
chomp($name); | |
print "creating thread...\n"; | |
@threads = (); | |
my $i = 0; | |
my $len = @selected; | |
for($i = 0; $i < $len; $i++){ | |
my $thread = threads->new(\&inner, $selected[$i], $name); | |
push(@threads, $thread); | |
} | |
foreach(@threads){ | |
my ($return) = $_->join; | |
} | |
return; | |
} | |
# スレッドに渡すの | |
sub inner{ | |
my($i, $name) = ($_[0], $_[1]); | |
my $j = 0; | |
my $twit = $accounts[$i]; | |
eval{ | |
my $status = $twit->report_spam({"screen_name" => $name}); | |
select undef, undef, undef, 0.4; | |
print "user $i: ok...$j\n"; | |
threads->yield(); | |
}; | |
if (my $err = $@){ | |
warn "HTTP Response Code: ", $err->code, "\n", | |
"HTTP Message......: ", $err->message, "\n", | |
"Twitter error.....: ", $err->error, "\n"; | |
} | |
return $i; | |
} | |
# メインルーチン | |
sub main{ | |
print "Welcome to bakugeki2.pl!\n"; | |
print "Enter help to help\n"; | |
while(1){ | |
print ">>> "; | |
my $command = <STDIN>; | |
chomp($command); | |
given ($command) { | |
when ("help") { &help(); } | |
when ("users") { &output_user(); } | |
when ("create") { &add_account(); } | |
when ("select") { &select_user(); } | |
when ("selected") { &show_selected(); } | |
when ("do") { &do_bakugeki(); } | |
when ("exit") { last; } | |
default { print "?\n"; next; } | |
} | |
} | |
} | |
# じゃあの | |
&init(); | |
&main(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment