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 относится к теме «Техники и викиботы»   ±