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

в 16:07, , рубрики: .net, api, C#, c# .net vk api бот вконтакте

В данной статье представлен пошаговый пример создания простого чат-бота в социальной сети 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 ВКонтакте
  2. Callback API VK
  3. JSON-схема

Глава 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 приложения.

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

Чат-бот для Вконтакте на 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).

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
  2. Сериализация и десериализация данных JSON
  3. DI IoC
  4. SDK для .NET Core 2.2

Глава 3. Вк?

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

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

.NET CLI:
> dotnet add package VkNet

UI:

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

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

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

Глава 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.

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

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

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

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

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

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

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

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

Авторизуем 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/

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

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

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

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

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

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

Автор: SadikMaxLK

Источник


  1. Mavi:

    Могли бы вы хотя бы 1 слово написать самостоятельно?! Во всем интернет о деплое только этот урок от хабра, который не работает. Гспд обновите тему хотя бы, как деплоить этого бота

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js