- PVSM.RU - https://www.pvsm.ru -
В данной статье представлен пошаговый пример создания простого чат-бота в социальной сети VK на ASP.NET Core C#.
Начнем с создания и настройки сообщества.


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

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

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

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

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

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

Полезная информация:
Запускаем любимую IDE, создаем ASP.NET Core Web Application.
Тип проекта: Web Api
Framework: netcoreapp 2.2

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

Расширим конфигурацию нашего ASP.NET Core приложения [4].
Здесь мы будем хранить все ключи, которые будут задействованы в разработке.

{
"Config": {
"AccessToken": "0bd8573ea40badd694b4da0bbc7d54f52996",
"Confirmation" : "b23557a3"
},
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*"
}
Когда в сообществе произойдет событие, ВКонтакте отправит на сервер запрос с данными в формате 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 готов!
Полезная информация:
Для взаимодействия с VK API [10] на C# воспользуемся библиотекой VkNET [11]
Установка через Nuget:
Package manager:
PM> Install-Package VkNet
.NET CLI:
> dotnet add package VkNet
UI:

Полезная информация:
Перед расширением логики бота, авторизуем группу в нашем веб-приложении.
Для этого регистрируем 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;
}
Теперь нам потребуется сервер, куда будут направлены все запросы. Один из бесплатных вариантов это Heroku [13].
После регистрации на сайте, нам предложат создать новое приложение.

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

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

Для 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 контроллеру.

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

Удачного кодинга!
Автор: 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
Нажмите здесь для печати.