Как создать чат бот ВКонтакте. 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
Это снижение стоимости владения
за счет меньшего количества людей для поддержки и узкого стека разработки. Про снижение стоимости владения продуктом
Это быстрое внесение изменений
по ходу эксплуатации программы. Как создается функционал на платформе
Это простой удобный интерфейс
адаптация под мобильные устройства. Про юзабилити платформы