Спасаем бизнес: Создаём VK-бота на PHP, Python, JS и C#.
Часть 1 — Введение и быстрый старт
Если вы держите в руках телефон не для того, чтобы листать мемы, а чтобы управлять бизнес-процессами, последние новости вас явно насторожили. Февраль 2026 года войдет в историю рунета как месяц великого исхода: Роскомнадзор начал активное замедление Telegram, и бизнес судорожно ищет новые каналы коммуникации .
Проблема коснулась не только чтения каналов. Компании, выстроившие годами работающие связки CRM с Telegram-ботами, столкнулись с неприятным
эффектом: боты начали «тормозить». В технических кругах уже обсуждают проблемы, где автоматизация через Телеграм может зависать на 5–10 минут. Для
синхронных процессов сервера (например, подтверждения оплаты или выдачи товара) такая задержка - фатальна.
На этом фоне закономерно
взлетел интерес к экосистеме VK. Мессенджер MAX от VK, набравший уже более 55 млн ежедневных пользователей, становится не просто альтернативой, а
главной площадкой для деловой коммуникации. Сюда активно переезжают банки (Сбер, ВТБ, Т-Банк), государственные структуры и ритейл. VK WorkSpace все
чаще выбирают как базу для корпоративного общения вместо иностранных сервисов.
Зачем вообще нужны боты?
Бот — это не просто программа, которая шлет «Привет». В современном B2B и B2C маркетинге боты решают три главные задачи:
Автоматизация продаж. Квалификация лидов, сбор контактов и даже оформление заказов без участия менеджера.
Клиентский сервис 24/7. Ответы на типовые вопросы в техподдержке, статусы заказов, запись на прием.
-
Транзакционные уведомления. Мгновенная отправка чеков, кодов подтверждения и напоминаний, что снижает нагрузку на кол-центр на 30–40%.
В условиях, когда стабильность Telegram под вопросом, а бизнес-аудитория концентрируется в MAX и ВКонтакте, умение делать ботов для VK становится
критически важным навыком разработчика.
Почему мы решили написать этот цикл
В нашей компании мы ежедневно сталкиваемся с задачами автоматизации бизнеса и знаем, как важно иметь под рукой рабочие примеры кода. Проблема
большинства туториалов в том, что они заточены под один язык: полезная статья есть, но если вы пишете на Python, а примеры только на PHP —
приходится тратить время на адаптацию.
Мы решили пойти дальше и сделать цикл универсальным. В четырёх частях мы разберём создание
полноценного VK-бота с нуля, и каждый фрагмент кода будет представлен сразу на четырёх языках: PHP, Python, JavaScript (Node.js) и C#. Все примеры
будут свёрнуты в удобные вкладки — вы просто выбираете свой стек и изучаете материал без лишних отвлечений.
Выбирайте вкладку с вашим
языком и поехали!
Начало
Создание сообщества и получение ключей
Для начала нам понадобится сообщество. Так как боты в вк завязаны на сообщество и пишут от его имени, без него нам не обойтись:
Выбираем вкладку сообщества и нажимаем кнопку "Создать сообщество"
Описывать процесс создания сообщества мы здесь не будем, в будущем в категории маркетинга появится статья на эту тему.

Открываем настройки сообщества и переходим к работе с API
После этого в центре страницы откроется вкладка с конфигурацией бота. Здесь будут вкладки "Ключи доступа", "Callback API", "Long Poll API".
Нас
интересует первая - "Ключи доступа".
Нажмите кнопку «Создать ключ» . В появившемся окне отметьте права, которые понадобятся боту (например,
«Сообщения сообщества» и «Доступ к сообщениям»):

После подтверждения вы получите токен — длинную строку из букв и цифр. Важно: скопируйте его сразу и куда-нибудь сохраните. Если потеряется, чтобы
снова его увидеть придется подтверждать действие по VK ID.
Именно этот ключ будет использоваться в коде бота для обращения к API ВКонтакте.
Теперь
нам нужно написать сервер и подтвердить его адрес.
Для сервера нам понадобится хостинг и домен, привязанный к нему. Можно тестировать локально, но это сложнее, чем с тем же Telegram API, понадобятся туннели.
Как выбрать и создать хостинг, зарегистрировать и привязать домен вы можете найти на страницах хостинг-провайдеров.
Создание сервера для подтверждения ключа.
Регистрация констант.
Теперь нам нужно настроить связь между нашим кодом и сообществом VK. Здесь есть два пути: Long Poll API (сервер сам постоянно "стучится" за
обновлениями) и Callback API (VK сам присылает уведомления на наш сервер). Мы будем использовать второй — он надёжнее для продакшена и не требует
постоянно работающего скрипта.
Нам понадобится токен для подтверждения. Откроем вкладку Callback API и скопируем его:

Выбираем язык и начинаем:
// Регистрируем константы
define('CONFIRMATION_TOKEN', 'ВАШ ТОКЕН ПОДТВЕРЖДЕНИЯ');
define('ACCESS_TOKEN', 'ВАШ БОЛЬШОЙ ТОКЕН');
define('VERSION', '5.199');
define('ENDPOINT', 'https://api.vk.com/method/');
from flask import Flask, request
# Регистрируем константы
CONFIRMATION_TOKEN = 'ВАШ ТОКЕН ПОДТВЕРЖДЕНИЯ'
ACCESS_TOKEN = 'ВАШ БОЛЬШОЙ ТОКЕН'
VERSION = '5.199'
ENDPOINT = 'https://api.vk.com/method/'
// Регистрируем константы
const CONFIRMATION_TOKEN = 'ВАШ ТОКЕН ПОДТВЕРЖДЕНИЯ';
const ACCESS_TOKEN = 'ВАШ БОЛЬШОЙ ТОКЕН';
const VERSION = '5.199';
const ENDPOINT = 'https://api.vk.com/method/';
public class Program
{
// Регистрируем константы
private const string CONFIRMATION_TOKEN = "ВАШ_ТОКЕН_ПОДТВЕРЖДЕНИЯ";
private const string ACCESS_TOKEN = "ВАШ_БОЛЬШОЙ_ТОКЕН";
private const string VERSION = "5.199";
private const string ENDPOINT = "https://api.vk.com/method/";
public static void Main(string[] args) {}
}
Создание обработчиков.
Теперь нам предстоит создать обработчики запросов от VK API. Отправляться будут POST запросы с указанием типа ({"type": "type"}) и прочих данных.
Вот на этот type мы и будем ориентироваться. При подтверждении отправляется POST запрос с {"type": "confirmation"} в теле.
Важный
момент, вопреки правилам о том, что если сервер получил данные к которым он не готов, то ответом, в большинстве случаев, становится Bad Request с
400м статусом, VK API требует чтобы сервер на такие запросы отвечал "ok" с 200м статусом. Это описано в
документации. Если не идти этим путем, нам могут перестать присылать уведомления.
Итак, обработчики:
// Сразу после констант
// Получаем данные из запроса и десериализуем Json
$data = json_decode(file_get_contents('php://input'), true);
// Проверяем, что данные есть и в данных есть тип:
if (!isset($data['type'])) {
http_response_code(200);
exit('ok');
}
// Если тип - подтверждение, то отправляем наш токен подтверждения:
switch ($data['type']) {
case 'confirmation':
echo CONFIRMATION_TOKEN;
exit();
default:
http_response_code(200);
exit('ok');
}
# Сразу после констант
app = Flask(__name__)
@app.route('/', methods=['POST'])
def callback():
# Получаем данные из запроса и десериализуем Json
data = request.get_json(force=True, silent=True)
# Проверяем, что данные есть и в данных есть тип:
if data is None or 'type' not in data:
return 'ok', 200
# Если тип - подтверждение, то отправляем наш токен подтверждения:
if data['type'] == 'confirmation':
return CONFIRMATION_TOKEN, 200
# Любое другое событие — "ok"
return 'ok', 200
if __name__ == '__main__':
app.run(port=3004)
// Сразу после констант
const express = require('express');
const app = express();
app.use(express.json()); // для парсинга application/json
app.post('/', (req, res) => {
// Получаем данные из запроса и десериализуем Json
const data = req.body;
// Проверяем, что данные есть и в данных есть тип:
if (!data || !data.type) {
return res.status(200).send('ok');
}
// Если тип - подтверждение, то отправляем наш токен подтверждения:
switch (data.type) {
case 'confirmation':
return res.send(CONFIRMATION_TOKEN);
default:
return res.status(200).send('ok');
}
});
const port = 3002;
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
// Типизируем запрос от VK API
public class VkRequest
{
public string? Type { get; set; }
}
public class Program
{
// Сразу после констант
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapPost("/", async (HttpContext context) =>
{
VkRequest? data = null;
// Получаем данные из запроса и десериализуем Json
try
{
data = await context.Request.ReadFromJsonAsync<VkRequest>();
}
catch (Exception)
{
return Results.Ok("ok");
}
// Проверяем, что данные есть и в данных есть тип:
if (data is null) return Results.Ok("ok");
// Если тип - подтверждение, то отправляем наш токен подтверждения:
switch (data.Type)
{
case "confirmation":
return Results.Ok(CONFIRMATION_TOKEN);
default:
return Results.Ok("ok");
}
});
app.Run();
}
}
Приведённые выше обработчики делают ровно то, что нужно VK: на любое событие, кроме confirmation, они возвращают строку
ok и HTTP-статус 200. Если приходит событие confirmation — отправляем обратно токен подтверждения, скопированный из
настроек сообщества. Это обязательное условие: как мы и писали выше, если не ответить ok или вернуть другой статус, VK посчитает, что
сервер не справляется, и перестанет присылать новые уведомления (или будет бесконечно повторять запросы, создавая лишнюю нагрузку).
Как проверить, что всё работает? Заливайте код на хостинг, затем:
- Вернитесь в управление сообществом → «Работа с API» → вкладка «Callback API».
- Нажмите «Добавить сервер», укажите название и адрес вашего сервера (например,
https://ваш-сайт.ru/). - В поле «Секретный ключ» можно ничего не вводить (или придумать строку для будущей проверки подлинности запросов).
- Выберите версию API (5.199, то что мы вводили в константах) и нажмите «Подтвердить».
Обратите внимание на то, что строка которую мы должны вернуть изменилась. Это происходит про прошествии времени, чтобы она всегда была актуальной
VK отправит запрос с типом confirmation на ваш сервер. Если код написан правильно, в интерфейсе появится зелёная галочка — сервер
подтверждён:
Важное замечание: в примерах выше мы намеренно упростили логику, чтобы сфокусироваться на механизме подтверждения. В реальном
проекте стоит добавить проверку секретного ключа (если вы его указали), чтобы убедиться, что запросы приходят действительно от VK, а не от
злоумышленников. Также не забывайте, что на событие message_new мы пока не реагируем — просто возвращаем ok. Научим бота
отвечать в следующей части.
Если вы дочитали до этого места и всё заработало — поздравляю, вы успешно прошли первый этап! В следующей части разберём, как обрабатывать входящие сообщения и отправлять ответы.