Назад к статьям

Бот поддержки: тикеты и автоответы

Бот поддержки принимает обращения клиентов в Telegram, отвечает по FAQ и при необходимости передаёт диалог оператору. Разбираем, как это устроено и что учесть при заказе или настройке такого бота.

Зачем нужен бот поддержки

Он снижает нагрузку на менеджеров за счёт автоответов на типичные вопросы, собирает заявки в одном месте и даёт возможность обрабатывать обращения по тикетам с назначением ответственного. Для реализации удобно использовать aiogram и Telegram Bot API.

Автоответы и FAQ

В боте задаются типичные вопросы и ответы: «Как оформить заказ?», «Условия доставки» и т.п. По ключевым словам бот отправляет готовый текст или предлагает кнопки с разделами помощи. Так клиент быстро получает ответ без ожидания оператора.

Пример простого FAQ на aiogram: по ключевым словам выбираем ответ из словаря и при отсутствии совпадения предлагаем кнопку «Связаться с оператором».

from aiogram import Bot, Dispatcher, types, F from aiogram.filters import Command from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton FAQ = { "доставка": "Доставка по РФ 2–5 дней. СДЭК, Боксберри, почта.", "оплата": "Оплата: карта, СБП, при получении. Без предоплаты.", "возврат": "Возврат в течение 14 дней. Напишите нам — оформим.", } @dp.message(Command("start")) async def cmd_start(message: types.Message): kb = InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text="Доставка", callback_data="faq:доставка")], [InlineKeyboardButton(text="Оплата", callback_data="faq:оплата")], [InlineKeyboardButton(text="Возврат", callback_data="faq:возврат")], [InlineKeyboardButton(text="Связаться с оператором", callback_data="ticket_new")], ]) await message.answer("Выберите тему или напишите вопрос:", reply_markup=kb) @dp.message(F.text) async def faq_answer(message: types.Message): text = message.text.strip().lower() for key, answer in FAQ.items(): if key in text: await message.answer(answer) return # Повторно показываем кнопки, если ответ не найден kb = InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text="Связаться с оператором", callback_data="ticket_new")], ]) await message.answer("Ответ не найден. Нажмите кнопку ниже.", reply_markup=kb)

В этом примере FAQ — словарь «ключевое слово → ответ». Для совпадения используется проверка key in text; при необходимости можно заменить на более умный поиск или отдельную БД.

Тикеты и передача оператору

Если вопроса нет в базе, пользователь нажимает «Связаться с оператором». Создаётся тикет: диалог привязывается к заявке, можно назначить ответственного и менять статус (открыт, в работе, закрыт). Операторы видят очередь в группе поддержки или админ-панели.

Пример: при нажатии кнопки создаётся запись тикета в БД (db.create_ticket возвращает ticket_id). Когда оператор в группе поддержки отвечает на сообщение пользователя (reply), бот пересылает этот ответ в личку пользователю. get_user_id_from_reply — ваша функция: из пересланного сообщения или из текста (например «User: 123») достаёте user_id.

SUPPORT_CHAT_ID = -1001234567890 # ID группы поддержки (узнать: переслать боту сообщение из группы — см. update) @dp.callback_query(F.data == "ticket_new") async def create_ticket(callback: types.CallbackQuery): ticket_id = db.create_ticket(user_id=callback.from_user.id) # в БД: tickets(id, user_id, status) await callback.message.edit_text( f"Тикет #{ticket_id} создан. Опишите вопрос — оператор ответит здесь." ) await callback.answer() # Пересылка ответа оператора пользователю (оператор отвечает reply на сообщение) @dp.message(F.chat.id == SUPPORT_CHAT_ID, F.reply_to_message) async def forward_reply_to_user(message: types.Message): user_id = get_user_id_from_reply(message) # из reply_to_message.forward_from или из БД по сообщению if user_id: await message.bot.send_message(user_id, message.text)

Что важно при внедрении

  • База знаний — актуальные ответы на частые вопросы, чтобы автоответы не вводили в заблуждение.
  • Эскалация — чёткий момент, когда бот передаёт диалог человеку (по кнопке, по ключевому слову или при отсутствии подходящего ответа).
  • История — сохранение переписки по тикету, чтобы оператор видел контекст.

Итоги

Бот поддержки сочетает автоответы по FAQ и тикетную систему с передачей диалога оператору. Так вы разгружаете менеджеров и при этом не теряете обращения, которые требуют живого общения.