Роботы или боты — это автоматические процессы, которые взаимодействуют с Википедией (и другими проектами Викимедиа) так, как будто они являются редакторами-людьми. На этой странице делается попытка объяснить, как выполнить разработку бота для использования в проектах Викимедиа, и многое из этого можно перенести на другие вики, основанные на MediaWiki. Объяснение ориентировано в основном на тех, у кого есть некоторый опыт программирования, но кто не уверен, как применить эти знания для создания бота Википедии.
Боты могут автоматизировать задачи и выполнять их гораздо быстрее людей. Если у вас есть простая задача, которую нужно выполнить много раз (например, добавить шаблон на все страницы в категории с 1000 страниц), то эта задача лучше подойдет боту, чем человеку.
Часто гораздо проще запросить работу бота у существующего бота. Если у вас есть только периодические запросы или вы не знакомы с программированием, это обычно лучшее решение. Эти запросы можно сделать на Wikipedia:Bot requests . Кроме того, существует ряд инструментов, доступных любому человеку. Большинство из них имеют форму расширенных веб-браузеров со специфичной для MediaWiki функциональностью. Самым популярным из них является AutoWikiBrowser (AWB), браузер, специально разработанный для помощи в редактировании в Wikipedia и других проектах Wikimedia. Почти полный список инструментов можно найти на Wikipedia:Tools/Editing tools . Инструментами, такими как AWB, часто можно управлять, имея лишь небольшое или полное понимание программирования.
Если вы решили, что вам нужен собственный бот из-за частоты или новизны ваших требований, вам не нужно писать его с нуля. В Википедии уже запущено несколько ботов , и многие из этих ботов публикуют свой исходный код, который иногда можно использовать повторно с небольшим дополнительным временем на разработку. Также доступно несколько стандартных фреймворков ботов. Изменение существующего бота или использование фреймворка значительно ускоряет время разработки. Кроме того, поскольку эти кодовые базы широко используются и поддерживаются проектами сообщества, гораздо проще получить ботов, основанных на этих фреймворках, одобренных для использования. Самым популярным и распространенным из этих фреймворков является Pywikibot (PWB), фреймворк бота, написанный на Python . Он тщательно документирован и протестирован, и уже доступно множество стандартизированных скриптов Pywikibot (инструкций для ботов). Другие примеры фреймворков ботов можно найти ниже. Для некоторых из этих фреймворков ботов, таких как PWB, для успешного запуска бота достаточно общего знакомства со скриптами (важно регулярно обновлять эти фреймворки).
Написание нового бота требует значительных навыков программирования. Совершенно новый бот должен пройти существенное тестирование, прежде чем его одобрят для регулярной эксплуатации. Для написания успешного бота решающее значение имеет планирование. Важны следующие соображения:
Как и редактор-человек, бот Википедии читает страницы Википедии и вносит изменения там, где считает нужным. Разница в том, что, хотя боты быстрее и менее подвержены усталости, чем люди, они далеко не так умны, как мы. Боты хороши в повторяющихся задачах, которые имеют легко определяемые шаблоны, где нужно принимать мало решений.
В наиболее типичном случае бот входит в свою учетную запись и запрашивает страницы из Википедии примерно так же, как это делает браузер, — хотя он не отображает страницу на экране, а работает с ней в памяти, — а затем программно проверяет код страницы, чтобы увидеть, нужно ли вносить какие-либо изменения. Затем он вносит и отправляет любые изменения, для которых он был разработан, опять же примерно так же, как это делает браузер.
Поскольку боты получают доступ к страницам так же, как и люди, они могут испытывать те же трудности, что и пользователи-люди. Они могут попасть в конфликты редактирования, иметь тайм-ауты страниц или столкнуться с другими неожиданными сложностями при запросе страниц или внесении изменений. Поскольку объем работы, выполняемой ботом, больше, чем у живого человека, бот с большей вероятностью столкнется с этими проблемами. Таким образом, важно учитывать эти ситуации при написании бота.
Чтобы внести изменения в страницы Википедии, бот обязательно должен извлечь страницы из Википедии и отправить правки обратно. Для этой цели доступно несколько интерфейсов прикладного программирования (API).
api.php
). Эта библиотека была специально написана для того, чтобы позволить автоматизированным процессам, таким как боты, делать запросы и публиковать изменения. Данные возвращаются в формате JSON (подробнее см. в выходных форматах).action=raw
или action=raw&templates=expand
index.php вернет необработанный исходный код wikitext страницы. Например: https://en.wikipedia.org/w/index.php?title=Help:Creating_a_bot&action=raw
. Запрос API с action=query&prop=revisions&rvprop=content
или action=query&prop=revisions&rvprop=content&rvexpandtemplates=1
примерно эквивалентен и позволяет извлекать дополнительную информацию.Некоторые веб-серверы Wikipedia настроены на предоставление запросов на сжатый ( GZIP ) контент. Это можно сделать, включив строку "Accept-Encoding: gzip" в заголовок HTTP-запроса; если заголовок HTTP-ответа содержит "Content-Encoding: gzip", документ находится в форме GZIP, в противном случае он находится в обычной несжатой форме. Обратите внимание, что это относится к веб-серверу, а не к программному обеспечению MediaWiki. Другие сайты, использующие MediaWiki, могут не иметь этой функции. Если вы используете существующую структуру бота, она должна обрабатывать низкоуровневые операции, подобные этой.
Одобренные боты должны войти в систему, чтобы вносить изменения. Хотя бот может делать запросы на чтение без входа в систему, боты, которые завершили тестирование, должны входить в систему для всех действий. Боты, вошедшие в систему с учетной записью с флагом бота, могут получать больше результатов на запрос из API MediaWiki (api.php). Большинство фреймворков ботов должны автоматически обрабатывать вход в систему и файлы cookie, но если вы не используете существующий фреймворк, вам нужно будет выполнить следующие шаги.
Для безопасности данные для входа должны передаваться с использованием метода HTTP POST . Поскольку параметры запросов HTTP GET легко видны в URL, входы через GET отключены.
Для регистрации бота с использованием API MediaWiki необходимы два запроса:
Запрос 1 — это GET-запрос на получение токена входа.
https://en.wikipedia.org/w/api.php?action=query&meta=tokens&type=login&format=json
Запрос 2 – это POST для завершения входа
https://en.wikipedia.org/w/api.php?action=login&format=json
lgname=BOTUSERNAME
lgpassword=BOTPASSWORD
lgtoken=TOKEN
где TOKEN — это токен из предыдущего результата. HTTP-куки из предыдущего запроса также должны быть переданы со вторым запросом.
Успешная попытка входа приведет к тому, что сервер Wikimedia установит несколько HTTP-cookie . Бот должен сохранять эти cookie-файлы и отправлять их обратно каждый раз, когда он делает запрос (это особенно важно для редактирования). В английской Википедии следует использовать следующие cookie-файлы: enwikiUserID , enwikiToken и enwikiUserName . Файл cookie enwiki_session необходим для фактической отправки правки или фиксации какого-либо изменения, в противном случае будет возвращено сообщение об ошибке MediaWiki:Session fail preview .
Вход в основной аккаунт через "action=login" устарел и может перестать работать без предупреждения. Чтобы продолжить вход с "action=login", см. Special:BotPasswords .
Wikipedia использует систему токенов редактирования для внесения изменений в страницы Wikipedia, а также для других операций, которые изменяют существующий контент, например, откат. Токен выглядит как длинное шестнадцатеричное число, за которым следует '+\', например:
Роль токенов редактирования заключается в предотвращении «перехвата редактирования», когда пользователей обманным путем заставляют вносить изменения, нажимая на одну ссылку.
Процесс редактирования включает два HTTP-запроса. Сначала необходимо сделать запрос на получение токена редактирования. Затем необходимо сделать второй HTTP-запрос, который отправляет новое содержимое страницы вместе с только что полученным токеном редактирования. Невозможно выполнить редактирование в одном HTTP-запросе. Токен редактирования остается неизменным в течение сеанса входа в систему, поэтому токен редактирования необходимо получить только один раз, и его можно использовать для всех последующих правок.
Чтобы получить токен редактирования, выполните следующие действия:
action=query
meta=tokens
Токен будет возвращен в csrftoken
атрибуте ответа.
URL будет выглядеть примерно так:https://en.wikipedia.org/w/api.php?action=query&meta=tokens&format=json
Если токен редактирования, который получает бот, не содержит шестнадцатеричной строки ( т. е . токен редактирования — это просто '+\'), то бот, скорее всего, не вошел в систему. Это может быть вызвано рядом факторов: сбой аутентификации на сервере, разрыв соединения, истечение времени ожидания или ошибка при сохранении или возврате правильных файлов cookie. Если это не из-за ошибки программирования, просто войдите в систему снова, чтобы обновить файлы cookie входа. Боты должны использовать утверждение, чтобы убедиться, что они вошли в систему.
Конфликты редактирования возникают, когда на одной странице предпринимаются множественные, перекрывающиеся попытки редактирования. Почти каждый бот рано или поздно попадает в конфликт редактирования того или иного рода и должен включать в себя некий механизм для проверки и решения этих проблем.
Боты, использующие API Mediawiki (api.php), должны извлекать токен редактирования вместе с starttimestamp
и последней «базовой» временной меткой ревизии перед загрузкой текста страницы при подготовке к редактированию; prop=info|revisions
может использоваться для извлечения как токена, так и содержимого страницы в одном запросе ( пример ). При отправке правки установите starttimestamp
атрибуты basetimestamp
и и проверьте ответы сервера на наличие ошибок. Для получения дополнительных сведений см. MediaWiki:API:Edit - Создание и редактирование страниц.
В общем, если редактирование не удалось завершить, бот должен снова проверить страницу, прежде чем пытаться внести новое редактирование, чтобы убедиться, что редактирование все еще уместно. Кроме того, если бот перепроверяет страницу, чтобы повторно отправить изменение, он должен быть осторожен, чтобы избегать любого поведения, которое может привести к бесконечному циклу, и любого поведения, которое может даже напоминать войну правок .
На самом деле, кодирование или написание бота — это только часть разработки бота. Как правило, вам следует следовать циклу разработки, указанному ниже, чтобы убедиться, что ваш бот следует политике Википедии в отношении ботов . Несоблюдение политики может привести к тому, что ваш бот не будет одобрен или ему будет запрещено редактировать Википедию.
Реализация (или кодирование) подразумевает превращение дизайна и планирования в код. Это может быть наиболее очевидной частью работы по программной инженерии, но не обязательно самой большой. На этапе реализации вам следует:
Хороший способ протестировать вашего бота в процессе разработки — заставить его показывать изменения (если таковые имеются), которые он мог бы внести в страницу, а не редактировать живую вики. Некоторые фреймворки ботов (например, pywikibot) имеют предварительно закодированные методы для показа различий. В процессе одобрения боту, скорее всего, будет предоставлен испытательный срок (обычно с ограничением по количеству правок или дней, в течение которых он должен работать), в течение которого он может фактически редактировать, чтобы обеспечить тонкую настройку и устранить любые ошибки. По окончании испытательного срока, если все прошло по плану, бот должен получить одобрение на полномасштабную работу.
Важной (и часто упускаемой из виду) задачей является документирование внутреннего дизайна вашего бота с целью его будущего обслуживания и улучшения. Это особенно важно, если вы собираетесь разрешить клонирование вашего бота. В идеале вы должны разместить исходный код вашего бота на его странице пользователя или в системе контроля версий (см. #Боты с открытым исходным кодом), если вы хотите, чтобы другие могли запускать его клоны. Этот код должен быть хорошо документирован (обычно с использованием комментариев) для простоты использования.
Вы должны быть готовы отвечать на вопросы или возражения относительно вашего бота на странице обсуждения пользователя, особенно если он работает в потенциально деликатной области, например, в области добросовестного использования изображений .
Поддержание и улучшение вашего бота для того, чтобы он справлялся с недавно обнаруженными ошибками или новыми требованиями, может занять гораздо больше времени, чем первоначальная разработка программного обеспечения. Чтобы облегчить поддержание, документируйте свой код с самого начала.
Существенные изменения функциональности одобренных ботов должны быть одобрены .
В дополнение к официальной политике в отношении ботов, которая охватывает основные моменты, которые следует учитывать при разработке бота, существует ряд более общих рекомендаций, которые следует учитывать при разработке бота.
Если ваш бот делает что-то, что требует суждения или оценки контекста (например, исправление орфографии), то вам следует подумать о том, чтобы сделать своего бота ручным, что означает, что человек проверяет все правки перед их сохранением. Это значительно снижает скорость бота, но также значительно снижает количество ошибок.
Вы должны иметь возможность легко и быстро отключить своего бота. Если ваш бот сломается, вы несете ответственность за уборку после него! Вы можете заставить бота отказаться запускаться, если на его странице обсуждения было оставлено сообщение, предполагая, что сообщение может быть жалобой на его действия; это можно проверить с помощью meta=userinfo
запроса API ( пример ). Или вы можете создать страницу, которая будет отключать бота при изменении; это можно проверить, загрузив содержимое страницы перед каждым редактированием.
Так же, как и человек, если ваш бот вносит изменения в страницу обсуждения в Википедии, он должен подписать свой пост четырьмя тильдами (~~~~). Подписи принадлежат только пространствам имен обсуждения, за исключением страниц проектов, используемых для обсуждения (например, статьи для удаления ).
Правки бота будут видны в Special:RecentChanges , если только они не настроены на указание бота. После того, как бот был одобрен и получил разрешение на использование флага бота, можно добавить "bot=True" к вызову API - см. mw:API:Edit#Parameters , чтобы скрыть правки бота в Special:RecentChanges . В Python, используя mwclient или wikitools, а затем добавив bot=True к команде edit/save, можно установить редактирование как редактирование бота - например PageObject.edit(text=pagetext, bot=True, summary=pagesummary)
.
Если бот полностью автоматизирован и выполняет регулярные правки, вам следует периодически проверять, работает ли он так, как указано, и не было ли его поведение изменено изменениями программного обеспечения. Рассмотрите возможность добавления его в Wikipedia:Bot activity monitor, чтобы получать уведомления, если бот перестанет работать.
Многие операторы ботов предпочитают сделать свой код открытым, и иногда это может потребоваться перед одобрением для особенно сложных ботов. Открытие исходного кода имеет несколько преимуществ:
Открытый исходный код, хотя и редко требуется, обычно поощряется в соответствии с открытой и прозрачной природой Википедии.
Прежде чем делиться кодом, убедитесь, что конфиденциальная информация, такая как пароли, сохранена в файле, который не будет опубликован.
Для пользователей, желающих сделать свой код открытым, доступно множество вариантов. Размещение кода на подстранице пользовательского пространства бота может быть хлопотным в обслуживании, если не автоматизировано, и приводит к тому, что код становится многолицензируемым в соответствии с условиями лицензирования Википедии в дополнение к любым другим условиям, которые вы можете указать. Лучшим решением является использование системы контроля версий , такой как SVN , Git или Mercurial . В Википедии есть статьи, сравнивающие различные варианты программного обеспечения , и веб-сайты для размещения кода , многие из которых бесплатны.
Боты могут быть написаны практически на любом языке программирования. Выбор языка зависит от опыта и предпочтений автора ботов, а также от доступности библиотек, относящихся к разработке ботов. Следующий список включает некоторые языки, обычно используемые для ботов:
GNU Awk — простой язык для ботов любого размера, включая OAuth.
Если он расположен на веб-сервере, вы можете запустить свою программу и взаимодействовать с ней во время ее работы через Common Gateway Interface из вашего браузера. Если ваш интернет-провайдер предоставляет вам веб-пространство, велики шансы, что у вас есть доступ к сборке Perl на веб-сервере, с которой вы можете запускать свои программы Perl.
Библиотеки:
PHP также можно использовать для программирования ботов. Разработчики MediaWiki уже знакомы с PHP, так как это язык, на котором написаны MediaWiki и его расширения. PHP особенно хорош, если вы хотите предоставить своему боту интерфейс на основе веб-форм. Например, предположим, что вы хотите создать бота для переименования категорий. Вы можете создать HTML-форму, в которую вы будете вводить текущие и желаемые названия категории. Когда форма будет отправлена, ваш бот сможет прочитать эти входные данные, затем отредактировать все статьи в текущей категории и переместить их в желаемую категорию. (Очевидно, что любой бот с интерфейсом на основе форм должен быть каким-то образом защищен от случайных веб-серферов.)
Таблица функций PHP-ботов может дать некоторое представление о возможностях основных фреймворков ботов.
Библиотеки:
Microsoft .NET — это набор языков, включающий C# , C++/CLI , Visual Basic .NET , J# , JScript .NET , IronPython и Windows PowerShell . Используя Mono Project , программы .NET могут также работать на Linux , Unix , BSD , Solaris и macOS , а также под Windows .
Библиотеки:
Библиотеки:
Библиотеки:
Библиотеки:
VBScript — это язык сценариев , основанный на языке программирования Visual Basic . Для VBScript не опубликованы фреймворки ботов, но некоторые примеры ботов, которые его используют, можно увидеть ниже: