Rv.pl
Материал из Викиреальностя
Бот на Perl для автоматического скрытого отката вандализма и блокировки вандала или открытого прокси. Для работы необходимы права «block», «rollback» и «markbotedits» (может работать и без прав бота от имени администратора — в таком случае блокировка будет видна, а откаты все равно будут совершаться скрыто). Также необходимо наличие на сервере библиотек Perl, перечисленных в начале бота. Для их установки используется cpan.
[править] Исходный код
#!/usr/bin/perl # GPL v2 # Бот для борьбы с вандализмом # Авторы: lj-user: suspected_one, Anonymous # binmode STDOUT, ':utf8'; use utf8; use MediaWiki::API; use Getopt::OO; use URI::Encode qw(uri_encode uri_decode); use Encode; my $mw = MediaWiki::API->new({ api_url => 'http://wikireality.ru/w/api.php' }); $mw->login({ lgname => 'Имя_бота', lgpassword => 'Пароль_бота' }) || die; my $user; my $expiry; my $reason = "Робот: ликвидация вандализма"; my $handle = Getopt::OO->new(\@ARGV, '--user' => { n_values => 1, callback => sub { my($handle, $option) = @_; ($user) = $handle->Values($option); return 0; } }, '--opt' => { n_values => 1, callback => sub { my($handle, $option) = @_; my($param1) = $handle->Values($option); if($param1 eq 'user') { $expiry = "indefinite"; } elsif($param1 eq 'ip') { $expiry = "1 week"; } elsif($param1 eq 'proxy') { $expiry = "1 year"; $reason = "Робот: ликвидация открытого прокси"; } else { return "Wrong value for --opt! Must be one of user/ip/proxy."; } return 0; } } ); if(!$user || !$expiry) { print STDERR "User and/or expiry not set.\n"; exit 1; } # Получение токенов my $resb = $mw->api({ action => 'query', prop => 'info', intoken => 'block', titles => 'User:Example' }) || die "Не могу получить blocktoken"; my $blocktoken = (values %{$resb->{query}->{pages}})[0]->{blocktoken}; # Блокировка print "\t" . $user, "\n"; $user = decode("utf8", $user); utf8::decode $user; $mw->api({ action => 'block', user => $user, expiry => $expiry, reason => $reason, nocreate => 1, autoblock => 1, noemail => 1, token => $blocktoken }); # Откат sub process_article { my $ref = shift; foreach my $item(@$ref) { my $title = $item->{title}; # Тут получили название страницы next if($ALREADY_CHECKED_THIS_PAGE{$title}); $ALREADY_CHECKED_THIS_PAGE{$title} = 1; print "\t" . $title, "\n"; my $resr = $mw->api({ action => 'query', prop => 'revisions', rvtoken => 'rollback', titles => 'Labuda' }) || die "Не могу получить rollbacktoken"; my $token = (values %{$resr->{query}->{pages}})[0]->{rollbacktoken}; $mw->edit({ action => 'rollback', title => $title, user => $user, markbot => 1, token => $token }); } } $mw->list({ action => 'query', list => 'usercontribs', ucuser => $user, ucprop => 'title' }, { hook => \&process_article, max => 999 });
[править] Использование
Из папки, в которой находится бот:
$ perl rv.pl --opt $opt --user $user
- Значения $opt:
- user — бессрочная блокировка;
- proxy — блокировка на один год, иной комментарий к блокировке;
- ip — блокировка на неделю.
- Значения $user:
- Правильное имя участника или IP-адрес.
Rv.pl относится к теме «Техники и викиботы» |