Skip to content

An asynchronous bot parser of the Russian quotes portal citaty.info

License

Notifications You must be signed in to change notification settings

Scorpi-ON/citatyinfo_bot

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

citatyinfo_bot

Бот-парсер, упрощающий получение цитат с сайта citaty.info без необходимости переходить на сайт, отрываясь от диалога.

Подробное описание

Изначально проект был разработан как пет-проект с целью освоения создания ботов Telegram и парсинга веб-страниц на языке Python. Впоследствии он многократно преобразовывался: был осуществлён переход с aiogram на pyrogram, с bs4 на selectolax, монолитной архитектуры на модульную, с прямого метода отправки HTTP-запросов на сессионный и асинхронный. До последнего перехода бесперебойная работа запросов поддерживалась через подмену User-Agent, использования Tor и прочих способов обхода блокировок сервера.

Сейчас бот является масштабируемым и подходит для внедрения дополнительных мессенджеров/соцсетей. Реализованный модуль Telegram обеспечивает доступ ко всем возможностям парсера из мессенджера. Поддерживается получение списков сокращённых цитат, из которых можно выбрать нужную для получения полной версии. Цитаты, сгруппированные по основным категориям в шапке сайта, можно получить при помощи соответствующих команд. Также цитаты можно искать по текстовым запросам или ссылкам, скопированным из метаданных полученных до этого цитат. Широко используются инлайн-клавиатуры, есть поддержка инлайн-режима сообщений.

Warning

На данный момент разработка приостановлена в связи с очередным обновлением структуры сайта-донора, перестраивать парсер под которую нет мотивации (во всяком случае в одиночку).

Сценарий использования на примере Telegram

Получение списка цитат известных авторов по команде /author. Список содержит порядковый номер цитат, их основные метаданные (в данном случае автора) и сокращённый текст.



Получение первой цитаты из списка при помощи инлайн-клавиатуры. После нажатия соответствующей кнопки возвращается уже полная версия цитаты, включающая хештеги, оригинал цитаты, и ссылки на эту и другие цитаты данного автора на сайте.



Получение оригинала цитаты нажатием на инлайн-кнопку.



Переключение страницы списка цитат на третью. Список цитат в сообщении обновляется, как и кнопки пагинации.



Получение случайной цитаты командой /random. Помимо автора цитаты, появляются такие метаданные как произведение и цитируемые персонажи. Ссылки на них также присутствуют.



Гиперссылки на метаданные предоставляются для того, чтобы их можно было использовать для «цепного» поиска цитат. На скриншоте изображено получение цитат Агаты Кристи, ссылка на которую была получена сообщением ранее.



Помимо обычных сообщений, бот поддерживает инлайн-режим, который позволяет использовать его в любом диалоге. Для этого нужно ввести никнейм бота через @, после чего указать запрос. Так же, как и в обычном режиме, поддерживаются текстовые запросы, команды и ссылки. На скриншотах изображён пример поиска цитат из фильмов по команде /movie и получение одной из них.



Особенности разработки

  • Поддержка Windows и Linux
  • Модульная архитектура: сущности парсера отделены от логики ботов (которых по этой причине может быть несколько для разных мессенджеров и соцсетей)
  • Высокая скорость работы за счёт асинхронного выполнения веб-запросов и использования самого быстрого парсера из доступных для Python
  • Запросы к сайту-донору выполняются посредством сессии, что обеспечивает защиту от блокировки
  • Запросы к серверам Telegram выполняются по собственному протоколу Telegram MTProto
  • Поддержка парсером всех основных данных цитат, предоставленных сайтом (оригинальный и переведённый текст, метаданные, хештеги, картинки, пояснения и т. д.)
  • Асинхронное ведение логов
  • Покрытие автотестами
  • Создание пользовательских списков цитат и их хранение в базе
  • Кеширование часто используемых или недавно полученных цитат для уменьшения нагрузки на сайт-донор
  • Поддержка групповых чатов
  • Поддержка англоязычной версии сайта и английской локализации

Стек

  • Python — язык программирования
  • Регулярные выражения — распознавание команд и URL-адресов
  • Модуль Lexbor парсера selectolax — парсинг HTML-страниц сайта-донора
  • pyrogram — модуль бота Telegram
  • aiohttp — выполнение запросов к сайту-донору
  • uvloop — более быстрый цикл событий, чем стандартный asyncio
  • TgCrypto — библиотека криптографии Telegram, более быстрая, чем стандартная

Запуск

  1. В директории клонированного репозитория настроить окружение, установив зависимости из requirements.txt командой
pip install -r requirements.txt

Под Windows uvloop не установится, но это не проблема. Все инструменты тестировались на последних версиях с Python 3.11.

  1. Создать в корне проекта файл .env следующего содержания (без фигурных скобок):
API_ID={API ID приложения Telegram (https://my.telegram.org/apps)}
API_HASH={хеш API приложения Telegram (https://my.telegram.org/apps)}
TOKEN={токен Telegram-бота (https://t.me/BotFather)}
TEST_TOKEN={токен тестового Telegram-бота (если планируете использовать тестовый режим)}
  1. Выполнить команду
python -m src.telegram.main

или аналогичную для модуля другого мессенджера/соцсети.