После выхода первой статьи о проекте «Дайджест» мы получили много обратной связи — как от пользователей, так и от коллег из продуктового сообщества. В этом посте рассказываем о функциональных обновлениях, которые мы реализовали в последние месяцы. Все они направлены на повышение стабильности, персонализации и удобства взаимодействия с ботом.
Пользовательские чаты: группировка подписок и управление рассылкой
Мы реализовали возможность создания персональных Telegram-чатов, в которые автоматически добавляется бот и получает административные права. Это позволяет пользователю:
создать отдельную группу, например, «новости по работе» или «личные медиа»;
привязать к чату определённые каналы;
получать дайджесты в рамках выбранного чата;
централизованно управлять группой подписок.
Под капотом: чаты создаются через Telethon (CreateChannelRequest
), бот подключается и становится админом (EditAdminRequest
), а управление осуществляется через хендлеры на Aiogram. Вся логика хранения реализована на уровне addchat_id
в таблице users_subscribes
, что позволяет чётко понимать, какие каналы к какому чату относятся.
Round-robin очередь: честная обработка новых подписок
Ранее при высокой нагрузке могло происходить «залипание» — когда у одного активного пользователя десятки новых каналов, и он занимал всё внимание воркеров. Теперь используется round-robin-очередь, в которой сначала обрабатывается по одной подписке от каждого пользователя, затем — по второй и т.д.
Преимущества:
равномерная обработка каналов;
предсказуемое время ожидания;
отсутствие приоритетов на основе объёма.
Технически это реализовано на уровне DAO (AsyncUserSubscribeDAO.get_channels_with_unsent_messages()
), который агрегирует подписки и упорядочивает их по числу необработанных сообщений.
Лемматизация в фильтре дублей: борьба с повторяющимися постами
Одна из частых проблем — дублирование новостей в слегка изменённой форме. Теперь мы добавили семантический анализ и лемматизацию в модуль фильтрации:
Используется модель
spaCy (ru_core_news_sm)
;Все тексты приводятся к базовой форме (леммы);
Учитываются только первые строки;
Применяется коэффициент схожести (
similarity > 0.8
), чтобы выявить смысловые повторы.
Всё это работает в рамках функции check_similar_news
, что позволяет исключать вторичные сообщения и делать дайджест чище. Особенно это актуально для новостных Telegram-каналов, где часто повторяются одни и те же формулировки в течение дня.
Обновление тарифной сетки
Для более прозрачной модели монетизации мы переработали тарифные планы. Теперь структура выглядит так:
Тариф |
Лимит каналов |
Фильтр рекламы |
Фильтр дублей |
Комментарии |
---|---|---|---|---|
Trial |
до 10 |
❌ |
❌ |
Безлимитен по времени, но с ограничениями |
Lite |
до 100 |
✅ |
✅ |
Базовый платный тариф |
Pro |
до 300 |
✅ |
✅ |
Для активных пользователей |
Ultima |
до 500 |
✅ |
✅ |
Максимальный объём |
Что это дало на практике
После релиза описанных функций:
Количество жалоб на дубли снизилось на 47%;
Конверсия в платную подписку выросла на 9.1% у активных пользователей.
Если вы работаете с большим количеством Telegram-каналов — попробуйте обновлённый «Дайджест». Теперь с чётким управлением, фильтрами и гибкой логикой доставки.