Адаптация Telegram-плагина под VK

Название плагина Vk
Код плагина Common.Integrations.Vk
Разработчик Официальные плагины от Metabot
Авторы Metabot
Дата создания 09 Октября 2026
Последняя дата обновления 09 Октября 2026

Описание

Плагин Vk позволяет использовать один и тот же скрипт бота в Telegram, Max и VK. Он не вводит новый класс: плагин «патчит» методы класса TelegramMessage из плагина Common.Integrations.Telegram.

Плагин поддерживает отправку текстовых сообщений, создание inline-клавиатур (кнопки text и open_link), обработку нажатий и текстового ввода, а также отправку медиагрупп (по одному вложению). PHP-драйвер VK не меняется: часть поведения Telegram/Max в VK осознанно деградирует (см. таблицу совместимости).

Документация VK API: https://dev.vk.com/method/messages.send

Подключение

Сначала подключается Telegram-плагин, затем при необходимости Max, затем — Vk. Порядок важен: Vk патчит уже загруженный класс. Повторное подключение безопасно (патч ставится один раз).

let TelegramMessage = require('Common.Integrations.Telegram')
require('Common.Integrations.Max') // опционально
require('Common.Integrations.Vk')

let msg = new TelegramMessage()

Больше ничего в скрипте менять не нужно: проверять канал (if (isVk)) не требуется.

Основные параметры

msg.text = "Ваше сообщение" // Текст сообщения
msg.parse_mode = "HTML" // В VK разметка снимается до plain text
msg.keyboard = "Да[yes]==Нет[no]" // Создание клавиатуры
msg.entities = [] // В VK игнорируются (текст очищается так же, как при parse_mode)
Параметр Telegram Max VK
text text text message (plain)
parse_mode parse_mode format (HTML → html, Markdown/MarkdownV2 → markdown) strip → plain
keyboard inline-клавиатура вложение inline_keyboard VK keyboard JSON (inline: true)
entities entities преобразуются в HTML strip
protect_content поддерживается игнорируется игнорируется

Форматы клавиатуры

Формат строки клавиатуры полностью совпадает с Telegram-плагином.

msg.keyboard = "Кнопка1[btn1]==Кнопка2[btn2]" // Кнопки будут расположены вертикально
msg.keyboard = "Кнопка1[btn1]||Кнопка2[btn2]" // Кнопки будут расположены горизонтально
msg.keyboard = "Кнопка1[btn1]||Кнопка2[btn2]==Кнопка3[btn3]||Кнопка4[btn4]"

Значение в квадратных скобках для обычной кнопки отправляется в VK как action.type=text с payload в виде JSON-строки "btn_static_<значение>" (VK требует валидный JSON, иначе ошибка API 911). В getMessagePayload().callback_data кавычки и префикс снимаются — так же, как в Telegram/Max.

Специальные типы кнопок

msg.keyboard = "Отправить контакт[telegram_contact]"
msg.keyboard = "Отправить локацию[telegram_location]"
msg.keyboard = "Посетить сайт[https://example.com]"
msg.keyboard = "Открыть приложение{https://webapp-url.com}"

Лимит подписи кнопки VK — 40 символов (плагин обрезает).

Примеры использования

Простое меню с обработкой ответов

Код будет работать корректно только в команде JS Callback. Один и тот же код работает для Telegram, Max и VK.

let TelegramMessage = require('Common.Integrations.Telegram')
require('Common.Integrations.Max')
require('Common.Integrations.Vk')

let msg = new TelegramMessage()
msg.text = "Выберите действие:"
msg.keyboard = "Информация[info]==Помощь[help]==Настройки[settings]"
msg.parse_mode = "HTML"

switch (true) {
case (isFirstImmediateCall):
    msg.send()
    return false

case (msg.getMessagePayload()?.callback_data == "info"):
    msg.addReplyToText()
    bot.sendMessage("Информация о боте...")
    return false

case (msg.getMessagePayload()?.callback_data == "help"):
    msg.addReplyToText()
    bot.sendMessage("Справка по использованию...")
    return false

case (msg.getMessagePayload()?.callback_data == "settings"):
    msg.addReplyToText()
    bot.runScriptForLead(123, leadId) // Запуск скрипта настроек
    return false
}

Минимальное демо: кнопки + переход дальше

const TelegramMessage = require('Common.Integrations.Telegram')
require('Common.Integrations.Max')
require('Common.Integrations.Vk')

const msg = new TelegramMessage()
msg.text = 'VK+Telegram+Max demo\n\nВыберите кнопку:'
msg.keyboard = 'Кнопка A[a]==Кнопка B[b]'
msg.parse_mode = 'HTML'

if (isFirstImmediateCall) {
  msg.send()
  return false
}

msg.addReplyToText()
return true

В Telegram и Max после нажатия клавиатура исчезнет, а к тексту сообщения добавится строка ➤ Кнопка A. В VK подпись кнопки уже приходит в чат как сообщение пользователя (эхо text-кнопки), поэтому addReplyToText() ничего не отправляет — только очищает _keyboard и возвращает getMessagePayload().

Справочник методов

Основные методы отправки

Получение информации

Обработка ответов пользователя:

// Проверка типа ввода
if (msg.getMessagePayload()?.input_type == "write") {
    // Пользователь написал текст
}

// Проверка нажатия кнопки
if (msg.getMessagePayload()?.callback_data == "button_id") {
    // Пользователь нажал кнопку
}

Структура вебхука VK отличается от Telegram: событие всегда message_new. Сообщение лежит в object.message (API ≥ 5.103) или прямо в object. Нажатие text-кнопки приходит как message_new с полем payload (JSON-строка); плагин декодирует его, ищет кнопку в _keyboard и выставляет input_type=press. Текст без payload — input_type=write; если подпись совпала с кнопкой текущей клавиатуры, callback_data берётся из неё.

Отладка

msg.debug("Отладочное сообщение")

В Telegram при bot_debug_level == 0 используется «тихий» getMe. В VK такого метода нет: при уровне 0 отладка не отправляется пользователю. При ненулевом уровне сообщение уходит в чат (как и в Telegram-плагине).

Лучшие практики

if (isFirstImmediateCall) {
    msg.send()
    return false
}
if (msg.getMessagePayload()?.input_type == "write") {
    bot.sendMessage('Пожалуйста, используйте кнопки')
    return false
}
msg.addReplyToText()

Форматирование текста и entities

VK не принимает HTML/Markdown в messages.send так же, как Telegram/Max. Если заданы parse_mode или entities, плагин удаляет HTML-теги, типичные entities и маркеры Markdown и отправляет plain text.

msg.text = "<b>Жирный текст</b>\n<i>Курсив</i>\n<code>Моноширинный текст</code>"
msg.parse_mode = "HTML"
// В VK уйдёт: "Жирный текст\nКурсив\nМоноширинный текст"

Работа с entities

msg.entities в VK не отправляются. Текст очищается так же, как при parse_mode.

let TelegramMessage = require('Common.Integrations.Telegram')
require('Common.Integrations.Max')
require('Common.Integrations.Vk')

let msg = new TelegramMessage()
let messageData = lead.getJsonAttr("messageData")

msg.text = messageData?.text
msg.entities = messageData?.entities

// Не используйте одновременно parse_mode и entities

Отправка медиагрупп

Глобальная функция sendMediaGroup для лидов VK отправляет вложения по одному через bot.sendMessage с { type, url }. Типы элементов приводятся так: photo/image → image, document/file → file, video → video, audio → audio. Подпись очищается от разметки. Для Telegram/Max-лидов вызывается исходная (или Max) реализация.

Работа с файлами

Входящие файлы обрабатываются стандартными методами бота — так же, как в Telegram-плагине. Вы можете получить URL файла и сохранить его в карточку лида.

let TelegramMessage = require('Common.Integrations.Telegram')
require('Common.Integrations.Max')
require('Common.Integrations.Vk')
let msg = new TelegramMessage()

// Все входящие файлы
let attachments = bot.getAllAttachments()

if (Boolean(attachments?.[0]?.url)) {
    let uploadData = bot.downloadFileFromUrl(attachments[0].url)

    msg.debug('Пользователь отправил файл: ' + uploadData.url)
    lead.setAttr('file', uploadData.url)

    // Запуск скрипта обработки
    bot.runScriptByCodeForLead("recieveFile", lead.getData('id'))

    bot.stop()
}

Пример ожидания фото:

let TelegramMessage = require('Common.Integrations.Telegram')
require('Common.Integrations.Max')
require('Common.Integrations.Vk')
let msg = new TelegramMessage()

msg.text = 'А теперь жду твоё фото 😉'
msg.parse_mode = 'HTML'

let data = bot.getAllAttachments()

switch (true) {
case (isFirstImmediateCall):
    msg.send()
    return false

case (Boolean(data?.[0]?.type != 'image')):
    bot.sendMessage('Отправь изображение. Такой формат не подходит')
    return false

case (Boolean(data?.[0]?.type == 'image')):
    let uploadData = bot.downloadFileFromUrl(data[0].url)
    msg.debug('Пользователь отправил файл: ' + uploadData.url)
    lead.setAttr('photo', uploadData.url)
    bot.sendMessage('Класс! Фото загрузил')
    return true

default:
    msg.addReplyToText()
    return true
}

Рекомендации по работе с файлами

Совместимость с Telegram-плагином

Возможность Telegram Max VK Комментарий
send() ✅ ✅ ✅ VK: messages.send
edit() ✅ ✅ ⚠️ VK: новое сообщение
addReplyToText() ✅ ✅ ⚠️ VK: ничего не отправляет (эхо кнопки уже в чате)
removeInlineKeyboard() ✅ ✅ ⚠️ VK: ничего не отправляет
removeReplyKeyboard() ✅ ⚠️ ⚠️ VK: send _remove_keyboard_text
getMessagePayload() ✅ ✅ ✅
debug() ✅ ✅ ⚠️ при bot_debug_level == 0 — silent no-op
parse_mode = HTML ✅ ✅ ❌ strip → plain
parse_mode = MarkdownV2 ✅ ⚠️ ❌ strip → plain
entities ✅ ⚠️ ❌ strip
Кнопки contact / location ✅ ✅ ❌ кнопка пропускается + debug
Кнопки-ссылки ✅ ✅ ✅ open_link
Web App {url} ✅ ⚠️ ❌ кнопка пропускается + debug
tg://user?id= ✅ ❌ ❌ кнопка пропускается
protect_content ✅ ❌ ❌ игнорируется
TelegramPhoto ✅ ❌ ❌ не патчится, используйте sendMediaGroup
sendMediaGroup ✅ ✅ ⚠️ по одному вложению
Эхо подписи кнопки нет нет да особенность VK text-кнопок

Ограничения VK


Версия #2
Ирина Петрова создал 26 August 2026 10:44:00
Ирина Петрова обновил 21 October 2026 10:54:26