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