Skip to content

Repository files navigation

Бот для автоматической публикации избранных статей Википедии в телеграм-канале

Go to english description

НОВОЕ! Теперь также есть многоязычный бот для получения случайных избранных статей или статей по ссылке/заголовку: https://t.me/wikifeatbot. Его код хранится в файлах папки bot.

Ссылка на канал с публикациями: https://t.me/wikifeat.

Далее Вы можете прочитать как запустить данный проект для публикаций в Вашем собственном канале, а также узнать какой дополнительный (опциональный) функционал предоставляется проектом (мультиязычность, получение случайной избранной статьи, возможность работы с конкретной статьёй, поддержка ссылок из web.archive.org, кэширование статей в датабазу для переиспользования).

Используемые библиотеки и технологии

Проект использует сторонние библиотеки и программное обеспечение с открытым исходным кодом. Все права на указанные компоненты принадлежат их соответствующим авторам и правообладателям.

Библиотеки:

  • requests — Apache 2.0 License
  • Pillow — HPND License / PIL Software License
  • asyncpg — Apache 2.0 License
  • python-telegram-bot — LGPLv3 License
  • beautifulsoup4 — MIT License
  • bs4 — MIT License
  • aiohttp — Apache 2.0 License

Технологии:

  • PostgreSQL — PostgreSQL License

Полные тексты лицензий доступны в репозиториях соответствующих библиотек и на официальных сайтах используемого программного обеспечения.

Условия использования кода

Помимо условий лицензии MIT, настоятельно прошу при первом портировании, копировании, клонировании или форке моего проекта заменить значение переменной User-Agent в файле config.pyуказав собственное название проекта и ссылку.

Например, если Ваш никнейм на GitHub это NickName и Вы сделали форк, то как вариант Вы можете указать:

User_Agent = 'wikifeat_fork_by_NickName/0.0 (https://github.com/NickName/wikifeat)'

Использование собственного User-Agent позволит избежать путаницы у волонтёров Wikimedia между Вашим проектом и моим.

В случае если это правило будет нарушаться(т.е. не только я буду использовать свой User_Agent) и со стороны сообщества ко мне возникнут претензии, то мне придётся изменить и согласовать с волонтёрами Wikimedia новый User-Agent, а также скрыть его от публики — по аналогии с тем как сейчас скрыт токен, дающий доступ к управлению телеграм-ботом(т.е. через переменную окружения).

Подобный User-Agent я использую согласно требованиям Wikimedia Foundation User-Agent Policy, без его указания в заголовке не получится запрашивать страницы напрямую с сайтов проектов Wikimedia. В файле utils.py уже есть готовая функция get_request, которая автоматически подставляет User-Agent из config.py в параметры заголовка.

Первый запуск

Сперва создайте аккаунт телеграм-бота с помощью https://t.me/BotFather.

Пусть Ваш никнейм на GitHub это NickName и Вы сделали форк моего проекта, тогда:

  1. Скачайте проект из своего форка или выполните клонирование:
    git clone https://github.com/NickName/wikifeat.git
  2. Создайте и активируйте виртуальное окружение, затем установите зависимости проекта:
    pip install -r requirements.txt
  3. Замените значение переменной User-Agent в файле config.py как указано выше:
    User_Agent = 'wikifeat_fork_by_NickName/0.0 (https://github.com/NickName/wikifeat)'
  4. Создайте локальную таблицу wikifeat для пользователя postgres и переменную окружения с названием POSTGRES_DB_PASSWORD с паролем для этого пользователя (держите пароль в тайне от других!).
  5. Создайте переменную окружения с названием WIKIFEATTOKEN и токеном доступа к своему телеграм-боту в качестве значения (важно хранить данный токен в тайне от всех других!). После этого может понадобиться перезагрузка консоли или даже устройства.
  6. В файле script.py заполните поля:
    • TELEGRAM_CHANNELS: буквенные(для публичных) или цифровые(для приватных) ID каналов или чатов, в которые Ваш телеграм-бот добавлен в качестве администратора;
    • RULES_URL: ссылка на правила данного телеграм-канала, у меня CC BY-SA на любой опубликованный ботом текст, потому что такова лицензия текста на Википедии;
    • LANG_CODE: код языка по стандарту ISO 639-1 (ru, en, и т.д.), во избежание сложности поддержки кода и различных способов парсинга автор проекта готов поддерживать только те языки, на которых уже написано хотя бы 500 избранных статей.
    • WIKI_URL: здесь можно указать "Шаблон:Текущая избранная статья" или "Wikipedia:Today's featured article", в целом несложно добавить поддержку шаблона на произвольном языке, главное правильно отделить блок с избранной статьёй от всего остального. Также можно указать:
      • заглавную страницу в явном виде ("Заглавная страница", "Main Page", "Wikipédia:Accueil principal", ...), но не рекомендуется, так как они могут отображать более старые данные, чем указанные ранее шаблоны (при отсутствии авторизованного входа в аккаунт на Википедии, например, через режим инкогнито);
      • на данный момент поддерживаются такие значения заглавной страницы: "Заглавная страница, Main Page, Wikipédia:Accueil principal, Wikipedia:Hauptseite, Wikipedia:Portada, Pagina principale, Wikipédia:Página_principal, Wikipedia:Strona główna".
      • вместо записи вручную можно сразу использовать TRANSLATIONS[lang_code][x] из файла i18n.py, где x это TKey.MAIN_PAGE или TKey.TODAY_TEMPLATE или TKey.RANDOM_FEATURED_PAGE.
      • случайную избранную страницу, указав TRANSLATIONS[lang_code][TKey.RANDOM_FEATURED_PAGE].
      • произвольную страницу для единичного теста, например, "У омута" (статью можно указывать на любом языке);
      • ссылку можно ввести полноценно, например, https://ru.wikipedia.org/wiki/Заглавная_страница или https://ru.wikipedia.org/wiki/У_омута; также поддерживаются и правильно обрабатываются ссылки с веб-архива, можно указать https://web.archive.org/web/20211122/https://ru.wikipedia.org/wiki/Заглавная_страница и Вы получите статью избранную (примерно) 22 ноября 2021.
    • остальные параметры можно не менять.
  7. Запустите:
    python script.py

После этого в Вашем канале должен появиться пост в соответствии с выбранной ссылкой. Название заголовка опубликованной статьи сохраняется в файл, чтобы не публиковать одно и то же подряд при повторном запуске. Конечно можно было бы использовать базу данных вместо файла, но для моих нужд в этом пока нет необходимости.

Автоматизация запусков

Данный скрипт может использоваться даже на обычном компьютере и перезапускаться автоматически даже после перезагрузки устройства, далее описывается как это сделать.

Заметка: скрипт для автозапуска временно скрывает ваши локальные изменения в репозитории (на время выполнения скрипта), но затем возвращает их обратно, в этот момент лучше не редактировать код или отключить временно автозапуск.

Windows

Откройте планировщик задач (Win + R > taskschd.msc), нажмите "Создать задачу...", напишите название задачи, добавьте триггер (у меня: "однократно", повторять "каждый час", в течение "бесконечно") и действие (запуск файла script.vbs, обязательно укажите рабочую директорию(репозиторий на вашем локальном диске, например, C:...\wikifeat), иначе задача не сможет выполниться корректно; script.vbs запускается максимально незаметно для пользователя, так что ничем не мешает), проверьте условия и параметры.

Linux / macOS

Для автоматизации работы можно использовать cron — стандартный планировщик задач в UNIX-системах.
Рекомендуется использовать вспомогательный скрипт script.sh, который обновляет проект и кратковременно запускает бота в фоне.

  1. Убедитесь, что проект работает вручную:

    ./script.sh

    Если всё запускается корректно, переходите к настройке cron.

  2. Сделайте файл script.sh исполняемым:

    chmod +x script.sh
  3. Откройте планировщик заданий:

    crontab -e
  4. Добавьте строку для автоматического запуска.
    Например, чтобы бот запускался каждый час:

    0 * * * * /home/username/wikifeat/script.sh >/dev/null 2>&1

    Здесь:

    • /home/username/wikifeat/ — путь к вашему проекту;
    • >/dev/null 2>&1 — полное подавление вывода (бот работает тихо, без уведомлений и терминала, аналогично script.vbs под Windows).
  5. Проверьте, что задача добавлена:

    crontab -l
  6. Чтобы убедиться, что всё работает, можно проверить логи:

    tail -n 20 /home/username/wikifeat/tmp/log.txt

English description

NEW! There is now also a multilanguage bot for getting random featured articles or articles by link/title: https://t.me/wikifeatbot. You can read it's code in files from bot directory.

My telegram channel with featured articles (at Russian) is https://t.me/wikifeat and I use a Telegram bot to automate publications.

Below you can read how to run this project for publishing in your own channel, as well as learn about the additional (optional) features provided by the project (multilingual support, random featured article support, the ability to work with a specific article, and support for links from web.archive.org, caching articles in the database for fast repeated delivery).

Used Libraries and Technologies

This project uses third-party open-source libraries and software. All rights to these components belong to their respective authors and copyright holders.

Libraries:

  • requests — Apache 2.0 License
  • Pillow — HPND License / PIL Software License
  • asyncpg — Apache 2.0 License
  • python-telegram-bot — LGPLv3 License
  • beautifulsoup4 — MIT License
  • bs4 — MIT License
  • aiohttp — Apache 2.0 License

Technologies:

  • PostgreSQL — PostgreSQL License

Full license texts are available in the respective repositories of the libraries and on the official websites of the used software.

Usage Terms

In addition to the MIT License Terms, please replace the User-Agent value in config.py when first porting, copying, cloning, or forking this project. Specify your project name and link.

E.g. if your GitHub username is NickName and you forked the project:

User_Agent = 'wikifeat_fork_by_NickName/0.0 (https://github.com/NickName/wikifeat)'

Using your own User-Agent helps avoid confusion for Wikimedia volunteers between your project and mine.

If this rule is violated (i.e., others use my User-Agent), I may need to change and coordinate a new User-Agent with Wikimedia and hide it — similar to how the Telegram bot token is kept secret via an environment variable.

This User-Agent is required by the Wikimedia Foundation User-Agent Policy. Without it, direct page requests to Wikimedia projects will fail.

The utils.py file contains a ready-made get_request function that automatically inserts the User-Agent from config.py into request headers.

First Launch

First of all create telegram bot account with https://t.me/BotFather.

Assuming your GitHub username is NickName and you forked the project:

  1. Clone your fork:
    git clone https://github.com/NickName/wikifeat.git
  2. Create and activate a virtual environment, then install dependencies:
    pip install -r requirements.txt
  3. Set the User-Agent in config.py as described above:
    User_Agent = 'wikifeat_fork_by_NickName/0.0 (https://github.com/NickName/wikifeat)'
  4. Create a local database named wikifeat for the user postgres and set an environment variable called POSTGRES_DB_PASSWORD containing the password for this user (keep it secret!).
  5. Create an environment variable WIKIFEATTOKEN with your Telegram bot token (keep it secret!). After that you may need to reboot the shell or the OS.
  6. Fill in the fields in script.py:
    • TELEGRAM_CHANNELS: letters (for public) or numbers (for private) IDs of channels or chats in which your Telegram bot is added as an administrator;
    • RULES_URL: link to your channel’s rules. Don't forget about CC BY-SA, matching Wikipedia text licensing.
    • LANG_CODE: language code according to the ISO 639-1 standard (ru, en, etc.). To avoid the complexity of code maintenance and various parsing methods, the project author is ready to support only those languages in which at least 500 selected articles have already been written;
    • WIKI_URL: you can specify "Шаблон:Текущая избранная статья" or "Wikipedia:Today's featured article". In general, it is not difficult to add support for templates in any language — the main task is to correctly extract the featured article block from the rest of the page. You can also specify:
      • the main page explicitly ("Заглавная страница" or "Main Page"), but this is not recommended, as it may display older data than the templates mentioned above (for example, when not logged into a Wikipedia account, such as in incognito mode);
      • currently supported values for the main page are: "Заглавная страница, Main Page, Wikipédia:Accueil principal, Wikipedia:Hauptseite, Wikipedia:Portada, Pagina principale, Wikipédia:Página_principal, Wikipedia:Strona główna".
      • you can use TRANSLATIONS[lang_code][x], where x is TKey.MAIN_PAGE or TKey.TODAY_TEMPLATE or TKey.RANDOM_FEATURED_PAGE from the i18n.py file instead of specifying it manually;
      • a random featured article with using TRANSLATIONS[lang_code][TKey.RANDOM_FEATURED_PAGE];
      • an arbitrary page for a single test, for example "Anthony Roll" (the article can be specified in any language);
      • a full URL, for example https://en.wikipedia.org/wiki/Main_Page or https://en.wikipedia.org/wiki/Anthony_Roll; web archive links are also supported and processed correctly. For example, http://web.archive.org/web/20110317042632/http://en.wikipedia.org/wiki/Main_Page will return the article featured (approximately) on that date;
    • other parameters can be left unchanged.
  7. Run it:
    python script.py

After this, a post with article corresponding to the selected link should appear in your channel. The title of this article is saved in a file .txt to prevent the same post from being published repeatedly when the script is run again. Of course, it would be possible to use database instead of a file, but for my needs this is not yet necessary.

Automation

This script can run on an ordinary computer and be restarted automatically even after a device reboot. Below are instructions for each system.

Note: script for autorun temporarily stashes your local repository changes while it runs and restores them afterward. To avoid conflicts, do not edit the code during this process, or temporarily disable autorun.

Windows

Open Task Scheduler (Win + R → taskschd.msc), click "Create Task…", give it a name, add a trigger (for example:
"One time", repeat "Every hour", for "Indefinitely") and an action (run script.vbs).

Make sure to set the "Start in" (working directory) to the local repository folder (for example, C:\...\wikifeat), otherwise the task may not run correctly.

script.vbs launches script.bat completely silently, so it does not interfere with the user. Review all conditions and settings to ensure the task runs reliably.

Linux / macOS

For automation, use cron, the standard UNIX task scheduler. It is recommended to use the helper script script.sh which updates the project and briefly runs the bot in the background.

  1. Make sure the project works manually:

    ./script.sh

    If everything runs correctly, proceed to cron setup.

  2. Make the script executable:

    chmod +x script.sh
  3. Open the cron editor:

    crontab -e
  4. Add a line for automatic execution. For example, to run the bot every hour:

    0 * * * * /home/username/wikifeat/script.sh >/dev/null 2>&1

    Where:

    • /home/username/wikifeat/ — path to your project
    • >/dev/null 2>&1 — completely suppresses output (the bot runs silently, similar to script.vbs on Windows)
  5. Verify the cron job:

    crontab -l
  6. To check that it works, inspect the logs:

    tail -n 20 /home/username/wikifeat/tmp/log.txt

About

A multilanguage bot for publishing featured Wikipedia articles to a Telegram chat/user/channel

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages