Автоответчик ВКонтакте на Python: код + деплой за 30 минут
Как сделать автоответчик ВК на Python для личных сообщений и сообщества: ключевые слова, расписание, антиспам и передача менеджеру. Рабочий код на vkbottle.
Содержание статьи
Меня зовут Павел Гордеев, и сегодня — про автоответчик ВКонтакте на Python.
Автоответчик ВК — это бот сообщества, который автоматически отвечает на входящие сообщения по заданным правилам: ключевые слова, расписание, первое обращение. Пишем на Python с библиотекой vkbottle.
Если ищешь автоответчик без программирования — смотри конструкторы в статье ТОП-7 конструкторов ботов для ВК. Эта статья для тех, кто хочет полный контроль и Python.
Что умеет автоответчик ВКонтакте
- Отвечает по ключевым словам («цена», «запись», «привет»)
- Отправляет приветствие при первом обращении
- Работает по расписанию (в рабочие часы и нет)
- Передаёт диалог живому менеджеру по команде
- Работает 24/7 на VPS без остановки
Что нужно перед стартом
- Python 3.10+
- Сообщество ВКонтакте с токеном доступа
- Включённый Long Poll API в настройках сообщества
Если ещё не настраивал — пройди гайд по созданию бота с нуля (Шаги 1–3).
Шаг 1: Установка
mkdir vk-autoresponder
cd vk-autoresponder
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install vkbottle python-dotenv
Файл .env:
VK_TOKEN=vk1.a.ВАШ_ТОКЕН_СООБЩЕСТВА
Шаг 2: Базовый автоответчик — 20 строк
from dotenv import load_dotenv
import os
from vkbottle.bot import Bot, Message
load_dotenv()
bot = Bot(token=os.environ["VK_TOKEN"])
@bot.on.message(text=["привет", "здравствуй", "добрый день", "hi", "hello"])
async def greet(message: Message):
await message.answer("Привет! Чем могу помочь? Напишите «цена», «запись» или «вопрос».")
@bot.on.message(text=["цена", "стоимость", "сколько стоит", "прайс"])
async def price(message: Message):
await message.answer("Наши цены: ...\nДля точного расчёта оставьте заявку командой «запись».")
@bot.on.message(text=["запись", "записаться", "хочу записаться"])
async def booking(message: Message):
await message.answer("Для записи, пожалуйста, укажите:\n1. Ваше имя\n2. Желаемую дату\n3. Контактный телефон\n\nМенеджер свяжется в течение 30 минут.")
@bot.on.message()
async def fallback(message: Message):
await message.answer("Добрый день! Напишите «цена», «запись» или задайте вопрос — ответим в течение часа.")
bot.run_forever()
Это полноценный рабочий автоответчик. Запусти и попробуй прямо сейчас.
Шаг 3: Автоответчик по расписанию
Часто нужно разное поведение в рабочее и нерабочее время. Добавляем проверку времени:
from datetime import datetime, timezone, timedelta
MSK = timezone(timedelta(hours=3)) # московское время
def is_working_hours() -> bool:
now = datetime.now(MSK)
# Будни 9:00–19:00
return now.weekday() < 5 and 9 <= now.hour < 19
@bot.on.message()
async def fallback(message: Message):
if is_working_hours():
await message.answer(
"Добрый день! Менеджер ответит вам в ближайшее время.\n"
"Или напишите «цена» / «запись» — бот ответит сразу."
)
else:
await message.answer(
"Здравствуйте! Сейчас нерабочее время.\n"
"Мы работаем пн–пт с 9:00 до 19:00 МСК.\n"
"Оставьте вопрос — ответим первым делом утром."
)
Шаг 4: Приветствие при первом обращении
Чтобы не спамить приветствием каждый раз — храним пользователей, которые уже писали:
greeted_users: set[int] = set()
@bot.on.message()
async def smart_fallback(message: Message):
user_id = message.from_id
if user_id not in greeted_users:
greeted_users.add(user_id)
await message.answer(
f"Добро пожаловать! Я автоответчик сообщества.\n\n"
f"Напишите:\n"
f"• «цена» — узнать стоимость\n"
f"• «запись» — записаться\n"
f"• «вопрос» — задать вопрос менеджеру"
)
else:
await message.answer("Напишите «запись» или «цена» — отвечу сразу!")
В продакшне
greeted_usersлучше хранить в базе данных или Redis — при перезапуске бота множество сбрасывается. Для MVP достаточно.
Шаг 5: Передача живому менеджеру
Добавляем команду, по которой бот “замолкает” и все следующие сообщения идут к менеджеру:
paused_users: set[int] = set()
@bot.on.message(text=["оператор", "менеджер", "человек", "позовите менеджера"])
async def call_manager(message: Message):
paused_users.add(message.from_id)
await message.answer(
"Передаю вас менеджеру — он ответит в течение нескольких минут.\n"
"Чтобы снова включить автоответ, напишите «бот»."
)
@bot.on.message(text="бот")
async def resume_bot(message: Message):
paused_users.discard(message.from_id)
await message.answer("Автоответчик снова активен. Чем помочь?")
@bot.on.message()
async def smart_fallback(message: Message):
if message.from_id in paused_users:
return # молчим, ждём менеджера
# ... остальная логика
Полный код — всё вместе
from dotenv import load_dotenv
import os
from datetime import datetime, timezone, timedelta
from vkbottle.bot import Bot, Message
load_dotenv()
bot = Bot(token=os.environ["VK_TOKEN"])
MSK = timezone(timedelta(hours=3))
greeted_users: set[int] = set()
paused_users: set[int] = set()
def is_working_hours() -> bool:
now = datetime.now(MSK)
return now.weekday() < 5 and 9 <= now.hour < 19
@bot.on.message(text=["привет", "здравствуй", "добрый день", "hi", "hello"])
async def greet(message: Message):
await message.answer("Привет! Напишите «цена», «запись» или «вопрос».")
@bot.on.message(text=["цена", "стоимость", "сколько стоит", "прайс"])
async def price(message: Message):
await message.answer("Наши цены: ...\nДля записи напишите «запись».")
@bot.on.message(text=["запись", "записаться"])
async def booking(message: Message):
await message.answer(
"Для записи укажите:\n1. Имя\n2. Желаемую дату\n3. Телефон\n\n"
"Менеджер свяжется в течение 30 минут."
)
@bot.on.message(text=["оператор", "менеджер", "человек"])
async def call_manager(message: Message):
paused_users.add(message.from_id)
await message.answer("Передаю менеджеру — ответит в ближайшее время. Напишите «бот» чтобы вернуть автоответ.")
@bot.on.message(text="бот")
async def resume_bot(message: Message):
paused_users.discard(message.from_id)
await message.answer("Автоответчик снова активен!")
@bot.on.message()
async def fallback(message: Message):
if message.from_id in paused_users:
return
is_first = message.from_id not in greeted_users
greeted_users.add(message.from_id)
if is_first:
await message.answer(
"Добро пожаловать! Напишите «цена», «запись» или «вопрос» — отвечу сразу.\n"
"Хотите поговорить с менеджером? Напишите «менеджер»."
)
elif is_working_hours():
await message.answer("Напишите «цена», «запись» или задайте вопрос — я отвечу.")
else:
await message.answer(
"Сейчас нерабочее время (пн–пт 9:00–19:00 МСК).\n"
"Оставьте вопрос — ответим с утра."
)
bot.run_forever()
Деплой на VPS
Для работы 24/7 нужен сервер. Подробный гайд — Деплой VK-бота на сервер: systemd и nginx. Кратко:
# На сервере
git clone ВАШ_РЕПОЗИТОРИЙ /home/user/vk-autoresponder
cd /home/user/vk-autoresponder
python -m venv .venv && .venv/bin/pip install -r requirements.txt
# Создать /etc/systemd/system/vk-autoresponder.service и запустить
FAQ
Как сделать автоответчик в ВК в личных сообщениях?
Бот в VK отвечает на сообщения сообщества, а не в личку пользователя. «Личные сообщения» в ВК — это сообщения, которые пользователь пишет в диалог сообщества. Именно их обрабатывает код из этой статьи. Ответы от имени физического лица через бота не предусмотрены VK API.
Как настроить автоответ в сообществе ВК без кода?
Через конструкторы: Senler, BotHelp или Salebot. Они дают визуальный редактор без программирования. Сравнение — в статье ТОП-7 конструкторов ботов для ВК.
Как подключить автоответчик в ВК — нужен ли сервер?
Для постоянной работы — да. Без сервера бот выключится вместе с компьютером. Минимальный VPS для бота стоит 150–200 руб/мес. Если тест — можно запустить локально.
Автоответчик ВК — работает ли в беседах (чатах)?
Да, с небольшими изменениями. В чатах message.peer_id будет больше 2000000000 (это peer_id беседы). Можно добавить проверку if message.peer_id > 2000000000 и дать отдельный ответ для чатов.
Как сделать автоответ только на первое сообщение?
Используй set greeted_users как в примере выше. Для персистентности между перезапусками — сохраняй в SQLite: import sqlite3 и таблица users(vk_id INTEGER PRIMARY KEY).
Что дальше
- Как создать бота для ВК с нуля — если ещё не настроил сообщество и токен
- Бот-автоответчик под ключ — если нужна разработка с интеграциями под ваш бизнес
- Деплой VK-бота на сервер — systemd и работа 24/7
- Как хранить токен VK API — безопасное хранение секретов
Реклама
Комментарии
Загрузка...