Skip to content

Instantly share code, notes, and snippets.

@popkirby
Created November 17, 2012 15:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save popkirby/4096603 to your computer and use it in GitHub Desktop.
Save popkirby/4096603 to your computer and use it in GitHub Desktop.
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