Iwiki to external.pl

Материал из Викиреальностя
Перейти к: навигация, поиск

Бот для автозамены интервики-ссылок на внешние ссылки. Написан на Perl.

[править] Исходный код

#!/usr/bin/perl
 
# GPL v2
# Бот для автозамены интервикиссылок на внешние ссылки
# Авторы: lj-user: suspected_one, Anonymous
#
 
use utf8;
use MediaWiki::API;
my $mw = MediaWiki::API->new({ api_url => 'http://wikireality.ru/w/api.php' });
$mw->login({ lgname => 'Имя_бота', lgpassword => 'Пароль_бота' }) || die;
 
my $iwmap = $mw->api({ 
        action => 'query', 
        meta => 'siteinfo', 
        siprop => 'interwikimap'
});
 
my $iwtable = $iwmap->{query}->{interwikimap}; 
 
my %language_name_by_prefix = ();
my %url_by_prefix = ();
foreach my $it(@$iwtable) 
{ 
        my $iprefix = $it->{prefix}; 
        my $ilang = $it->{language}; 
        my $iurl = $it->{url};
 
        next if(!$ilang); # Не интервики
 
        $language_name_by_prefix{$iprefix} = $ilang;
        $url_by_prefix{$iprefix} = $iurl;
}
 
$mw->list({
        action => 'query',
        list => 'allpages',
        apnamespace => 0,
        apfilterredir => 'nonredirects',
        apfilterlanglinks => 'withlanglinks',
        aplimit => 5000
}, { hook => \&process_article, max => 999 });
 
sub process_article
{
        my($ref) = @_;
        foreach my $target(@$ref)
        {
                my $res = $mw->get_page($target);
                next if(!$res);
 
                my $text = $res->{'*'};
 
                my $resiw = $mw->api({ 
                        action => 'query', 
                        prop => 'langlinks', 
                        llimit => 500, 
                        titles => $target->{title} 
                }) || die;
 
                my $iwiki = (values %{$resiw->{query}->{pages}})[0]->{langlinks}; 
                foreach my $iw(@$iwiki) 
                { 
                        # Переменная $iw->{lang} — это интервикипрефикс (например, 'absurd'). 
                        # А переменная $iw->{'*'} — это название статьи в той вики, куда интервикиссылка 
                        my $prefix = $iw->{lang}; 
                        my $target = $iw->{'*'}; 
 
                        # Стереть уже имеющиеся интервики 
                        $text =~ s/\[\[$prefix:[^\]]*?\]\]//g;
 
                        my $language = $language_name_by_prefix{$prefix};
                        my $url = $url_by_prefix{$prefix};
 
                        if($text !~ /^==[\s=]*?Ссылки[\s=]*?$/mg) { 
 
                                # Добавляем раздел «Ссылки» тут. 
                                if($text =~ /\{\{(IM|(S|s)martass|(AA|АА)-конфликт|АК( РВП)?|(А|а)рбитраж|(У|у)кроАрбитраж|БАО|(Б|б)елоруссия|(Б|б)логосфера|(В|в)еб 2.0|(В|в)иды вандализма|(В|в)икимедиа РУ|(В|в)икипедисты|(П|п)ротиводействие произволу|(В|в)икисреда|ВК(07|08|09|10)|[Ww]ikimedia|(В|в)икия|ГСБ|(Г|г)омосексуали(зм|сты) в русской Википедии|(Д|д)ети в викисреде|(В|в)икисреда в ЖЖ|(И|и)звестные аккаунты в ЖЖ|(И|и)мена|(К|к)онфликты|(К|к)расные участники|(М|м)емы|(О|о)бъединения русской Википедии|(Г|г)руппы участников по политическим убеждениям|(П|п)равила Википедии|(П|п)роекты (ВП|в Рувики)|(П|п)одпроекты Адмиралтейства|(П|п)рототипы поведения|(Р|р)евизоры|(Р|р)усские националисты|(С|с)ибирский язык|(С|с)оциальные сети|(С|с)траны|(Т|т)радиционалы|(У|у)краина|(Ф|ф)ауна Википедии|(С|с)писок членов АПЭ|(А|а)дминистраторы (русской|украинской) Википедии|(А|а)дминистраторы|(А|а)дминистрация wikipedia-ru|БПРАК|(Б|б)юрократы|(Л|л)уркоморье|(М|м)есяц|(Н|н)еизбранные кандидаты в администраторы( Традиции)?|(П|п)одводящие итоги|(У|у)кроБюрократы|(У|у)частники irc lurkmore|(А|а)дминистрация lurkmore|(Ч|ч)екъ?юз(инг|еры)|CheckUsers|(Г|г)оды|[Mm]oar|[Ss]tub|ИС|Оппозиция РВП)[\|\}]/g)
                                { 
                                        substr($text, pos($text) - length($&), 0) = "== Ссылки ==\n\n";
                                }
                                else 
                                {
                                        # Навигационных шаблонов не нашли. Добавляем перед категориями. 
                                        if($text =~ /\[\[((К|к)атегория|[Cc]ategory)\:/g)
                                        {
                                                substr($text, pos($text) - length($&), 0) = "== Ссылки ==\n\n";
                                        }
                                        else
                                        {
                                                $text .= "\n== Ссылки ==\n";
                                        }
                                }
 
                                $text =~ /^==[\s=]*?Ссылки[\s=]*?$/mg;
                        } 
                        my $pos = pos($text); # Номер символа сразу после заголовка
                        $url =~ s/\$1/$target/g; # Заменит все «$1» на название статьи
                        $url =~ s/ /_/g;
                        substr($text, $pos, 0) = "\n* [$url $target] на сайте [[$language]].";
                }
 
                if($text ne $res->{'*'})
                {
                        print "\t" . $target->{title}, "\n";
 
                        $mw->edit({
                                action => 'edit',
                                title => $target->{title},
                                text => $text,
                                minor => 1,
                                nocreate => 1,
                                bot => 1,
                                timestamp => $res->{timestamp},
                                summary => "Робот: замена интервики на внешние ссылки"
                        });
 
                }
        }
}
Iwiki to external.pl относится к теме «Техники и викиботы»   ±