Как создать чат бот ВКонтакте. 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

В 2-3 раза экономнее и быстрее, чем заказная разработка
Более гибкая, чем коробочные решения и облачные сервисы
Используйте готовые решения и изменяйте под свои потребности
Нужна бесплатная консультация?
Планируете делать веб-проект?
Сайт использует Cookie. Правила конфиденциальности OK