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

Автоответчик ВКонтакте на 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).

Что дальше

Реклама

Комментарии

Загрузка...