Chatbot para Vkontakte en ASP.NET Core C #

Este artículo proporciona un ejemplo paso a paso de la creación de un bot de chat simple en la red social VK en ASP.NET Core C #.


Capítulo 1. Preparación


Comencemos creando y configurando una comunidad.




Elige cualquier tipo de comunidad



¡Complete los campos con cualquier dato y ya está! Grupo creado.



Vamos a configurar la API



Crear una clave API (Permitir todo)



Para responder a cualquier evento, nuestro script debe aprender sobre ellos. Hay dos enfoques para esto: Callback API y Long Poll. Implementaremos la API de devolución de llamada.


Poco de teoría

Callback API es una herramienta para rastrear la actividad del usuario en la comunidad VKontakte. Utilizándolo puede implementar, por ejemplo:


  • Un bot para enviar respuestas instantáneas a los mensajes entrantes.
  • El sistema de moderación automática de contenido.
  • Servicio para recopilar y procesar indicadores de participación de la audiencia.

Long Polling es una tecnología que le permite recibir datos sobre nuevos eventos mediante "consultas largas". El servidor recibe la solicitud, pero no le envía una respuesta de inmediato, sino solo cuando ocurre un evento (por ejemplo, llega un nuevo mensaje) o el tiempo de espera especificado expira.


Al usar la API de devolución de llamada, no necesitamos repetir solicitudes regularmente para realizar un seguimiento de las actualizaciones; las recibiremos al instante.


Configuración de API de devolución de llamada


Elegir la última versión de la API



Seleccione el tipo de evento "mensaje entrante".



Informacion util:


  1. Presentando la API VK
  2. Callback API VK
  3. Esquema Json

Capítulo 2. Implementación de la API de devolución de llamada


Inicie su IDE favorito, cree una aplicación web básica ASP.NET.


Tipo de proyecto: Web Api
Marco: netcoreapp 2.2



Para confirmar la dirección del servidor, debemos devolver una cadena con un valor único.
Lo tomamos en la configuración de API de devolución de llamada.



Expandamos la configuración de nuestra aplicación ASP.NET Core .


Aquí almacenaremos todas las claves que estarán involucradas en el desarrollo.



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

Cuando ocurre un evento en la comunidad, VKontakte enviará una solicitud al servidor con datos en formato JSON con información básica sobre el objeto que causó este evento.


La estructura del JSON entrante.
 { "type":< >, "object":<,  >, "group_id":<ID ,    > } 

Por ejemplo:


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

Para la conveniencia de deserializar el JSON entrante, utilizaremos el patrón de Objeto de transferencia de datos (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; } } } 

Para procesar las solicitudes entrantes, cree 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"); } } } 

Tenga en cuenta: después de recibir la notificación, su servidor debe devolver la cadena "ok" y el estado de HTTP 200. Si el servidor devuelve un error varias veces seguidas, la API de devolución de llamada dejará de enviarle notificaciones temporalmente.

¡La API de devolución de llamada está lista!


Informacion util:


  1. Ejemplo de Github
  2. Serialización y deserialización de datos JSON
  3. DI IoC
  4. SDK para .NET Core 2.2

Capítulo 3. Vk?


Para interactuar con la API de VK en C #, utilizaremos la biblioteca VkNET


Instalación a través de Nuget:
Administrador de paquetes:
PM> Install-Package VkNet


.NET CLI:
> dotnet add package VkNet


Interfaz de usuario:



Informacion util:


  1. Documentación de VkNET

Capítulo 4. ¡Más funcionalidad!


Antes de expandir la lógica del bot, autorizamos el grupo en nuestra aplicación web.
Para hacer esto, registre IVkApi en el contenedor IoC.


Método Class Startup.cs ConfigureServices .


 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; }); 

Ahora expanda nuestro CallbackController.cs agregando el procesamiento de mensajes entrantes.


Implementamos IVkApi por analogía con IConfiguration .


 using VkNet.Abstractions; private readonly IConfiguration _configuration; private readonly IVkApi _vkApi; public CallbackController(IVkApi vkApi, IConfiguration configuration){ _vkApi = vkApi; _configuration = configuration; } 

Y el caso en sí, que captará nuevos mensajes. En él agregamos un poco de lógica.


Alguna documentación

RandomId : un identificador único (en relación con la API_ID y la ID del remitente), diseñado para evitar que se envíe nuevamente el mismo mensaje. Se guarda con el mensaje y está disponible en el historial de mensajes.


El RandomId especificado se usa para verificar la unicidad en todo el historial de mensajes, por lo tanto, use un rango amplio (hasta int32).


PeerId es el identificador de destino.


Texto : el texto del mensaje personal. Se requiere si no se especifica el archivo adjunto.


 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; } 

Capítulo 5. Implementar


Ahora necesitamos un servidor donde se dirijan todas las solicitudes. Una de las opciones gratuitas es Heroku .


Después de registrarse en el sitio, le ofreceremos crear una nueva aplicación.



Ingrese el nombre del proyecto.



Una vez creado el proyecto, será redirigido a la página de implementación



Heroku CLI requiere Git . Si aún no tiene instalado Git, descárguelo antes de instalar la CLI.

Para comenzar, descargue la CLI de Heroku .


Autorizamos la cuenta de Heroku.
$ heroku login


Ir al directorio del proyecto.
$ cd ( )


Cree en el directorio actual un nuevo subdirectorio llamado .git que contenga todos los archivos de repositorio necesarios, la base del repositorio de Git.
$ git init


Conéctese al repositorio remoto (nuestro proyecto)
$ heroku git:remote -a ( )


Los paquetes de compilación son responsables de convertir el código implementado en slug, que luego se puede ejecutar en dyno.
$ heroku buildpacks:set https://github.com/jincod/dotnetcore-buildpack.git -a ( )


Para comenzar a rastrear (agregar al control de versiones) nuestros archivos.
$ git add .


$ git commit -am "cookie"


$ git push heroku master


Y vamos a hacer una gaviota.


Cuando nuestra aplicación se carga en Heroku, podemos abrirla en el siguiente enlace https: //**PROJECT_NAME**.herokuapp.com/


Regresamos a nuestro grupo, y en la configuración de API de devolución de llamada especificamos el enlace,
recurriendo al controlador de devolución de llamada .
https: //**PROJECT_NAME**.herokuapp.com/api/callback



VK enviará una solicitud JSON a nuestro servidor para confirmar la dirección. Después de la respuesta, se mostrará la siguiente notificación: la dirección del servidor se guardó correctamente


Ahora escribiremos nuestro bot en mensajes privados.



Buena codificación!

Source: https://habr.com/ru/post/441720/


All Articles