Skip to content

saggda/travelBot

Repository files navigation

Travel Bot - Telegram бот для турагента

Telegram бот для туроператора, который помогает клиентам выбирать страны, получает информацию через AI и собирает заявки.

🎯 Основной функционал

Для клиентов:

  • 🌍 Просмотр доступных стран с описанием и ценами
  • 📞 Заказ обратного звонка
  • ❓ Справочная информация о туризме (визы, погода, транспорт)
  • ✅ Создание заявок на подбор тура

Для админа:

  • 📋 Просмотр всех заявок через команду /show
  • 🔧 Управление AI промптом (/showprompt, /editprompt)
  • 📊 Получение уведомлений о новых заявках

📁 Структура проекта

travelBot/
├── bot.py                 # Основной файл бота (handlers)
├── ai.py                  # Интеграция с Perplexity AI
├── supabase_client.py     # Работа с Supabase (БД)
├── flows.py               # Управление состояниями и тексты
├── keyboards.py           # Клавиатуры (inline и reply)
├── .env                   # Токены и ключи
├── requirements.txt       # Зависимости
└── README.md             # Этот файл

🚀 Установка и запуск

1. Установка зависимостей

pip install -r requirements.txt

2. Настройка переменных окружения (.env)

BOT_TOKEN=your_telegram_bot_token
SUPABASE_URL=your_supabase_url
SUPABASE_ANON_KEY=your_supabase_anon_key
PERPLEXITY_API_KEY=your_perplexity_api_key
ADMINS=123456789,987654321  # ID админов через запятую

3. Создание таблиц в Supabase

Таблица countries

CREATE TABLE countries (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    flag TEXT,
    description TEXT,
    price_from TEXT,
    visa_info TEXT,
    is_active BOOLEAN DEFAULT true,
    created_at TIMESTAMP DEFAULT NOW()
);

Таблица leads

CREATE TABLE leads (
    id SERIAL PRIMARY KEY,
    telegram_id BIGINT,
    name TEXT,
    phone TEXT,
    country_id INTEGER REFERENCES countries(id),
    message TEXT,
    clarification TEXT,
    created_at TIMESTAMP DEFAULT NOW()
);

Таблица settings

CREATE TABLE settings (
    id SERIAL PRIMARY KEY,
    ai_prompt TEXT
);

INSERT INTO settings (id, ai_prompt) VALUES (1, '...');

4. Запуск бота

python3 bot.py

Или в фоновом режиме:

nohup python3 bot.py > bot.log 2>&1 &

🔄 Как это работает

User Flow (Путь клиента):

1. /start → Главное меню
   ├─ 🔍 Подобрать тур → Список стран
   │   ├─ Выбор страны → Карточка страны
   │   │   ├─ ✅ Хочу сюда! → Ввод телефона → Имя → Пожелания → Создание заявки
   │   │   ├─ ❓ Узнать подробнее → AI отвечает об стране → Кнопки работают
   │   │   └─ 🔙 Назад → Возврат к списку
   │   └─ Пагинация (страницы со странами)
   │
   ├─ 🌍 Страны → То же что "Подобрать тур"
   │
   ├─ 📞 Перезвоните мне → Ввод телефона → Имя → Создание заявки
   │
   └─ ❓ Вопрос → Вопрос AI → Ответ (только про туризму) → Главное меню

Admin Commands:

  • /show - Показать все заявки (только админы)
  • /admin - Последние 10 заявок
  • /showprompt - Показать текущий AI промпт
  • /editprompt Текст - Изменить AI промпт

🤖 AI Интеграция (Perplexity)

Роль AI в боте:

  1. Справка по туризму (ask_question)

    • Отвечает на вопросы про визы, погоду, транспорт
    • temperature=0.0 для строгости
    • Отказывается от подбора туров и нетуристических вопросов
  2. Информация о странах (get_country_info)

    • Рассказывает о стране (погода, виза, достопримечательности)
    • Отвечает одним абзацем без заголовков

Конвертация форматирования:

AI использует Markdown (**жирный**), бот конвертирует в HTML (<b>жирный</b>):

def _clean_answer(text: str) -> str:
    # Убирает [1], [2] ссылки
    # Конвертирует ** → <b>
    # Конвертирует * → <i>

🗄️ Работа с базой данных (Supabase)

Прямые HTTP запросы через httpx.AsyncClient:

# Создание лида
await sc.create_lead(
    telegram_id=user_id,
    name="Иван",
    phone="+79001234567",
    country_id=1,
    message="Хочу на море в июле"
)

# Получение стран
countries = await sc.get_countries()

# Добавление уточнения
await sc.add_clarification(lead_id, "2 человека, без детей")

🛡️ Защита от дублей и ошибок

Проблемы, которые были решены:

  1. Дублирование заявок

    • Флаг lead_created устанавливается СРАЗУ после проверки
    • Кнопки удаляются мгновенно при клике
    • Проверка флага идёт в начале callback handler
  2. Callback timeout

    • Увеличен timeout до 30 секунд для AI запросов
    • Try-except на все edit_text() и edit_reply_markup()
    • Если edit не удался → отправляем новое сообщение
  3. Порядок handlers

    • Сначала точное совпадение F.data == "countries_list"
    • Потом startswith("countries_") для пагинации

State Machine (Машина состояний):

class State:
    MENU = "menu"                      # Главное меню
    WAITING_PHONE = "waiting_phone"    # Ожидание телефона
    WAITING_NAME = "waiting_name"      # Ожидание имени
    WAITING_WISHES = "waiting_wishes"  # Ожидание пожеланий
    WAITING_QUESTION = "waiting_question"  # Вопрос AI
    WAITING_CLARIFICATION = "waiting_clarification"  # Уточнения
    WAITING_CONFIRM = "waiting_confirm" # Подтверждение

📊 Админка

Просмотр заявок:

Команда /show показывает:

  • ID заявки
  • Имя и телефон клиента
  • Страну (с флагом)
  • Пожелания
  • Уточнения (если есть)
  • Дату и время создания

Форматирование:

━━━━━━━━━━━━━━━━━━
🔹 Заявка #123
👤 Иван Иванов | 📞 +79001234567
🌍 🇹🇷 Турция
💭 Хочу на все включенно в июле
✏️ Уточнение: 2 человека, 1 ребёнок 7 лет
📅 2026-01-27 12:30

Управление AI промптом:

  • /showprompt - показать текущий промпт
  • /editprompt Новый текст промпта - изменить

Промпт хранится в Supabase (settings.ai_prompt), можно менять на лету без перезапуска бота.

🐛 Известные ограничения

  1. In-memory хранилище состояний

    • При перезапуске бота состояния пользователей теряются
    • Решение: подключить Redis для хранения сессий
  2. AI может ошибаться

    • Иногда даёт неточную информацию
    • Решение: добавить vetifier или обновить данные
  3. Нет валидации ввода

    • Телефон проверяется только Telegram
    • Имя и пожелания - любой текст
    • Решение: добавить базовую валидацию

💡 Идеи для развития

Priority 1 (Важно):

  • История заявок для админа - фильтрация, поиск, экспорт в CSV
  • Уведомления в канал - отправлять новые заявки в Telegram канал
  • Изменение статуса заявки - "новая", "в работе", "закрыта"
  • Комментарии к заявкам - админ может оставлять заметки
  • Аналитика - статистика по странам, конверсия

Priority 2 (Полезно):

  • Умная сортировка стран - по цене, популярности, сезону
  • Избранное - пользователь может сохранять страны
  • История запросов - показывать предыдущие вопросы пользователя
  • Рассылка - отправить спецпредложения всем пользователям
  • QR-коды - генерация QR для контакта турфирмы
  • Фотогалерея - показать несколько фото страны

Priority 3 (Круто):

  • Voice сообщения - пользователь может голосом задать вопрос
  • Геолокация - показать ближайший офис фирмы
  • Калькулятор тура - примерный расчёт стоимости
  • Интеграция с CRM - отправка заявки в AmoCRM, Bitrix
  • Планировщик поездки - AI составляет маршрут по дням
  • Мультиязычность - поддержка английского, узбекского и т.д.

Priority 4 (Эксперименты):

  • WebApp версия - мини-сайт внутри Telegram
  • Payment integration - оплата тура прямо в боте
  • AI-фото - генерация фото через Midjourney/DALL-E
  • Новости - автоматический парсинг новостей о туризме
  • Карточки туров - конкретные туры с датами и ценами
  • Chat with agent - переключение на живого оператора

📝 Текущий статус

Работает:

  • Выбор стран с пагинацией
  • Создание заявок (с защитой от дублей)
  • AI справка (строго по туризму)
  • Админ команды (/show, /admin, /showprompt, /editprompt)
  • Кнопка "Назад" работает корректно
  • Обработка callback timeout

🔄 В процессе:

  • Оптимизация промптов AI
  • Тестирование нагрузок

🐛 Баги:

  • Нет критических багов на данный момент

🔑 Безопасность

  1. Admin check - все админ команды проверяют user_id in ADMINS
  2. SQL injection - не применимо (Supabase REST API)
  3. Rate limiting - можно добавить для защиты от спама
  4. Sanitization - AI ответы очищаются от HTML тегов (кроме разрешённых)

📞 Контакты и поддержка

Для вопросов и предложений:


Дата создания: Январь 2026 Версия: 1.0.0 Статус: Production Ready ✅

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors