MediaWiki (perl): различия между версиями

Содержимое удалено Содержимое добавлено
{{Темы|Справочники}}
Оформление; обновление ссылок; уточнения; + Категория:Программное обеспечение.
Строка 1:
'''Perl-модуль MediaWiki''' — интерфейсбиблиотека на(модуль) [[для {{w |Perl]] 5}}, созданный [[w:Участник:СибирчегНоНеНарушитель|Эдуардом Черненко]] и предназначенный для написания [[w:Википедия:Бот |ботов]] для Википедии. ТекущаяПоследняя версия — '''1.08'''13 (2008-01-06). Код модуля можноисходно получитьраспространялся через {{w |CPAN}}; в архивенастоящее время может быть получен [[CPAN]]http://snapshot.debian.org/archive/debian/20120328T101221Z/pool/main/libm/libmediawiki-perl/ через snapshot.debian.org.]
 
== Возможности ==
 
* Получение и сохранение кода страниц;.
* «Prepared get» — получение вики-текста из формы редактирования вместе со спец-полями, значения которых понадобятся при сохранении страницы;.
* Отметка минорных[[w:Википедия:Малые правокизменения |малых изменений]]; ведение [[w:Справка:Список наблюдения |списка наблюдения;]].
* Загрузка изображений.
* '''[SYSOP]''' Установка и снятие защиты страниц;
* Просмотр истории страниц и функция быстрого отката (пока что всегда в обход админ-интерфейса).
* '''[SYSOP]''' Удаление и восстановление страниц;
* Получение списка страниц в категории.
* '''[SYSOP]''' Блокировка/разблокировка пользователей;
* Привилегированные операции:
* Загрузка изображений;
** установка и снятие защиты страниц;
* Просмотр истории страниц и функция быстрого отката (пока что всегда в обход админ-интерфейса);
** удаление и восстановление страниц;
* Получение листинга категорий.
** блокировка/разблокировка пользователей.
 
== Недоработки ==
Строка 17 ⟶ 18 :
 
== Пример конфигурационного файла ==
 
<pre>
[bot]
user = VasyaPupkinBot
Строка 25 ⟶ 26 :
host = ru.wikipedia.org
path = w
 
has_filepath = 1 ; <i style="white-space: pre-wrap;" >установите в 1, если доступна страница [[Служебная:Filepath]].</i>
has_query = 1 ; <i style="white-space: pre-wrap;" >установите в 1, если доступен интерфейс [[mw:API:Query |Query API]].</i>
 
[tmp]
msgcache = /tmp/mediawiki.msg
</pre>
 
== Интерфейс ==
<source lang="perl">
<pre> use MediaWiki;
use MediaWiki;
 
$c = MediaWiki->new;
$is_ok = $c->setup("config.ini");
$is_ok = $c->setup({
'bot' => { 'user' => 'Vasya', 'pass' => '123456' },
'wiki' => {
Строка 44 ⟶ 45 :
'path' => 'w'
}})
$is_ok = $c->switch('starwars.wikia.com');
$is_ok = $c->switch('en.wikipedia.org',
'w', { 'has_query' => 1, 'has_filepath' => 1 });
$whoami = $c->user();
 
$text = $c->text("page_name_here");
$is_ok = $c->text("page_name_here", "some new text");
 
$c->refresh_messages();
$msg = $c->message("MediaWiki_message_name");
 
die unless $c->exists("page_name");
 
my($articles_p, $subcats_p) = $c->readcat("category_name");
 
$is_ok = $c->upload("image_name", `cat myfoto.jpg`, "some notes", $force);
 
$is_ok = $c->block("VasyaPupkin", "2 days");
$is_ok = $c->unblock("VasyaPupkin");
 
$c->{summary} = "Automatic auto-replacements 1.2";
$c->{minor} = 1;
$c->{watch} = 1;
 
if(!$is_ok)
{
$err = $c->{error};
# do something
}
 
$pg = $c->random();
$pg = $c->get("page_name");
$pg = $c->get("page_name", "");
$pg = $c->get("page_name", "rw");
 
$is_ok = $pg->load();
$is_ok = $pg->save();
$text = $pg->oldid($old_version_id);
$text = $pg->content();
$title = $pg->title();
 
$is_ok = $pg->delete();
$is_ok = $pg->restore();
$is_ok = $pg->protect();
$is_ok = $pg->protect($edit_protection);
$is_ok = $pg->protect($edit_protection, $move_protection);
 
$is_ok = $pg->move("new_name");
$is_ok = $pg->watch();
$is_ok = $pg->unwatch();
 
$is_ok = $pg->upload(`cat myfoto.jpg`, "some notes", $force);
 
$is_ok = $pg->block("2 days");
$is_ok = $pg->unblock();
 
$pg->history(sub { my $edit_p = shift; } );
$pg->history_clear();
my $edit_p = $pg->last_edit;
my $edit_p = $pg->find_diff(qr/some_regex/);
$is_ok = $pg->markpatrolled();
$is_ok = $pg->revert();
 
$pg->{history_step} = 10;
 
$is_ok = $pg->replace(sub { my $text_p = shift; } );
$is_ok = $pg->remove("some_regex_here");
$is_ok = $pg->remove_template("template_name");
 
$pg->{content} = "new text";
$pg->{summary} = "do something strange";
$pg->{minor} = 0;
$pg->{watch} = 1;
</presource>
 
== Подробное описание функций и свойств ==
Строка 124 ⟶ 126 :
! Описание
|-
| <code >MediaWiki->new ()</code>
| Создаёт и возвращает структуру клиента MediaWiki
|-
| <nowiki>$c->setup ([ $ini_file_name | $config_hash_pointer ])</nowiki>
| Читает конфигурационный файл (если не указан, то берётся файл "<code >.bot.ini"</code> из домашнего каталога текущего пользователя) и настраивает клиент. Если указаны имя пользователя и пароль, то вызывает <code >$c->login()</code>. Если в качестве параметра передаётся указатель на хэш-массив, то он будет использован как источник конфигурации (<code >{ 'bot' => { 'user' => ..., 'pass' => ...}, 'wiki' => ... }</code>).
|-
| $c->login ([$user {{nobr|[, $password]}}])
| ПроизводитВыполняет «вход» в системувики и сохраняет полученные [[{{w |cookie]]}} в файле <code >.lwpcookies.txt</code> в домашнем каталоге пользователя.
|-
| $c->switch (($wiki_hash_pointer | $wiki_host {{nobr|[, $wiki_path]}} {{nobr|[, $wiki_hash_pointer]}}))
| Частично перенастраивает клиент (обычно используется для интервики-ботов). Первый необязательный параметр - имя сервера (например, <code >'ru.wikipedia.org'</code>), второй необязательный — путь к <code >index.php/query.php</code> (например, <code >'w'</code>). Самый последний параметр (первый встретившийся указатель на хэш-массив) воспринимается как дополнительные ключи, которые необходимо изменить в разделе конфигурации '<code >wiki'</code> (например, <code >'has_filepath'</code>). Все ключи, не изменяемые явно, сохранят своё значение. После перенастройки будет выполнена попытка входа под тем же именем и паролем, что и при начальной конфигурации, если таковые были заданы. '''Примечание:''' информация о всех вызовах <code >$c->login ()</code> сохраняется — при обратном переключении будут использованы cookie, полученные при первом входе.
|-
| <code >$c->user ()</code>
| Возвращает имя пользователя, полученное из конфигурационного файла, или делает правку в [[w:Википедия:Песочница |песочнице]] и получает IP-адрес из истории страницы. В последнем случае результат не кэшируется (не вызывайте эту функцию несколько раз, а запоминайте результат, если он используется несколько раз).
|-
| $c->text( ($page_name {{nobr|[, $new_text ]}})
| Если задан параметр <code >$new_text</code>, то сохраняет страницу <code >$page_name</code> с его содержимым в качестве текста. В противном случае возвращает текущий вики-текст.
|-
| <code >$c->refresh_messages ()</code>
| Скачивает [[Служебная:Allmessages|все сообщения]] MediaWiki и сохраняет их в кэше.
|-
| <code >$c->message ($message_name)</code>
| Возвращает сообщение с указанным именем из кэша. Если кэш отсутствует, то получает это сообщение отдельно.
|-
| <code >$c->exists ($page_name)</code>
| Возвращает истину, если страница существует.
|-
| <code >$c->readcat($category_name)</code>
| Читает содержимое категории. Возвращает два указателя на массивы, первый со списком статей, а второй - со списком подкатегорий (без префикса пространства имён «Категория:»). {{/QUERY}}
|-
| $c->upload($image_name, $content {{nobr|[, $description}} {{nobr|[, $force]]}});
| Выгружает картинку под именем «ИзображениеФайл:$image_name» и содержимым $content. Если описание не указано, то будет использована пустая строка. Флаг $force заставляет игнорировать предупреждения (важно: в этой версии предупреждение приводит к отказу от загрузки).
|-
| <code >$c->filepath ($image_name)</code>
| Возвращает прямой URL на изображение.
|-
| <code >$c->download($image_name)</code>
| Скачивает и возвращает содержимое изображения.
|-
| <code >$c->block ($user_name, $block_time)</code>
| Блокирует указанного пользователя на заданный срок. {{/SYSOP}}
|-
| <code >$c->unblock ($user_name)</code>
| Разблокирует указанного пользователя. {{/SYSOP}}
|-
| <code >$c->random ()</code>
| Возвращает ''дескриптор страницы'' (MediaWiki::page) случайной статьи.
|-
| $c->get ($page {{nobr|[, $mode]}})
| Возвращает дескриптор страницы $page. Параметр $mode может принимать значения «», «r», «w» или «rw» (по умолчанию «r»). Если указан флаг '''r''', то будет получен текст страницы, а если указан флаг '''w''', то страница будет подготовлена к сохранению - загружается не сырой текст, а сразу форма редактирования, из которой получаются значения полей, которые понадобятся при сохранении страницы. ''Примечание'': режим подготовки автоматически отключается после первого сохранения страницы.
|-
| <code >$c->{minor}</code>
| Если задано в 1, то все изменения отмечаются как [[w:Википедия:Малые изменения |малые]], установка значения в 0 отключает это поведение. Если значение не определено, то используется значение настроек аккаунта.
|-
| <code >$c->{watch}</code>
| Если задано в 1, то изменяемые страницы будут включаться в [[Служебнаяw:WatchlistСправка:Список наблюдения |список наблюдения]], установка значения в 0 отключает это поведение. Если значение не определено, то используется значение настроек аккаунта.
|-
| <code >$c->{summary}</code>
| Краткое описание для правок, производимых ботом. Также используется в качестве причины переименования страниц, блокировки пользователей и т.  п. Если значение неопределено и не задано в дескрипторе страницы, то используется строка <code >"Bot: Edward's framework"</code>.
|-
| <code >$c->{error}</code>
| В данном поле хранится расширенный код ошибки (см. [[#Обработка ошибок]])
|-
| <code >$c->{on_error}</code>
| В данном поле можно поместить указатель на функцию-обработчик ошибок (см. [[#Обработка ошибок]])
|-
| <code >$pg->load ()</code>
| Получает содержимое страницы. Автоматически вызывается из <code >$c->random</code> и <code >$c->get</code>, если флаг <code >r</code> не был отключён.
|-
| <code >$pg->save ()</code>
| Сохраняет изменения, сделанные в этой странице.
|-
| <code >$pg->content ()</code>
| Возвращает текущее содержимое страницы
|-
| <code >$pg->oldid ($id)</code>
| Получает содержимое старой версии текста
|-
| <code >$pg->title ()</code>
| Возвращает заголовок страницы
|-
| <code >$pg->delete ()</code>
| Удаляет страницу. {{/SYSOP}}
|-
| <code >$pg->restore ()</code>
| Восстанавливает недавно удалённую страницу. {{/SYSOP}}
|-
| $pg->protect({{nobr|[$edit_mode}} {{nobr|[, $move_mode]]}})
| Защищает страницу от изменений. Понимаются следующие режимы защиты: 2 — изменения может производить только администратор, 1 — все, кроме анонимов и [[Служебная:Contributions/newbies|новичков]], 0 — нет защиты. Первый параметр указывает защиту от правок текста, второй - от переименований. Если указан лишь один параметр, то второй устанавливается в такое же значение. Вызов без параметров аналогичен ''$pg->protect(1, 1)''. Для снятия защиты используется вызов ''$pg->protect(0)''.
|-
| <code >$pg->move ($new_name)</code>
| Переименовывает страницу в $new_name.
|-
| $pg->watch ({{nobr|[$unwatch]}})
| Добавляет страницу в список наблюдения. Если параметр $unwatch равен 1, то удаляет страницу из списка наблюдения.
|-
| <code >$pg->unwatch ()</code>
| АналогСиноним ''$pg->watch(1)''.
|-
| $pg->upload ($content, {{nobr|[, $description}} {{nobr|[, $force]]}})
| См. ''$c->upload()''
|-
| <code >$pg->block ($block_time)</code>
| См. ''$c->block()''
|-
| <code >$pg->unblock ()</code>
| См. ''$c->unblock()''
|-
| <code >$pg->history (&cb)</code>
| Запускает функцию-callback для каждой из правок в истории статьи, которая должна возвращать неопределённое значение. Callback может прервать функцию history, вернув истинное значение (при этом history вернёт его же). Callback получает в первом параметре указатель на хэш-массив со следующими полями:
; page : указатель на дескриптор страницы ($pg).
Строка 245 ⟶ 247 :
; datetime : содержит время и дату, разделённые запятой и пробелом.
 
Эта функция использует тот же кэш истории, что и ''last_edit ()'', ''revert ()'' и т.  п.
|-
| <code >$pg->history_clear ()</code>
| Очищает кэш истории. Автоматически вызывается при изменении страницы (к примеру, через ''$pg->save()'')
|-
| <code >$pg->last_edit ()</code>
| Возвращает указатель на хэш-массив, описывающий последнюю правку в статье.
|-
| <code >$pg->find_diff ($regex)</code>
| Возвращает указатель на последнюю правку, в которой было внесено изменение согласно регулярному выражению (то есть предыдущая правка ему не соответствовала, а эта соответствует), или undef в случае ненахождения таковой.
|-
| <code >$pg->markpatrolled ()</code>
| Отмечает последнюю версию статьи как проверенную администратором. В Википедии пока ещё нет этой возможности. {{/SYSOP}}
|-
| <code >$pg->revert ()</code>
| Откатывает изменения, внесённые пользователем, который последним редактировал эту страницу. Эта функция '''не''' использует администраторский инструмент быстрого отката и может использоваться кем угодно. В качестве краткого описания будет использовано MediaWiki-сообщение [[MediaWiki:Revertpage|Revertpage]]. ''Примечание:'' если вы определили необходимость отката из функции history(), то ''опережение'' бота другим пользователем не приведёт к откату к неправильной версии - эта ситуация будет обработана корректно (но только если между вызовами history/last_edit и revert не очищался кэш).
|-
| <code >$pg->replace (&cb)</code>
| Эта функция представляет из себя наиболее общую реализацию бота автозамен. Она разбивает вики-код на части, для которых могут применяться замены и для которых не должны (внутри тегов pre, nowiki или math), а затем вызывает callback, передавая ему указатель на каждый обрабатываемый кусок текста. Впоследствии части склеиваются и сравниваются с оригиналом, и если были произведены изменения, то сохраняется новый текст. ''Примечание'': для совместимости с существующими ботами автозамен страницы, имеющие отметку ''<nowiki>{{NO_BOT_TEXT_PROCESSING}}</nowiki>'' (можно в комментарии), не обрабатываются.
|-
| <code >$pg->remove ($regex)</code>
| Упрощённый бот автозамен: удаляет из текста всё, подпадающее под регулярное выражение $regex.
|-
| <code >$pg->remove_template ($template_name)</code>
| Интерфейс к ''$pg->remove()'', убирающий из текста все вхождения шаблона $template_name.
|-
| <code >$pg->{content}</code>
| Сырое содержимое страницы. В этот элемент записывается новый текст перед вызовом ''$pg->save()''.
|-
| <code >$pg->{minor}</code>
| Аналог ''$c->{minor}'' только для этой страницы.
|-
| <code >$pg->{watch} </code>
| Аналог ''$c->{watch}'' только для этой страницы.
|-
| <code >$pg->{summary}</code>
| Аналог ''$c->{summary}'' только для этой страницы.
|-
| <code >$pg->{history_step}</code>
| Указывает, сколько элементов истории загружать за раз. Значение по умолчанию — 50.
|}
Строка 289 ⟶ 291 :
== Обработка ошибок ==
 
На данный момент все функции, для которых явно не описано возвращаемое значение, возвращают 1 при успехе и undef при ошибке. Можно проверить код ошибки в <code >$c->{error}</code>, но пока ещё не все ошибки модуль обрабатывает должным образом (0 в <code >$c->{error}</code> может означать как успех, так и неизвестную ошибку).
 
Также можно указать callback (указатель на функцию), который будет вызываться при возникновении ошибки; он помещается в <code >$c->{on_error}</code>. Данная функция вызывается без параметров (код ошибки — в <code >$c->{error}</code>).
 
=== Известные ошибки ===
Строка 305 ⟶ 307 :
== Примеры ==
 
Примеры приводятся в порядке «от простого к сложному».
Примечание: все примеры начинаются со строк
use MediaWiki;
my $c = MediaWiki->new();
$c->setup();
 
'''Примечание:''' все примеры начинаются со следующих строк.
=== Простые примеры ===
<source lang="perl">
==== Создание подготовленных страниц ====
use MediaWiki;
<pre>
my $c = MediaWiki->new();
opendir D, "articles";
$c->setup();
while(defined ($file = readdir(D)))
</source>
{
if(($file =~ s/\.txt$//) == 1)
{
my $text;
open F, "$file.txt";
read F, $text, -s F;
close F;
 
=== Создание подготовленных страниц ===
$c->text($file, $text);
<source lang="perl">
}
opendir D, "articles";
}
while (defined ($file = readdir (D))) {
closedir D;
if (($file =~ s/\.txt$//) == 1) {
</pre>
my $text;
open F, "$file.txt";
read F, $text, -s F;
close F;
 
$c->text ($file, $text);
==== Бот автозамен ====
}
<pre>
}
for(my $i = 0; $i < 10000; $i ++)
closedir D;
{
</source>
my $pg = $c->random();
$pg->replace(\&my_replacements);
}
</pre>
 
=== Бот автозамен ===
=== Более сложные примеры ===
<source lang="perl">
for (my $i = 0; $i < 10000; $i++) {
my $pg = $c->random ();
$pg->replace (\&my_replacements);
}
</source>
 
==== Антивандальный бот ====
 
Откатывает «очистку страниц» ({{lang |en|''blanking'' (очистку страниц}) и блокирует того, кто очищает страницы более пяти раз, на срок 1  час. Если это делает единственный автор страницы, то ставит пометку {{tl|db-author}} (но не удаляет статью — возможно, это была ошибка).
 
<source lang="perl">
<pre>
$c->{summary} = "Vandalism: blanking more than 5 times";
 
my %users = ();
my %articles = ();
while (1)
{
my $pg = $c->random ();
if ($pg->content () eq '')
{
my $e = $pg->last_edit;
$blanker = $e->{user};
 
$pg->revert ();
$e = $pg->last_edit;
 
if($e->{user} eq $blanker) { # Only author
$pg->{content} .= "{{db-author}}"; # Delete note for admins
{
$pg->{contentsummary} .= "+ {{db-author}}"; # Delete note for admins
$pg->save ();
$pg->{summary} = "+ {{db-author}}"
} else {
$pg->save();
$users{$blanker}
= 1 + (exists $users{$blanker} ? $users{$blanker} : 0);
else
if ($users{$blanker} > 5) {
$users{c->block($blanker} =, "1 + (exists $users{$blanker} ? $users{$blanker} : 0hour");
if( delete $users{$blanker} > 5);
{
$c->block($blanker, "1 hour");
delete $users{$blanker};
}
}
}
}
}
</pre>
</source>
 
== Ссылки ==
* http://snapshot.debian.org/archive/debian/20120328T101221Z/pool/main/libm/libmediawiki-perl/
* {{cite web|url=http://search.cpan.org/~SPECTRUM/MediaWiki-1.08/|title=Страница модуля на [[CPAN]]|accessdate=28 августа 2006}}
* {{citeCite web | url = http://search.cpan.org/src/~SPECTRUM/MediaWiki-1.08/lib12/ | title =Исходный кодMediaWiki-1.12 версии| author = Черненко Эдуард Павлович | work = search.cpan.org | archiveurl = //web.archive.org/web/20080125200743/http://search.cpan.org/~spectrum/MediaWiki-1.0812/ |accessdate archivedate =28 августа2008-01-25 | deadlink = 2006sure}}
* {{Cite web | url = http://search.cpan.org/src/SPECTRUM/MediaWiki-1.12/lib/MediaWiki.pm | title = MediaWiki.pm | work = Исходный код версии 1.12 | archiveurl = //web.archive.org/web/20080105142922/http://search.cpan.org/src/SPECTRUM/MediaWiki-1.12/lib/MediaWiki.pm | archivedate = 2009-05-01 | deadlink = sure}}
* [http://mediawiki.ru Русское сообщество MediaWiki]
* http://mediawiki.ru/ — русское сообщество MediaWiki.
 
== См. также ==
* [[w:{{Wikipedia-inline |Википедия:Правила применения ботов]]}}
* {{MediaWiki-inline |Manual:Pywikibot}}
* [[meta:Using the python wikipediabot]]{{ref-en}}
 
{{Темы |Программное обеспечение |Справочники}}