Telegram-бот для генерации лидов в сфере подбора автомобилей с многошаговой формой в WebApp интерфейсе.
Проект состоит из трех основных компонентов:
- Backend: Django REST API для управления лидами
- Frontend: React TypeScript Telegram WebApp с 9-шаговой формой подбора автомобиля
- Telegram Bot: Aiogram-бот, который запускает WebApp
- Django 5.2.7
- Django REST Framework
- Aiogram (Telegram Bot Framework)
- SQLite (разработка) / PostgreSQL (production)
- React 19
- TypeScript
- Vite
- Material-UI (MUI)
- React Hook Form + Zod validation
- @tma.js/sdk-react (Telegram WebApp SDK)
car-selection-bot/
├── backend/
│ ├── config/ # Настройки Django
│ ├── leads/ # Приложение для управления лидами
│ ├── telegram_bot/ # Aiogram бот
│ ├── .env # Переменные окружения Django
│ └── .env.bot # Переменные окружения бота
├── frontend/
│ ├── src/
│ │ ├── components/ # React компоненты
│ │ ├── i18n/ # Переводы
│ │ └── utils/ # Утилиты
│ └── package.json
└── requirements.txt
- Python 3.10+
- Node.js 18+
- Токен Telegram бота (получить у @BotFather)
- Создайте и активируйте виртуальное окружение:
cd backend
python -m venv venv
# На Linux/Mac:
source venv/bin/activate
# На Windows:
venv\Scripts\activate- Установите зависимости:
pip install -r ../requirements.txt- Настройте переменные окружения:
Создайте файл backend/.env:
SECRET_KEY=your-secret-key-here
DEBUG=True
ALLOWED_HOSTS=localhost,127.0.0.1
CORS_ALLOWED_ORIGINS=http://localhost:3000,http://localhost:5173Создайте файл backend/.env.bot:
BOT_TOKEN=your-telegram-bot-token
WEBAPP_URL=http://localhost:5173
ADMIN_CHAT_ID=your-telegram-chat-id
BOT_MODE=polling
API_URL=http://localhost:8000/api/v1- Выполните миграции:
python manage.py migrate- Создайте суперпользователя (опционально, для админ-панели):
python manage.py createsuperuser- Запустите Django сервер:
python manage.py runserver- Запустите Telegram бота (в отдельном терминале):
cd backend
source venv/bin/activate
python -m telegram_bot.main- Установите зависимости:
cd frontend
npm install- Запустите development сервер:
npm run devFrontend будет доступен по адресу http://localhost:5173
Frontend:
cd frontend
npm run build
npm run previewBackend (режим Webhook):
- Установите
BOT_MODE=webhookв.env.bot - Укажите ваш домен в
WEBAPP_URL - Используйте production WSGI сервер (gunicorn, uWSGI)
WebApp проводит пользователя через 9 шагов:
- Марка и модель: Выбор производителя и модели автомобиля
- Цвет кузова: Выбор предпочтительных цветов экстерьера
- Цвет салона: Выбор цвета интерьера
- Опции: Выбор функций (кожаный салон, панорамная крыша и т.д.)
- Бюджет: Установка диапазона цен ($10,000 - $500,000)
- Диапазон лет: Выбор года выпуска (2015-2024)
- Приоритеты: Определение важных факторов (цена, состояние, пробег)
- Заметки: Дополнительные комментарии или требования
- Контактная информация: Имя и телефон
- Уникальные ID: Автогенерируемый формат
LD-YYYYMMDD-XXX - Rate Limiting: 10 заявок в час на пользователя
- Валидация: Комплексная валидация всех полей
- Уведомления админу: Опциональные уведомления в Telegram о новых лидах
Базовый URL: http://localhost:8000/api/v1
Создание лида
POST /leads
Content-Type: application/json
{
"tg_user_id": 123456789,
"contact_name": "Иван Иванов",
"contact_phone": "+79001234567",
"brand": "BMW",
"model": "X5",
"colors": ["Черный", "Белый"],
"interior_color": "Бежевый",
"options": ["Кожаный салон", "Панорамная крыша"],
"budget_min": 30000,
"budget_max": 45000,
"budget_include": ["Налоги", "Регистрация"],
"year_min": 2020,
"year_max": 2024,
"priority": ["price", "condition"],
"notes": "Ищу семейный внедорожник",
"source": "telegram"
}Список лидов
GET /leads?tg_user_id=123456789&limit=10Получение конкретного лида
GET /leads/{lead_uid}Rate limit: 10 запросов в час на X-Telegram-User-Id
# Запуск development сервера
python manage.py runserver
# Создание миграций
python manage.py makemigrations
# Применение миграций
python manage.py migrate
# Создание суперпользователя
python manage.py createsuperuser
# Запуск бота (polling режим)
python -m telegram_bot.main
# Django shell
python manage.py shell# Development сервер
npm run dev
# Production сборка
npm run build
# Предпросмотр production сборки
npm run preview
# Проверка кода
npm run lintОсновные настройки в backend/config/settings.py:
- База данных: SQLite (разработка) или PostgreSQL (production)
- CORS: Настроен для локальной разработки
- Логирование: Консоль + файл
- Middleware: Валидация Telegram WebApp данных
Бот поддерживает два режима (устанавливается в .env.bot):
- Polling: Для разработки (по умолчанию)
- Webhook: Для production развертывания
Использует django-ratelimit с заголовком X-Telegram-User-Id:
- Создание лида: 10 запросов/час на пользователя
Frontend включает поддержку i18n с русскими переводами. Добавить больше языков можно в:
frontend/src/i18n/translations.ts- Используйте хук
useTranslation()в компонентах
Коллекция для тестирования API доступна по адресу:
backend/Leads_API.postman_collection.json
Импортируйте в Postman для тестирования API endpoints.
-
Отсутствующие зависимости в
requirements.txt:python-decoupledjango-ratelimitaiogrampython-dotenv
-
Не настроен автоматизированный набор тестов
-
Генерация Lead UID имеет потенциальные race conditions при высокой нагрузке
-
Frontend имеет захардкоженные тестовые значения для разработки вне Telegram
| Поле | Тип | Описание |
|---|---|---|
| lead_uid | CharField | Уникальный ID (LD-YYYYMMDD-XXX) |
| tg_user_id | BigIntegerField | Telegram user ID |
| contact_name | CharField | Имя пользователя |
| contact_phone | CharField | Номер телефона |
| brand | CharField | Марка автомобиля |
| model | CharField | Модель автомобиля |
| colors | JSONField | Предпочитаемые цвета (массив) |
| interior_color | CharField | Цвет интерьера |
| options | JSONField | Выбранные опции (массив) |
| budget_min | IntegerField | Минимальный бюджет |
| budget_max | IntegerField | Максимальный бюджет |
| budget_include | JSONField | Что включает бюджет (массив) |
| year_min | IntegerField | Минимальный год |
| year_max | IntegerField | Максимальный год |
| priority | JSONField | Факторы приоритета (массив) |
| notes | TextField | Дополнительные заметки |
| source | CharField | Источник лида |
| created_at | DateTimeField | Время создания |
| updated_at | DateTimeField | Время последнего обновления |
Доступ к Django админке: http://localhost:8000/admin после создания суперпользователя.
Возможности:
- Просмотр и управление лидами
- Фильтрация по дате, пользователю, источнику
- Поиск по имени, телефону, марке, модели
Для production развертывания:
- Установите DEBUG=False в настройках Django
- Используйте PostgreSQL вместо SQLite
- Настройте правильные ALLOWED_HOSTS и CORS
- Установите BOT_MODE=webhook для бота
- Используйте HTTPS для WEBAPP_URL
- Настройте логирование и мониторинг
- Используйте переменные окружения для чувствительных данных
- Разверните с gunicorn/uWSGI + Nginx
- Включите connection pooling для базы данных
- Настройте регулярные бэкапы базы данных
- Бот отправляет кнопку WebApp через inline клавиатуру (
telegram_bot/keyboards/inline.py) - Пользователь открывает React WebApp в Telegram
- Пользователь заполняет 9-шаговую форму с валидацией
- Frontend отправляет данные на Django API endpoint
/api/v1/leads(POST) - Бот может уведомить администратора через callback handlers
- Генерация уникального ID: Автогенерируемый формат
LD-YYYYMMDD-XXX(см.leads/models.py:generate_lead_uid) - JSON поля: Использует
JSONFieldвместоArrayFieldдля совместимости SQLite/PostgreSQL - Массивы:
options,priority,budget_includeхранятся как JSON массивы - Валидация: Кастомные валидаторы для бюджета ($10k-$500k), годов (2015-2024), длины строк
- Индексирование: Композитный индекс на
tg_user_id+created_at, плюс индивидуальные индексы
- Frontend использует обертку
utils/telegram.tsвокруг Telegram WebApp SDK - Backend валидирует Telegram init data через middleware
- Навигация использует нативную кнопку "Назад" Telegram
- При отправке формы показывается индикатор прогресса Telegram
backend/.env: Конфигурация Django (SECRET_KEY, DEBUG, ALLOWED_HOSTS, CORS, токен бота)backend/.env.bot: Конфигурация бота, загружается черезtelegram_bot/config.pyBOT_TOKEN: Токен Telegram ботаWEBAPP_URL: URL где размещено React приложениеADMIN_CHAT_ID: Telegram chat ID для уведомлений администратораBOT_MODE: 'polling' или 'webhook'API_URL: Базовый URL Backend API (по умолчанию: http://localhost:8000/api/v1)
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
Для вопросов и проблем создавайте issue в репозитории.