AutoGift
Высоконагруженный сервис на базе Telegram-бота, который в автоматическом режиме скупает новые коллекционные Telegram-подарки (Telegram Gifts) в момент их выхода. Особенность ниши в том, что лимитированные подарки распродаются за считанные секунды после релиза, поэтому ключевая ценность продукта заключается в скорости реакции и способности мгновенно совершать покупки сразу для всей базы подписчиков по индивидуальным правилам каждого. Продукт включает в себя самого бота с платежной логикой на Telegram Stars, многоуровневую реферальную программу, интеграцию с криптокошельком TON и административную веб-панель.
Задача
Бизнес-задача звучала просто, но технически была крайне нетривиальной: дать пользователю возможность один раз настроить бюджет и ценовой коридор, а дальше система должна сама, без участия пользователя, выкупать каждый новый подарок в первые секунды его появления.
Основные требования:
- Реакция на появление нового подарка в пределах секунд, а не минут, поскольку дефицитные позиции исчезают почти мгновенно.
- Одновременное исполнение покупок для всех активных пользователей при одном релизе, с учетом персонального ценового коридора и текущего баланса каждого.
- Прием платежей в Telegram Stars напрямую внутри бота, с удержанием сервисной комиссии и моментальным зачислением.
- Реферальная программа для органического роста аудитории.
- Полная локализация на русский и английский языки.
- Отказоустойчивость: сбой обработки одного пользователя не должен останавливать обработку остальных.
Решение
Спроектирован сервис как единое ASP.NET Core приложение, в котором сосуществуют четыре независимых контура: Telegram-бот, фоновый планировщик автопокупки, платежный модуль и административная панель. Такой моноблок при правильном разделении ответственности дал минимальные задержки между обнаружением подарка и исполнением сделки, поскольку вся логика работает в одном процессе без сетевых накладных расходов между сервисами.
Ядром продукта стал контур автопокупки на базе планировщика Quartz с двумя независимыми циклами: быстрый цикл с интервалом в 5 секунд отвечает за обнаружение новых подарков и исполнение покупок, медленный минутный цикл агрегирует метрики и обслуживает кэш состояния. Каждое задание помечено атрибутом запрета параллельного запуска, что исключает гонки и двойные списания при затянувшемся цикле.
Пользователь управляет всем через диалог с ботом: задает нижнюю и верхнюю границу цены подарка, включает или выключает автопокупку одним переключателем, пополняет баланс и приглашает друзей. Вся настройка происходит через inline-клавиатуры с пошаговым вводом, состояние диалога хранится по идентификаторам ожидаемых полей, что позволяет вести несколько сценариев ввода без потери контекста.
Платежный модуль принимает Telegram Stars через нативные инвойсы Telegram, удерживает сервисную комиссию 5 процентов и моментально зачисляет средства на внутренний баланс пользователя с мгновенным уведомлением. Реферальная программа реализована двухуровневой, с начислением процента от пополнений приглашенных.
Архитектура и сложности
Минимизация задержки. Самый сложный инженерный вызов состоял в том, чтобы между моментом появления подарка и моментом покупки проходило минимальное время. Горячий путь вынесен в отдельный 5-секундный цикл планировщика, изолированный от веб-нагрузки и платежных операций, чтобы пиковая активность в админке или массовые пополнения не влияли на скорость скупки.
Производительность доступа к данным. В проекте применен гибридный подход к работе с СУБД. Entity Framework Core используется для управления схемой и автоматических миграций при старте приложения, а в горячем пути запросов применяется linq2db, который генерирует компактный SQL без накладных расходов на трекинг сущностей. Это критично, когда на одном релизе нужно за доли секунды прочитать настройки и балансы всей активной базы и провести списания. Соединение с базой открывается и закрывается под конкретную операцию, что исключает утечки пула при высокой частоте обращений.
Отказоустойчивость. Каждая итерация фоновых заданий и каждый обработчик бота обернуты в изолированную обработку ошибок с централизованным логированием. Сбой на одном пользователе не прерывает обработку остальных, а проблемная операция фиксируется в логах без остановки всего цикла.
Самодостаточная инфраструктура. Реализован собственный тонкий слой маршрутизации поверх Minimal API с единым форматом ответа и автоматической сериализацией, а также механизм самостоятельной регистрации эндпоинтов через рефлексию: контроллеры подключаются автоматически при старте без ручной проводки. Это сократило шаблонный код и ускорило добавление новых ручек. Авторизация в админке построена на собственном атрибуте и middleware с шифрованием токена и кэшированием пользователя в сессии.
Локализация по месту. Двуязычность реализована через легковесный механизм словарей с ленивой регистрацией ключей прямо в коде, где строка нужна. Это убрало необходимость во внешних файлах ресурсов и позволило вести оба языка в одном месте.
Безопасность. Пароли хранятся в виде соли и хэша, токены сессий шифруются, регистрация в админке защищена капчей hCaptcha, предусмотрено восстановление доступа по email через одноразовую ссылку. Реальные платежи и баланс отделены от веб-контура.
Результат
- Запущен полностью рабочий коммерческий сервис, который в автоматическом режиме скупает новые Telegram-подарки в первые секунды после релиза без участия пользователя.
- Достигнута реакция на появление подарка в пределах 5-секундного цикла с параллельным исполнением покупок сразу для всей активной базы при одном релизе.
- Реализован замкнутый денежный контур: пополнение в Telegram Stars, удержание комиссии, моментальное зачисление, двухуровневая реферальная программа и таблица лидеров для удержания аудитории.
- Гибридная схема работы с данными обеспечила высокую пропускную способность горячего пути при сохранении удобства миграций и эволюции схемы.
- Автоматические миграции при старте сделали выкатку новых версий бесшовной, без ручных операций с базой.
- Архитектура с изоляцией контуров и отказоустойчивой обработкой ошибок обеспечила стабильную работу планировщика под нагрузкой и устойчивость к точечным сбоям.
- Полная двуязычная локализация открыла продукт для русско- и англоязычной аудитории одновременно.
Стек
Платформа и язык: C#, .NET 8, ASP.NET Core, Razor Pages, Minimal API.
Фоновые задачи: Quartz.NET (изолированные циклы 5 секунд и 1 минута, запрет параллельного исполнения).
Данные: SQL Server, Entity Framework Core (схема и миграции), linq2db (высокопроизводительный доступ в горячем пути).
Реальное время: SignalR с протоколом MessagePack.
Интеграции: Telegram Bot API, платежи Telegram Stars, криптокошелек TON, MailKit и MimeKit для email, SMS-шлюз, HtmlAgilityPack для парсинга.
Безопасность: хэширование паролей с солью, шифрование токенов (Rijndael256), капча hCaptcha, собственная авторизация на атрибутах и middleware.
