- PVSM.RU - https://www.pvsm.ru -

Чат-бот для Вконтакте на ASP.NET Core C#

В данной статье представлен пошаговый пример создания простого чат-бота в социальной сети VK на ASP.NET Core C#.

Глава 1. Подготовка

Начнем с создания и настройки сообщества.

Чат-бот для Вконтакте на ASP.NET Core C# - 1

Чат-бот для Вконтакте на ASP.NET Core C# - 2

Выбираем любой тип сообщества

Чат-бот для Вконтакте на ASP.NET Core C# - 3

Заполняем поля любыми данными и готово! Группа создана.

Чат-бот для Вконтакте на ASP.NET Core C# - 4

Приступим к настройке API

Чат-бот для Вконтакте на ASP.NET Core C# - 5

Создаем API ключ (Разрешаем все)

Чат-бот для Вконтакте на ASP.NET Core C# - 6

Чтобы реагировать на какие-либо события, наш скрипт должен о них узнать. Для этого существуют два подхода — Callback API и Long Poll. Мы будем реализовывать Callback API.

Немного теории

Callback API — это инструмент для отслеживания активности пользователей в сообществе ВКонтакте. С его помощью можно реализовать, например:

  • Бота для отправки мгновенных ответов на поступающие сообщения.
  • Систему автоматической модерации контента.
  • Сервис для сбора и обработки показателей вовлеченности аудитории.

Настройка Callback API

Выбираем последнюю версию API

Чат-бот для Вконтакте на ASP.NET Core C# - 7

Выбираем тип события "входящее сообщение".

Чат-бот для Вконтакте на ASP.NET Core C# - 8

Полезная информация:

  1. Знакомство с API ВКонтакте [1]
  2. Callback API VK [2]
  3. JSON-схема [3]

Глава 2. Реализация Callback API

Запускаем любимую IDE, создаем ASP.NET Core Web Application.

Тип проекта: Web Api
Framework: netcoreapp 2.2

Чат-бот для Вконтакте на ASP.NET Core C# - 9

Для подтверждения адреса сервера нам потребуется вернуть строку с уникальным значением.
Берем ее в настройках Callback API.

Чат-бот для Вконтакте на ASP.NET Core C# - 10

Расширим конфигурацию нашего ASP.NET Core приложения [4].

Здесь мы будем хранить все ключи, которые будут задействованы в разработке.

Чат-бот для Вконтакте на ASP.NET Core C# - 11

{
  "Config": {
    "AccessToken": "0bd8573ea40badd694b4da0bbc7d54f52996",
    "Confirmation" : "b23557a3"
  },
  "Logging": {
    "LogLevel": {
    "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}

Когда в сообществе произойдет событие, ВКонтакте отправит на сервер запрос с данными в формате JSON с основной информацией об объекте, вызвавшем данное событие.

Структура входящего JSON.

{  
   "type":<тип события>,
   "object":<объект, инициировавший событие>,
   "group_id":<ID сообщества, в котором произошло событие>
}

Например:

{  
   "type":"group_join",
   "object":{  
      "user_id":1,
      "join_type":"approved"
   },
   "group_id":1
}

Для удобства десериализации входящего JSON воспользуемся паттерном Data Transfer Object (DTO) [5].

using System;
using Newtonsoft.Json;

namespace Cookie.Controllers
{
    [Serializable]
    public class Updates
    {
        /// <summary>
        /// Тип события
        /// </summary>
        [JsonProperty("type")]
        public string Type { get; set; }

        /// <summary>
        /// Объект, инициировавший событие
        /// Структура объекта зависит от типа уведомления
        /// </summary>
        [JsonProperty("object")]
        public JObject Object { get; set; }

        /// <summary>
        /// ID сообщества, в котором произошло событие
        /// </summary>
        [JsonProperty("group_id")]
        public long GroupId { get; set; }
    }
}

Для обработки входящих запросом создадим CallbackController.cs.

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;

namespace Cookie.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class CallbackController : ControllerBase
    {
        /// <summary>
        /// Конфигурация приложения
        /// </summary>
        private readonly IConfiguration _configuration;

        public CallbackController(IConfiguration configuration)
        {
            _configuration = configuration;
        }

        [HttpPost]
        public IActionResult Callback([FromBody] Updates updates)
        {
            // Проверяем, что находится в поле "type" 
            switch (updates.Type)
            {
                // Если это уведомление для подтверждения адреса
                case "confirmation":
                        // Отправляем строку для подтверждения 
                    return Ok(_configuration["Config:Confirmation"]);
            }
                // Возвращаем "ok" серверу Callback API
            return Ok("ok");
        }
    }
}

Обратите внимание: после получения уведомления Ваш сервер должен возвращать строку "ok" и статус HTTP 200. Если сервер несколько раз подряд вернет ошибку, Callback API временно перестанет отправлять на него уведомления

Callback API готов!

Полезная информация:

  1. Пример на github [6]
  2. Сериализация и десериализация данных JSON [7]
  3. DI IoC [8]
  4. SDK для .NET Core 2.2 [9]

Глава 3. Вк?

Для взаимодействия с VK API [10] на C# воспользуемся библиотекой VkNET [11]

Установка через Nuget:
Package manager:
PM> Install-Package VkNet

.NET CLI:
> dotnet add package VkNet

UI:

Чат-бот для Вконтакте на ASP.NET Core C# - 12

Полезная информация:

  1. Документация VkNET [12]

Глава 4. Больше функционала!

Перед расширением логики бота, авторизуем группу в нашем веб-приложении.
Для этого регистрируем IVkApi в IoC-контейнере.

using VkNet;
using VkNet.Abstractions;
using VkNet.Model;

services.AddSingleton<IVkApi>(sp => {
     var api = new VkApi();
     api.Authorize(new ApiAuthParams{ AccessToken = Configuration["Config:AccessToken"] });
     return api;
});

Теперь расширим наш контроллер, добавив обработку входящих сообщений.

Внедряем IVkApi

using VkNet.Abstractions;

private readonly IConfiguration _configuration;

private readonly IVkApi _vkApi;

public CallbackController(IVkApi vkApi, IConfiguration configuration){
     _vkApi = vkApi;
     _configuration = configuration;
}

И сам кейс, который будет ловить новые сообщения. В нем мы добавить немного логики.

Немного документации

RandomId — уникальный (в привязке к API_ID и ID отправителя) идентификатор, предназначенный для предотвращения повторной отправки одинакового сообщения. Сохраняется вместе с сообщением и доступен в истории сообщений.

Заданный RandomId используется для проверки уникальности за всю историю сообщений, поэтому используйте большой диапазон(до int32).

PeerId — идентификатор назначения.

Text — текст личного сообщения. Обязательный параметр, если не задан параметр attachment.

using VkNet.Model;
using VkNet.Model.RequestParams;
using VkNet.Utils;

case "message_new":{
    // Десериализация
    var msg = Message.FromJson(new VkResponse(updates.Object));

    // Отправим в ответ полученный от пользователя текст
   _vkApi.Messages.Send(new MessagesSendParams{ 
       RandomId = new DateTime().Millisecond,
       PeerId = msg.PeerId.Value,
       Message = msg.Text
    });
    break;
}

Глава 5. Деплой

Теперь нам потребуется сервер, куда будут направлены все запросы. Один из бесплатных вариантов это Heroku [13].

После регистрации на сайте, нам предложат создать новое приложение.

Чат-бот для Вконтакте на ASP.NET Core C# - 13

Вводим название проекта.

Чат-бот для Вконтакте на ASP.NET Core C# - 14

После создания проекта, будет перенаправление на страницу Deploy

Чат-бот для Вконтакте на ASP.NET Core C# - 15

Для Heroku CLI требуется Git [14]. Если у вас еще не установлен Git, то скачайте его перед установкой CLI.

Для начала скачаем Heroku CLI [15].

Авторизуем Heroku аккаунт.
$ heroku login

Переходим в проектный каталог.
$ cd (путь до проекта)

Создаём текущем каталоге новый подкаталог с именем .git содержащий все необходимые файлы репозитория — основу Git-репозитория.
$ git init

Подключаемся к удалённому репозиторию (нашему проекту)
$ heroku git:remote -a (название проекта)

Buildpacks отвечают за преобразование развернутого кода в slug, который затем может быть выполнен на dyno.
$ heroku buildpacks:set https://github.com/jincod/dotnetcore-buildpack.git -a (название проекта)

Для того чтобы начать отслеживать (добавить под версионный контроль) наши файлы.
$ git add .

$ git commit -am "cookie"

$ git push heroku master

И идем делать чаёк.

Когда наше приложение будет загружено на Heroku, то мы сможем открыть его по следующей ссылке https://**PROJECT_NAME**.herokuapp.com/ [16]

Возвращаемся в нашу группу, и в настройках Callback API указываем ссылку,
обращаяясь к Callback контроллеру.

Чат-бот для Вконтакте на ASP.NET Core C# - 16

Вк отправит JSON запрос на наш сервер, чтобы подтвердить адрес. После ответа будет выведено следующее уведомление: Адрес сервера успешно сохранён

Теперь напишем нашему боту в личные сообщения.

Чат-бот для Вконтакте на ASP.NET Core C# - 17

Удачного кодинга!

Автор: SadikMaxLK

Источник [17]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/c-2/309874

Ссылки в тексте:

[1] Знакомство с API ВКонтакте: https://vk.com/dev/first_guide

[2] Callback API VK: https://vk.com/dev/callback_api

[3] JSON-схема: https://vk.com/dev/json_schema

[4] конфигурацию нашего ASP.NET Core приложения: https://docs.microsoft.com/ru-ru/aspnet/core/fundamentals/configuration/?view=aspnetcore-2.2

[5] Data Transfer Object (DTO): https://docs.microsoft.com/ru-ru/aspnet/web-api/overview/data/using-web-api-with-entity-framework/part-5

[6] Пример на github: https://github.com/atckun/VkNetCallbackTemplate

[7] Сериализация и десериализация данных JSON: https://docs.microsoft.com/ru-ru/dotnet/framework/wcf/feature-details/how-to-serialize-and-deserialize-json-data

[8] DI IoC: https://habr.com/ru/post/131993/

[9] SDK для .NET Core 2.2: https://dotnet.microsoft.com/download

[10] VK API: https://vk.com/dev/manuals

[11] VkNET: https://github.com/vknet/vk

[12] Документация VkNET: https://vknet.github.io/vk/

[13] Heroku: http://heroku.com

[14] Git: https://git-scm.com/book/en/v2/Getting-Started-Installing-Git

[15] Heroku CLI: https://devcenter.heroku.com/articles/heroku-cli

[16] https://**PROJECT_NAME**.herokuapp.com/: https://**PROJECT_NAME**.herokuapp.com/

[17] Источник: https://habr.com/ru/post/441720/?utm_campaign=441720