Заказать бота

Бот-автоответчик для ВК: настройка, цена внедрения и запуск под ключ

Как настроить бота-автоответчика для сообщества ВКонтакте: ключевые слова, расписание, антиспам и передача заявок менеджеру. Когда выбрать готовый шаблон, а когда разработку под ключ.

Содержание статьи

Бот-автоответчик для ВКонтакте — быстрый способ не терять обращения в сообщениях сообщества. Пользователь пишет «цена», «доставка», «как заказать» и сразу получает понятный ответ без ожидания менеджера.

В этом материале ты соберёшь рабочего бота на Python: с ключевыми словами, ночным режимом, защитой от спама и логикой «не повторять один и тот же ответ каждые 5 секунд».

Что получим в итоге

Бот будет:

  • отвечать на популярные вопросы по ключевым словам;
  • отправлять разный текст для «цена / прайс», «доставка», «контакты»;
  • работать по расписанию (день/ночь);
  • передавать сложные вопросы менеджеру;
  • не спамить одинаковыми ответами одному пользователю.

Подготовка

Установи зависимости:

pip install vkbottle python-dotenv

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

vk-autoreply-bot/
├─ .env
├─ .gitignore
└─ bot.py

Содержимое .env:

VK_TOKEN=vk1.a.xxxxx
VK_GROUP_ID=123456789

В .gitignore добавь:

.env
.venv
__pycache__/

Шаг 1. Базовый каркас бота

import os
from datetime import datetime, time
from dotenv import load_dotenv
from vkbottle.bot import Bot, Message
load_dotenv()
TOKEN = os.environ["VK_TOKEN"]
bot = Bot(token=TOKEN)
@bot.on.message()
async def ping(message: Message):
    await message.answer("Бот работает ✅")
if __name__ == "__main__":
    bot.run_forever()

Проверь запуск:

python bot.py

Если в личке сообщества бот отвечает — идём дальше.

Шаг 2. Добавляем словарь ключевых слов

Теперь заменим универсальный ответ на реальные сценарии. Используем словарь, где каждому намерению соответствует набор слов и шаблон ответа.

FAQ_RULES = {
    "price": {
        "keywords": ["цена", "прайс", "стоимость", "сколько стоит"],
        "answer": (
            "💰 Актуальные тарифы:\n"
            "• Старт — 4 900 ₽\n"
            "• Бизнес — 12 900 ₽\n"
            "• Индивидуально — по ТЗ\n\n"
            "Напишите «заказать», и я передам заявку менеджеру."
        ),
    },
    "delivery": {
        "keywords": ["доставка", "срок", "когда", "как быстро"],
        "answer": (
            "⏱ Срок запуска:\n"
            "• Простой автоответчик: 1 день\n"
            "• Бот с меню и воронкой: 3–5 дней\n"
            "• Сложная интеграция: от 7 дней"
        ),
    },
    "contacts": {
        "keywords": ["контакты", "телефон", "связь", "менеджер"],
        "answer": (
            "📞 Связаться с менеджером:\n"
            "• ЛС сообщества\n"
            "• Email: hello@vkbotpro.ru\n"
            "• Ответ в рабочее время: до 15 минут"
        ),
    },
}

Функция определения подходящего ответа:

def find_faq_answer(text: str) -> str | None:
    lowered = text.lower().strip()
    for rule in FAQ_RULES.values():
        if any(keyword in lowered for keyword in rule["keywords"]):
            return rule["answer"]
    return None

Шаг 3. Добавляем расписание (день/ночь)

Ночью обычно лучше не обещать быстрый ответ менеджера. Сделаем отдельное сообщение.

WORK_START = time(9, 0)
WORK_END = time(21, 0)
def is_work_time(now: datetime | None = None) -> bool:
    now = now or datetime.now()
    return WORK_START <= now.time() <= WORK_END
def after_hours_message() -> str:
    return (
        "🌙 Сейчас нерабочее время (09:00–21:00 МСК).\n"
        "Я сохранил ваше сообщение — менеджер ответит утром."
    )

Шаг 4. Антиспам: не повторяем ответ слишком часто

Без этого пользователь может отправить 10 одинаковых сообщений и получить 10 одинаковых ответов.

from time import time as ts
COOLDOWN_SECONDS = 20
last_answer_at: dict[int, float] = {}
def can_answer(user_id: int) -> bool:
    now = ts()
    last = last_answer_at.get(user_id, 0)
    if now - last < COOLDOWN_SECONDS:
        return False
    last_answer_at[user_id] = now
    return True

Шаг 5. Финальная версия обработчика

@bot.on.message()
async def autoreply(message: Message):
    if not message.text:
        return
    user_id = message.from_id or 0
    text = message.text
    if not can_answer(user_id):
        return
    answer = find_faq_answer(text)
    if not is_work_time():
        # Ночью сначала предупреждаем о режиме работы
        await message.answer(after_hours_message())
        if answer:
            await message.answer(answer)
        return
    if answer:
        await message.answer(answer)
        return
    if "заказать" in text.lower():
        await message.answer(
            "✅ Отлично! Напишите, пожалуйста:\n"
            "1) Нишу\n2) Что бот должен делать\n3) Дедлайн\n\n"
            "Я передам заявку менеджеру."
        )
        return
    await message.answer(
        "Я пока не понял запрос 🤔\n"
        "Попробуйте: «цена», «доставка», «контакты» или «заказать»."
    )

Готовый файл bot.py

import os
from datetime import datetime, time
from time import time as ts
from dotenv import load_dotenv
from vkbottle.bot import Bot, Message
load_dotenv()
TOKEN = os.environ["VK_TOKEN"]
bot = Bot(token=TOKEN)
FAQ_RULES = {
    "price": {
        "keywords": ["цена", "прайс", "стоимость", "сколько стоит"],
        "answer": (
            "💰 Актуальные тарифы:\n"
            "• Старт — 4 900 ₽\n"
            "• Бизнес — 12 900 ₽\n"
            "• Индивидуально — по ТЗ\n\n"
            "Напишите «заказать», и я передам заявку менеджеру."
        ),
    },
    "delivery": {
        "keywords": ["доставка", "срок", "когда", "как быстро"],
        "answer": (
            "⏱ Срок запуска:\n"
            "• Простой автоответчик: 1 день\n"
            "• Бот с меню и воронкой: 3–5 дней\n"
            "• Сложная интеграция: от 7 дней"
        ),
    },
    "contacts": {
        "keywords": ["контакты", "телефон", "связь", "менеджер"],
        "answer": (
            "📞 Связаться с менеджером:\n"
            "• ЛС сообщества\n"
            "• Email: hello@vkbotpro.ru\n"
            "• Ответ в рабочее время: до 15 минут"
        ),
    },
}
WORK_START = time(9, 0)
WORK_END = time(21, 0)
COOLDOWN_SECONDS = 20
last_answer_at: dict[int, float] = {}
def find_faq_answer(text: str) -> str | None:
    lowered = text.lower().strip()
    for rule in FAQ_RULES.values():
        if any(keyword in lowered for keyword in rule["keywords"]):
            return rule["answer"]
    return None
def is_work_time(now: datetime | None = None) -> bool:
    now = now or datetime.now()
    return WORK_START <= now.time() <= WORK_END
def after_hours_message() -> str:
    return (
        "🌙 Сейчас нерабочее время (09:00–21:00 МСК).\n"
        "Я сохранил ваше сообщение — менеджер ответит утром."
    )
def can_answer(user_id: int) -> bool:
    now = ts()
    last = last_answer_at.get(user_id, 0)
    if now - last < COOLDOWN_SECONDS:
        return False
    last_answer_at[user_id] = now
    return True
@bot.on.message()
async def autoreply(message: Message):
    if not message.text:
        return
    user_id = message.from_id or 0
    text = message.text
    if not can_answer(user_id):
        return
    answer = find_faq_answer(text)
    if not is_work_time():
        await message.answer(after_hours_message())
        if answer:
            await message.answer(answer)
        return
    if answer:
        await message.answer(answer)
        return
    if "заказать" in text.lower():
        await message.answer(
            "✅ Отлично! Напишите, пожалуйста:\n"
            "1) Нишу\n2) Что бот должен делать\n3) Дедлайн\n\n"
            "Я передам заявку менеджеру."
        )
        return
    await message.answer(
        "Я пока не понял запрос 🤔\n"
        "Попробуйте: «цена», «доставка», «контакты» или «заказать»."
    )
if __name__ == "__main__":
    bot.run_forever()

Как улучшать дальше

  • Подключить SQLite/PostgreSQL для хранения заявок.
  • Добавить метки источника (utm_source) и считать конверсию по рекламным каналам.
  • Вынести FAQ в JSON или БД, чтобы менеджер менял ответы без редактирования кода.

Частые ошибки

Бот молчит

Проверь в сообществе:

  • включены «Возможности ботов»;
  • включён Long Poll API;
  • в «Типах событий» активирован message_new.

Подробный разбор есть в статье «Как создать бота для ВК с нуля».

Ошибка KeyError: VK_TOKEN

.env не найден или переменная названа иначе. Проверь имя VK_TOKEN и что файл лежит рядом с bot.py.

Бот отвечает слишком часто

Увеличь COOLDOWN_SECONDS до 40–60 для нагруженных сообществ.

Мини-FAQ по автоответчику для ВК

Сколько стоит бот-автоответчик для ВКонтакте?

Для типового сценария можно стартовать с готового шаблона. Если нужны интеграции, нестандартные ветки диалога и сопровождение, обычно выгоднее заказывать доработку под ваш процесс.

За сколько дней можно запустить автоответчик в сообществе?

Базовый запуск занимает 1–3 дня. Сложные сценарии с интеграциями и несколькими ролями команды — дольше.

Что лучше для бизнеса: шаблон или кастомная разработка?

Шаблон подходит для быстрого старта. Кастом лучше, если нужна гибкая логика, контроль данных и масштабирование под продажи/поддержку.

Нужен запуск без сборки с нуля?

Если нужна логика под ваш бизнес-процесс, интеграции и доработки — оставь заявку на разработку бота под ключ.

Если нужен быстрый старт, выбери решение в каталоге готовых ботов.

Что читать следующим

Реклама

Комментарии

Загрузка...