Бот-парсер, упрощающий получение цитат с сайта citaty.info без необходимости переходить на сайт, отрываясь от диалога.
Изначально проект был разработан как пет-проект с целью освоения создания ботов Telegram и парсинга веб-страниц на языке Python. Впоследствии он многократно преобразовывался: был осуществлён переход с aiogram на pyrogram, с bs4 на selectolax, монолитной архитектуры на модульную, с прямого метода отправки HTTP-запросов на сессионный и асинхронный. До последнего перехода бесперебойная работа запросов поддерживалась через подмену User-Agent, использования Tor и прочих способов обхода блокировок сервера.
Сейчас бот является масштабируемым и подходит для внедрения дополнительных мессенджеров/соцсетей. Реализованный модуль Telegram обеспечивает доступ ко всем возможностям парсера из мессенджера. Поддерживается получение списков сокращённых цитат, из которых можно выбрать нужную для получения полной версии. Цитаты, сгруппированные по основным категориям в шапке сайта, можно получить при помощи соответствующих команд. Также цитаты можно искать по текстовым запросам или ссылкам, скопированным из метаданных полученных до этого цитат. Широко используются инлайн-клавиатуры, есть поддержка инлайн-режима сообщений.
Warning
На данный момент разработка приостановлена в связи с очередным обновлением структуры сайта-донора, перестраивать парсер под которую нет мотивации (во всяком случае в одиночку).
Получение списка цитат известных авторов по команде /author. Список содержит порядковый номер цитат, их основные метаданные (в данном случае автора) и сокращённый текст.
![](https://private-user-images.githubusercontent.com/60984445/353544575-ebefec5c-c72f-4edc-b8ff-1933b0379c79.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjYxMDA3OTcsIm5iZiI6MTcyNjEwMDQ5NywicGF0aCI6Ii82MDk4NDQ0NS8zNTM1NDQ1NzUtZWJlZmVjNWMtYzcyZi00ZWRjLWI4ZmYtMTkzM2IwMzc5Yzc5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA5MTIlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwOTEyVDAwMjEzN1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTVlNjQ3ZTk3YzYyZmQyY2Q3NzM1MjcwN2ZjNDlhYjg0NDlhMjIyMGZmODE4MTIwMWUwZDA2MmVlY2JiNGFlODQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.fod43sUImohBRVZF8tSfFDrhtjW4pd5zTpdiv0_cmvU)
Получение первой цитаты из списка при помощи инлайн-клавиатуры. После нажатия соответствующей кнопки возвращается уже полная версия цитаты, включающая хештеги, оригинал цитаты, и ссылки на эту и другие цитаты данного автора на сайте.
![](https://private-user-images.githubusercontent.com/60984445/353544619-2898bf17-5211-4bb7-9247-6b172fe08ca4.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjYxMDA3OTcsIm5iZiI6MTcyNjEwMDQ5NywicGF0aCI6Ii82MDk4NDQ0NS8zNTM1NDQ2MTktMjg5OGJmMTctNTIxMS00YmI3LTkyNDctNmIxNzJmZTA4Y2E0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA5MTIlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwOTEyVDAwMjEzN1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTIxM2NiZWZiMGY2M2FjMjY2OTM0NDYzYTlkNmJhYWY3YTc0YTQyZDI2YzEwMjhjMmM2MjI5ODgzNDExZjY3ZmUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.iVcYC3fezkI966e7RwpKGpRBhRmIvFyoe-uTe140j90)
![](https://private-user-images.githubusercontent.com/60984445/353544639-3f763cf0-f4d9-4275-b6c4-21444c6a4d30.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjYxMDA3OTcsIm5iZiI6MTcyNjEwMDQ5NywicGF0aCI6Ii82MDk4NDQ0NS8zNTM1NDQ2MzktM2Y3NjNjZjAtZjRkOS00Mjc1LWI2YzQtMjE0NDRjNmE0ZDMwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA5MTIlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwOTEyVDAwMjEzN1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWY1ZTdiNTYxYWU0OTNlNWEwYzczMGYxZjViNjczNGU3ODliN2NmZDg3ZWU5ZWU4MTRjZDRjMjMyMTBjMjU4MDAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.vpIn3EvpMH7qiEFiwoTCnp-QKkcuAyaM5zXg7GlADgQ)
Получение оригинала цитаты нажатием на инлайн-кнопку.
![](https://private-user-images.githubusercontent.com/60984445/353553434-a39fd1f8-bc9a-4a98-bae2-a348390b6b99.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjYxMDA3OTcsIm5iZiI6MTcyNjEwMDQ5NywicGF0aCI6Ii82MDk4NDQ0NS8zNTM1NTM0MzQtYTM5ZmQxZjgtYmM5YS00YTk4LWJhZTItYTM0ODM5MGI2Yjk5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA5MTIlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwOTEyVDAwMjEzN1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWE1NWI0YWVkODgwOWI2MDA5Y2E3MTI1YWE4Y2RhZGEyY2Q1MGY4N2FjMmQ4ZWViYzU5YmYwNmI3OGVjM2UwNzImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.zc-Ar9CLaY0qYJZIweJAD7VqtrCBnSyJSZG_RI_mRWY)
Переключение страницы списка цитат на третью. Список цитат в сообщении обновляется, как и кнопки пагинации.
![](https://private-user-images.githubusercontent.com/60984445/353553631-8f1d51fa-222d-429f-8544-953561a8a336.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjYxMDA3OTcsIm5iZiI6MTcyNjEwMDQ5NywicGF0aCI6Ii82MDk4NDQ0NS8zNTM1NTM2MzEtOGYxZDUxZmEtMjIyZC00MjlmLTg1NDQtOTUzNTYxYThhMzM2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA5MTIlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwOTEyVDAwMjEzN1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWY4NDIyYWIzNTIwZTg3YzNlMDY3MGZlMDk4N2U5NjE0MzhmYTYwNjkyYjQ4ODVjOTk2NzNmNzU1NGI0OGI5YjQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.Cudq9dOwIsg7zzsO6jh_6RZOPnL1AHcc0RObQzmAUXg)
Получение случайной цитаты командой /random. Помимо автора цитаты, появляются такие метаданные как произведение и цитируемые персонажи. Ссылки на них также присутствуют.
![](https://private-user-images.githubusercontent.com/60984445/353553983-e1b74176-9804-4510-9cb4-0e41ce5ed96a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjYxMDA3OTcsIm5iZiI6MTcyNjEwMDQ5NywicGF0aCI6Ii82MDk4NDQ0NS8zNTM1NTM5ODMtZTFiNzQxNzYtOTgwNC00NTEwLTljYjQtMGU0MWNlNWVkOTZhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA5MTIlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwOTEyVDAwMjEzN1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTZkN2FlYTIwZjhmZjQ4NDdmMWQzNGQyNDljYjQ0Mjc0NjhkY2VmMWJjYjAwNWU4ZjkxMjA1ZmE2YmFmYzk1MmUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.UwH1Le1zLwLqocixdkiF2VcCJDouls9-yhOLkaRVdtw)
Гиперссылки на метаданные предоставляются для того, чтобы их можно было использовать для «цепного» поиска цитат. На скриншоте изображено получение цитат Агаты Кристи, ссылка на которую была получена сообщением ранее.
![](https://private-user-images.githubusercontent.com/60984445/353554876-2fea2653-2530-43d4-9f32-cdc451dbe122.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjYxMDA3OTcsIm5iZiI6MTcyNjEwMDQ5NywicGF0aCI6Ii82MDk4NDQ0NS8zNTM1NTQ4NzYtMmZlYTI2NTMtMjUzMC00M2Q0LTlmMzItY2RjNDUxZGJlMTIyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA5MTIlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwOTEyVDAwMjEzN1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTFkYzBjMThkMjM3MGQzOTZlOGM3M2EzYTU5NGRlYWU5YjViYjRkYmFlYTQ2MzU2YjMyZmRjYmQ2NDk2YWEzNWQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.JSmpqb6w2C53h_AnI_ocsyQmv-qcK9aA83klA6JrSIU)
Помимо обычных сообщений, бот поддерживает инлайн-режим, который позволяет использовать его в любом диалоге. Для этого нужно ввести никнейм бота через @, после чего указать запрос. Так же, как и в обычном режиме, поддерживаются текстовые запросы, команды и ссылки. На скриншотах изображён пример поиска цитат из фильмов по команде /movie и получение одной из них.
![](https://private-user-images.githubusercontent.com/60984445/353556023-96793f03-d272-4a7f-ac3c-048bd65dbad8.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjYxMDA3OTcsIm5iZiI6MTcyNjEwMDQ5NywicGF0aCI6Ii82MDk4NDQ0NS8zNTM1NTYwMjMtOTY3OTNmMDMtZDI3Mi00YTdmLWFjM2MtMDQ4YmQ2NWRiYWQ4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA5MTIlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwOTEyVDAwMjEzN1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTVhNmI5MWFjMWM1ZGQyOGMyYmZmYjYwZjJlNDQzOTY1MzA1ZWU4MTg1YTU4NmQ2MDU3NzI3ODU1NTMwNzY0MTEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.78__hP2SKoCtVjW07kC5m5Jr-59pDri_VeIfinwLdDo)
![](https://private-user-images.githubusercontent.com/60984445/353556047-a8051489-7513-408a-8588-d0f8c0cfa007.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjYxMDA3OTcsIm5iZiI6MTcyNjEwMDQ5NywicGF0aCI6Ii82MDk4NDQ0NS8zNTM1NTYwNDctYTgwNTE0ODktNzUxMy00MDhhLTg1ODgtZDBmOGMwY2ZhMDA3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA5MTIlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwOTEyVDAwMjEzN1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWE5YzhiZDE4ZWM4NWFmYjJjYmE4M2NiMjJjMjgzNDU4OTIzOWQyMTdlYTkzZTFlOGU2OWJkYTA0M2JlZmI4ZWYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.1hqiLveh30Vq_Qx8H6JLDvBbX1ni5myN-WAfTFXC67M)
- Поддержка Windows и Linux
- Модульная архитектура: сущности парсера отделены от логики ботов (которых по этой причине может быть несколько для разных мессенджеров и соцсетей)
- Высокая скорость работы за счёт асинхронного выполнения веб-запросов и использования самого быстрого парсера из доступных для Python
- Запросы к сайту-донору выполняются посредством сессии, что обеспечивает защиту от блокировки
- Запросы к серверам Telegram выполняются по собственному протоколу Telegram MTProto
- Поддержка парсером всех основных данных цитат, предоставленных сайтом (оригинальный и переведённый текст, метаданные, хештеги, картинки, пояснения и т. д.)
- Асинхронное ведение логов
- Покрытие автотестами
- Создание пользовательских списков цитат и их хранение в базе
- Кеширование часто используемых или недавно полученных цитат для уменьшения нагрузки на сайт-донор
- Поддержка групповых чатов
- Поддержка англоязычной версии сайта и английской локализации
- Python — язык программирования
- Регулярные выражения — распознавание команд и URL-адресов
- Модуль Lexbor парсера selectolax — парсинг HTML-страниц сайта-донора
- pyrogram — модуль бота Telegram
- aiohttp — выполнение запросов к сайту-донору
- uvloop — более быстрый цикл событий, чем стандартный asyncio
- TgCrypto — библиотека криптографии Telegram, более быстрая, чем стандартная
- В директории клонированного репозитория настроить окружение, установив зависимости из
requirements.txt
командой
pip install -r requirements.txt
Под Windows uvloop не установится, но это не проблема. Все инструменты тестировались на последних версиях с Python 3.11.
- Создать в корне проекта файл
.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-бота (если планируете использовать тестовый режим)}
- Выполнить команду
python -m src.telegram.main
или аналогичную для модуля другого мессенджера/соцсети.