Как создать чат бот ВКонтакте. 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
Falcon Space - функциональная веб-платформа разработки на узком стеке MS SQL/Bootstrap. Вводная по Falcon Space
Насколько полезной была статья?

Google поиск по нашей документации

Falcon Space

Это снижение стоимости владения

за счет меньшего количества людей для поддержки и узкого стека разработки. Про снижение стоимости владения продуктом

Это быстрое внесение изменений

по ходу эксплуатации программы. Как создается функционал на платформе

Это простой удобный интерфейс

адаптация под мобильные устройства. Про юзабилити платформы

Нужна бесплатная консультация?
Получить оценку проекта
Создайте концепцию проекта на основе нашего шаблона и получите оценку проекта в виде КП.
Демо-сайт решений
Базисные решения, которые можно гибко адаптировать под себя: менять внешний вид, бизнес-логику и даже структуру базы данных.
Сайт использует Cookie. Правила конфиденциальности OK