Перенос и развитие аукционного бота с Python/Telegram на Laravel + MAX
Проект представлял собой перенос существующей аукционной системы из Python Telegram-бота в новую backend-архитектуру на Laravel с интеграцией мессенджера MAX. Задача заключалась не просто в переписывании команд, а в сохранении бизнес-логики аукционов, ставок, пользователей, администрирования и интеграции с 1С.
В рамках проекта была спроектирована и реализована Laravel-часть системы: модели лотов, пользователей и ставок, загрузка лотов из 1С через API, обработка ZIP-архива с описанием аукциона и изображениями, публикация лотов в канал MAX, интерактивные кнопки для ставок, проверка доступа пользователей и административные команды.
Дополнительно была разработана отдельная веб-панель управления, которая дублирует и расширяет возможности администрирования через команды. Панель позволяет удобно управлять лотами, пользователями, ставками и статусами аукционов, просматривать статистику, выполнять действия вроде бана, разбанов, отмены и завершения аукционов через графический интерфейс, что значительно упрощает работу администратора по сравнению с использованием чат-команд.
Для приёма данных из 1С был реализован endpoint загрузки лотов: проверка токена, распаковка архива, чтение JSON-описания, сохранение изображений, генерация короткого публичного идентификатора лота, валидация цены, шага ставки и времени завершения. После импорта лот либо ставится в очередь на публикацию, либо готовится к немедленному запуску.
Отдельный блок работ был связан с механикой ставок. Были перенесены правила из старой Python-системы: проверка активности пользователя, бана, подписки на канал, факта старта бота, запрет повторной ставки текущим лидером, запрет участия после отмены ставки и ограничение для пользователей с неоплаченными выигранными лотами. Для защиты от гонок при одновременных ставках использовались транзакции и блокировки на уровне БД. После успешной ставки система обновляет сообщение аукциона, отправляет пользователю личное подтверждение, уведомляет предыдущего лидера и ставит отложенную задачу завершения аукциона.
Также была реализована логика отмены ставки: пользователь получает личное сообщение с кнопкой отмены, подтверждает действие, после чего ставка отменяется, предыдущий участник снова становится лидером, обновляется сообщение в канале и пересоздаётся таймер завершения.
Для завершения аукциона используется очередь Laravel. Задача завершения идемпотентна: при запуске она проверяет, что ставка всё ещё актуальна и не была перебита или отменена. После завершения лот переводится в финальный статус, сохраняются данные победителя, обновляется клавиатура сообщения в канале и отправляется уведомление победителю.
Отдельно была перенесена администраторская часть старого Python-бота. В MAX-чате администратора реализованы команды статистики, просмотра лотов и пользователей, разбанов, амнистии, отметки оплаты, напоминаний победителям, отмены аукциона, ручного завершения и бана победителя. Для этого были добавлены отдельные обработчики команд и callback-кнопок, сервис рендера админских карточек и отдельные job-и для критичных действий.
Важной частью проекта стало аккуратное разделение ответственности: сервисы для сообщений, уведомлений, проверки доступа, админских карточек, фоновые задачи для завершения/отмены/бана, модели Laravel с нужными связями и computed-методами. Это позволило не просто перенести старую функциональность, а сделать её более поддерживаемой и предсказуемой.
Стек: Laravel, PHP, PostgreSQL, Laravel Queue, Docker, MAX Bot API, интеграция с 1С, JSON/ZIP-import, транзакции БД, фоновые задачи, webhook-обработчики, inline callback-кнопки, админские команды.
Для решения задачи был выполнен перенос существующей аукционной логики из Python Telegram-бота в новую систему на Laravel с интеграцией мессенджера MAX. Работа началась с анализа старого проекта: были изучены сценарии загрузки лотов, публикации аукционов, обработки ставок, завершения торгов, отмены ставок, уведомлений пользователей и администраторских действий.
На стороне Laravel была спроектирована новая структура данных: модели лотов, пользователей и ставок, связи между ними, статусы аукционов, признаки оплаты, отправки, бана, активности пользователя и дополнительные данные для ограничений участия. Отдельно была реализована загрузка лотов из 1С через API: endpoint принимает ZIP-архив, проверяет токен, распаковывает данные, читает JSON-описание аукциона, сохраняет изображения, валидирует параметры лота и подготавливает его к публикации.
Для публикации лотов была реализована интеграция с MAX Bot API. Система отправляет лот в канал, прикрепляет изображение, формирует текст аукциона и добавляет inline-кнопки для ставок и проверки оставшегося времени. Для каждого лота сохраняются идентификаторы сообщения и чата, чтобы в дальнейшем обновлять опубликованную карточку аукциона.
Отдельный блок работ был посвящён механике ставок. Были перенесены бизнес-правила из старого Python-бота: проверка подписки на канал, факта старта бота, активности пользователя, бана, запрета повторной ставки текущим лидером, ограничения после отмены ставки и блокировки пользователей с неоплаченными выигранными лотами. Для защиты от одновременных нажатий и гонок при ставках использовались транзакции и блокировки на уровне базы данных. Это позволило гарантировать корректное повышение цены и наличие только одного актуального лидера аукциона.
После успешной ставки система обновляет сообщение аукциона в канале, отправляет пользователю личное подтверждение с кнопкой отмены, уведомляет предыдущего лидера о перебитой ставке и создаёт отложенную задачу завершения торгов. Если пользователь отменяет свою ставку, система проверяет, что ставка ещё актуальна, отменяет её, возвращает предыдущего участника в статус лидера, обновляет сообщение в канале и пересоздаёт таймер завершения.
Для завершения аукциона была реализована очередь Laravel. Задача завершения сделана идемпотентной: при запуске она проверяет, что ставка всё ещё является последней и не была отменена или перебита. После завершения система фиксирует победителя, меняет статус лота, обновляет кнопку в сообщении канала и отправляет победителю личное уведомление.
Также была перенесена администраторская часть старого бота. В MAX-чате администратора реализованы команды для просмотра статистики, активных и неоплаченных лотов, забаненных пользователей, карточек лотов и пользователей. Добавлены действия для отметки оплаты, отправки, напоминания победителю, ручного завершения аукциона, отмены аукциона, бана и разбана пользователей, а также массовой амнистии. Критичные действия вынесены в отдельные job-и и выполняются с учётом транзакций и текущего состояния лота.
Дополнительно была разработана веб-панель управления на Laravel. Она позволяет администратору управлять лотами, пользователями, ставками и статусами аукционов через графический интерфейс, дублируя и расширяя возможности чат-команд.
В результате старая логика Python-бота была перенесена в более структурированную Laravel-архитектуру: с отдельными сервисами для сообщений, уведомлений, проверки доступа, админских карточек, очередями для фоновых задач и более надёжной обработкой ставок и статусов аукциона
В результате была получена рабочая аукционная система на Laravel с интеграцией MAX, которая уже применяется на практике для проведения реальных аукционов. Система используется для загрузки и публикации большого количества лотов, управления торгами, обработки ставок, уведомления участников и администрирования аукционов.
На практике администраторы загружают лоты из 1С через подготовленный API. Система принимает архив с описанием аукциона и изображениями, обрабатывает данные, сохраняет лот и подготавливает его к публикации. Часть лотов публикуется сразу, часть ставится в очередь на отложенную публикацию. Это позволяет заранее загружать большое количество аукционов и автоматически выводить их в канал в нужное время без ручной публикации каждого лота.
Опубликованные лоты отображаются в канале MAX с описанием, изображением и интерактивными кнопками. Участники могут делать ставки прямо из интерфейса мессенджера. После каждой ставки система обновляет текущую цену, фиксирует нового лидера, уведомляет предыдущего участника, отправляет подтверждение новому лидеру и пересчитывает время до завершения аукциона. Это позволяет вести торги без ручного участия администратора.
Отложенные задачи Laravel Queue используются для автоматического запуска и завершения аукционов. Система сама проверяет актуальность последней ставки, завершает торги в нужный момент, фиксирует победителя и отправляет ему уведомление. Благодаря идемпотентной обработке задач старые или неактуальные задания не ломают процесс: если ставка была перебита или отменена, такая задача просто не выполняет лишних действий.
Администраторы используют веб-панель и команды в админском чате MAX для повседневного управления системой. Через них можно просматривать статистику, список активных и завершённых лотов, неоплаченные аукционы, карточки пользователей, выполнять разбан, амнистию, отмену аукциона, ручное завершение, отметку оплаты и отправки, а также отправлять напоминания победителям. Это сокращает количество ручных операций и позволяет управлять аукционами как из панели, так и прямо из мессенджера.
Результатом стала более структурированная и надёжная система по сравнению со старым Python-ботом. Бизнес-логика ставок и администрирования сохранена, но перенесена в Laravel-архитектуру с моделями, сервисами, транзакциями, очередями и отдельными обработчиками webhook-событий. Система рассчитана на регулярное использование: загрузку множества лотов, планирование публикаций, проведение торгов, фиксацию победителей и дальнейшую обработку оплаты и статусов.
На практике решение позволяет организовать полный цикл онлайн-аукциона: импорт лотов из 1С, автоматическую публикацию, приём ставок, завершение торгов, уведомление участников и дальнейшее администрирование результатов.