Бот-автоответчик для ВК: настройка, цена внедрения и запуск под ключ
Как настроить бота-автоответчика для сообщества ВКонтакте: ключевые слова, расписание, антиспам и передача заявок менеджеру. Когда выбрать готовый шаблон, а когда разработку под ключ.
Содержание статьи
Бот-автоответчик для ВКонтакте — быстрый способ не терять обращения в сообщениях сообщества. Пользователь пишет «цена», «доставка», «как заказать» и сразу получает понятный ответ без ожидания менеджера.
В этом материале ты соберёшь рабочего бота на 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 дня. Сложные сценарии с интеграциями и несколькими ролями команды — дольше.
Что лучше для бизнеса: шаблон или кастомная разработка?
Шаблон подходит для быстрого старта. Кастом лучше, если нужна гибкая логика, контроль данных и масштабирование под продажи/поддержку.
Нужен запуск без сборки с нуля?
Если нужна логика под ваш бизнес-процесс, интеграции и доработки — оставь заявку на разработку бота под ключ.
Если нужен быстрый старт, выбери решение в каталоге готовых ботов.
Что читать следующим
- vkbottle vs vk_api — если сомневаешься в выборе библиотеки.
- VK Bot API: сообщения, клавиатуры, ограничения — чтобы строить более сложные сценарии.
- Сетевые запросы в VK-боте: timeout, retry, backoff — чтобы интеграции не падали на временных сбоях.
- Long Poll vs Callback API для бота ВК — чтобы выбрать стабильную схему запуска в проде.
- Telegram заблокирован: перенос бота в VK — если переносишь автоответчик с Telegram.
- Бот ВК vs Telegram: сравнение возможностей — что изменится при переходе.
Реклама
Комментарии
Загрузка...