Как создать чат бот ВКонтакте. VK бот для обработки сообщений в группе.
Введение
В этой статье разберем по шагам как создать чат бот ВКонтакте с возможностью управления через SQL процедуры в рамках платформы Falcon Space.
Интеграция сделана на штатных средствах платформы и не затрагивает изменений в ядре платформы.
Наш бот сможет получать сообщения от пользователя и отправлять ему обратно сообщения.
Подготовка к интеграции с ВКонтакте
Для начала выполняем необходимые настройки своей группы ВК.
См. по ссылке https://dev.vk.com/api/bots/getting-started, а именно:
- Управление сообществом → Сообщения → Настройки для бота и включите пункт Возможности ботов
- Включить сообщения в вашем сообществе (Управление сообществом → Сообщения), когда бот будет готов к использованию, чтобы ему можно было написать.
- Создать ключ доступа: Откройте раздел Управление сообществом (Управление страницей, если у вас публичная страница), выберите вкладку Работа с API и нажмите Создать ключ доступа (проставляем необходимые права).
- Для возможности приглашать бота в беседу - Управление сообществом →Сообщения →Настройки для бота и поставьте галочку в пункте Разрешать добавлять сообщество в беседы. После этого в сообществе появится кнопка Пригласить в беседу, открывающая модальное окно со списком бесед.
- В Настройки / Работа с API переходим на вкладку CallbackAPI (задаем какие методы дергать на сервере при наступлении событий):
Здесь сначала указываем будущий адрес входящего API, а также секретное слово, которое мы будем проверять на стороне сервера (хранится оно будет в настройке vkSecret).
Подтверждение Callback API на стороне сервера
Создаем в /asapi входящий метод API (с vkbot кодом, формат text). Он должен просто выдать строку подтверждение, указанную на скрине выше.
Пример:
CREATE PROCEDURE [dbo].[api_vk_vkbot]
@parameters ExtendedDictionaryParameter READONLY,
@username nvarchar(256)
as
begin
-- SELECT 1
select '' Msg, 1 Result, 0 errorCode
-- SELECT 2 -- сюда вставляем код со страницы настроек группы Callback API
select 'XXXXXXXXX'
end
На странице ВК нажимаем Подтвердить.
В настройках создаем 2 настройки:
- vkSecret - секретный ключ в настройках CallbackAPI (не путать с кодом подтверждения CallbackAPI).
- vkToken -токен доступа, который мы получили на вкладке Ключи доступа в ВК настройках группы (он будет использоваться в исходящем API методе для отправки запросов в сторону ВК).
Обработка событий от ВК
Реализуем метод входящего API vkbot (код сущности vk, код метода vkbot, тип вывода TEXT):
CREATE PROCEDURE [dbo].[api_vk_vkbot]
@parameters ExtendedDictionaryParameter READONLY,
@username nvarchar(256)
as
begin
declare @params nvarchar(max) = (select value2 from @parameters
where [key] = 'InputStream')
declare @secret1 nvarchar(128) = dbo.as_setting('vkSecret', '')
declare @group_id int, @type nvarchar(128), @event_id nvarchar(256),
@v nvarchar(128), @object nvarchar(max), @secret nvarchar(128)
SELECT @group_id = group_id, @type = type, @event_id = event_id,
@v = v, @object = object, @secret = secret
FROM OPENJSON(@params, '$')
WITH (
group_id int '$.group_id',
type nvarchar(128) '$.type',
[event_id] nvarchar(256) '$.event_id',
[v] nvarchar(512) '$.v',
[object] nvarchar(max) '$.object' as json,
[secret] nvarchar(max) '$.secret'
)
if(@secret<>@secret1) begin
execute as_print 'VKBot wrong secret'
return
end
exec [as_trace_warn] @code='vkbot_in', @header=@type, @itemID = @group_id,
@text = @object, @username = ''
declare @sendCommand nvarchar(128)='', @sendParams nvarchar(max) = ''
print @object
if(@type ='message_new') begin
/*
Сообщение в чат группы
{"group_id":70971776,"type":"message_new",
"event_id":"cc490c446cae2281cf4c35b2de957b4e20790a0a",
"v":"5.50",
"object":{"id":494,"date":1665817659,"out":0,"user_id":1885821,"read_state":0,
"title":"","body":"22","owner_ids":[]},
"secret":""}
*/
declare @object_id int, @object_date int, @object_out int,
@object_user_id int,
@object_read_state int, @object_title nvarchar(max),
@object_body nvarchar(max), @object_owner_ids nvarchar(max)
SELECT @object_id = id, @object_date = date, @object_out = out,
@object_user_id = user_id, @object_read_state = read_state,
@object_title = title, @object_body = body, @object_title = title,
@object_owner_ids = owner_ids
FROM OPENJSON(@object, '$')
WITH (
id int '$.id',
date int '$.date',
[out] int '$.out',
[user_id] int '$.user_id',
[read_state] int '$.read_state',
[title] nvarchar(max) '$.title',
[body] nvarchar(max) '$.body',
[owner_ids] nvarchar(max) '$.owner_ids' as json
)
declare @ps ExtendedDictionaryParameter
insert into @ps ([Key], Value2)
select 'group_id', cast(@group_id as nvarchar) union
select 'type', cast(@type as nvarchar) union
select 'event_id', cast(@event_id as nvarchar) union
select 'object_id', cast(@object_id as nvarchar) union
select 'object_date', cast(@object_date as nvarchar) union
select 'object_out', cast(@object_out as nvarchar) union
select 'object_user_id', cast(@object_user_id as nvarchar) union
select 'object_read_state', cast(@object_read_state as nvarchar) union
select 'object_title', cast(@object_title as nvarchar) union
select 'object_body', cast(@object_body as nvarchar) union
select 'object_owner_ids', cast(@object_owner_ids as nvarchar)
declare @msg nvarchar(max) = ''
exec vk_message_new_action @parameters = @ps, @res = @msg output
-- обработка нового сообщения в чате группы
if(len(@msg)>0) begin
set @sendCommand = 'messages.send'
set @sendParams = '&user_id='+cast(@object_user_id as nvarchar)+
'&peer_id=-'+cast(@group_id as nvarchar)+
'&chat_id='+cast(@group_id as nvarchar)+
'&message=' + @msg
end
end
-- SELECT 1
select '' Msg, 1 Result, 0 errorCode
-- SELECT 2
select 'ok'
if(@sendCommand<>'') begin
-- SELECT 3
select 'apirequest' type, 'vk_send' code,
'command' p1_name, @sendCommand p1_value,
'params' p2_name, @sendParams p2_value
end
end
Что делает процедура:
- проверяет секретное слово (если неверное, то ошибку выдает)
- логирует запрос в trace с кодом vkbot
- определяет тип команды (пока это только команда Новое сообщение).
- вызывает процедуру vk_message_new_action для обработки команды (в ней будет заложена бизнес-логика команд от пользователя).
- если есть выходная команда - то вызывает исходящий API запрос к ВК (vk_send).
Процедура обработки команды пользователя в ВК чате
CREATE OR ALTER PROCEDURE [dbo].vk_message_new_action
@parameters ExtendedDictionaryParameter readonly,
@res nvarchar(max) output
AS
BEGIN
set @res = ''
declare @text nvarchar(max) = (select Value2 from @parameters where [Key]='object_body')
if (CHARINDEX('привет', @text) > 0) begin
set @res = 'Приветствую вас (это бот). Обратную связь дадим в ближайшее время.
Если что - пишите на whatsapp +7 920 954 2217'
return
end
set @res = ''
END
На входе процедура получает множество параметров в @parameters - коды параметров зависят от типа команды (в процедуре vkbot можно посмотреть какие передаются параметры для типа new_message).
В итоге наша процедура должна что-то выдать в @res. Если это пустая строка - то ничего не происходит. Если непустая - то отправляется команда от имени сообщества ВК.
Метод отправки команды в ВК
Создаем исходящий метод отправки vk_send (тип GET JSON)
Процедура Request:
CREATE PROCEDURE [dbo].[api_vk_send_request]
@parameters ExtendedDictionaryParameter READONLY,
@username nvarchar(32)
AS
BEGIN
declare @params nvarchar(max) = (select value2 from @parameters where [key]='params')
declare @command nvarchar(max) = (select value2 from @parameters where [key]='command')
declare @random nvarchar(128) = ABS(CHECKSUM(NEWID()) % 10000)
declare @token nvarchar(max) = dbo.as_setting('vkToken', '')
declare @url nvarchar(max) = 'https://api.vk.com/method/'+@command+'?v=5.131'+
'&access_token=' +@token+'&random_id='+@random +
'&'+ @params
declare @header nvarchar(max) = 'out ' + @command
exec [as_trace_warn] @code='vkbot', @header= @header,
@itemID = 0, @text = @params, @username = ''
select '' Msg, 1 Result, @url Url
END
Что делается в процедуре:
- Получаем из @parameters какую команду и с какими параметрами отправить в ВК.
- Готовим URL для команды, включая системные параметры токен, случайное число, версия API.
- Логируем отправку запроса в trace с кодом vk_bot
Ответ от ВК обрабатывается в процедуре response:
CREATE PROCEDURE [dbo].[api_vk_send_response]
@response nvarchar(max),
@parameters ExtendedDictionaryParameter READONLY,
@username nvarchar(32)
AS
BEGIN
-- SELECT 1
select '' Msg, 1 Result, @response Response
exec [as_trace_warn] @code='vkbot', @header= 'outresponse',
@itemID = 0, @text = @response, @username = ''
END
Здесь мы просто логируем отклик ВК на наш запрос в trace с кодом vkbot.
Что получилось в итоге
Пока наш бот просто обрабатывает момент нахождения в строке слова Привет - если оно есть, то выдается стандартный текст.
Каков образ действий разработчика
Чтобы внедрить в свой проект подобного бота, вам необходимо перенести все указанные объекты к себе.
Вся основная часть работы заключается в обработке входящего запроса и выдаче текста от бота. Это процедура vk_message_new_action.
Если вы хотите сделать, чтобы бот реагировал не только на событие Новое сообщение, но и на другие (Новый коммент, вступление в группу и т.д.), то вам необходимо добавлять новые if (@type='...') во входящем API vkbot, которые по аналогии будут вызывать другие хранимые процедуры, например vk_comment_new_action.
Различные типы событий описаны здесь - https://dev.vk.com/api/community-events/json-schema
Чего пока нет в этом механизме чат-бота
В решение можно добавить следующее:
- обработка ошибочных состояний при отправке запросов
- работа с клавиатурой (кнопки на чате для пользователя). https://dev.vk.com/api/bots/development/keyboard
- обработка смайликов, выдача картинок, документов и т.д.
- обработка многоступенчатых команд (по аналогии с чатом Телеграм)
- интеграция чат бота с системой уведомлений Falcon Space.
- задействование большего числа параметров отправки сообщений https://dev.vk.com/method/messages.send
Google поиск по нашей документации
- Руководства
- Основа Falcon Space
- Основные компоненты
- Возможности
- Коммуникация с пользователем Настройка уведомлений для личного кабинета на сайте Как настроить чат помощи для пользователей Внедрение чата в личный кабинет пользователя Работа с комментариями к объектам Телеграм боты и отправка сообщений в Telegram в веб-платформе Falcon Space Как создать чат бот ВКонтакте. VK бот для обработки сообщений в группе. Как сделать push уведомление Как отправить Email, SMS или уведомление пользователю Как отправлять SMS с сайта через smsc.ru Отправка email с шаблоном письма Как сделать ежедневную отправку отчета по проекту в групповой чат Telegram? Настройки почты для отправки сообщений с сайта Видеочат. Интеграция с Vox Implant Базовая интеграция с Jitsi Meet (звонки с видео) Отправка СМС через targetsms.ru Как сделать механизм отправки различных писем по шаблону с возможностью редактирования перед отправкой Кастомизация разметки компонента чат
- Дизайн, стилизация, юзабилити
- Лендинги
- Универсальный API
- Примеры интеграций
- Каталоги
- Навигация
- Документы
- Дополнительные компоненты
- Продвижение, SEO
- Системные моменты
- Системное администрирование
- HOWTO
- Таблицы
- Формы
- Загрузка файлов, картинок
- Работа с SQL
- HOWTO JS
- HOWTO Верстка
- Решение проблем
Выгода от использования Falcon Space
В 2-3 раза экономнее и быстрее, чем заказная разработка
Более гибкая, чем коробочные решения и облачные сервисы
Используйте готовые решения и изменяйте под свои потребности
- Шаг 1. Создать концепт проекта
- Шаг 2. Получить оценку бюджета (КП)
- Шаг 3. Заключить договор
- Шаг 4. Создать совместно техническое задание
- Шаг 5. Поэтапная реализация проекта