Chatbot para Vkontakte no ASP.NET Core C #

Este artigo fornece um exemplo passo a passo da criação de um bot de bate-papo simples na rede social VK no ASP.NET Core C #.


Capítulo 1. Preparação


Vamos começar criando e configurando uma comunidade.




Escolha qualquer tipo de comunidade



Preencha os campos com todos os dados e pronto! Grupo criado.



Vamos configurar a API



Criar uma chave de API (permitir tudo)



Para responder a qualquer evento, nosso script deve aprender sobre eles. Existem duas abordagens para isso - API de retorno de chamada e Pesquisa longa. Vamos implementar a API de retorno de chamada.


Pouco de teoria

A API de retorno de chamada é uma ferramenta para rastrear a atividade do usuário na comunidade VKontakte. Usando-o, você pode implementar, por exemplo:


  • Um bot para enviar respostas instantâneas às mensagens recebidas.
  • O sistema de moderação automática de conteúdo.
  • Serviço para coleta e processamento de indicadores de engajamento do público.

A pesquisa longa é uma tecnologia que permite que você receba dados sobre novos eventos usando "consultas longas". O servidor recebe uma solicitação, mas não envia uma resposta imediatamente, mas somente quando ocorre um evento (por exemplo, uma nova mensagem chega) ou o tempo limite especificado expira.


Usando a API de retorno de chamada, não precisamos repetir solicitações regularmente para acompanhar as atualizações - nós as receberemos instantaneamente.


Configuração da API de retorno de chamada


Escolha a versão mais recente da API



Selecione o tipo de evento "mensagem recebida".



Informações úteis:


  1. Apresentando a API VK
  2. API de retorno de chamada VK
  3. Esquema Json

Capítulo 2. Implementando a API de Retorno de Chamada


Inicie seu IDE favorito, crie um aplicativo Web ASP.NET Core.


Tipo de Projeto: API da Web
Estrutura: netcoreapp 2.2



Para confirmar o endereço do servidor, precisamos retornar uma string com um valor único.
Tomamos isso nas configurações da API de retorno de chamada.



Vamos expandir a configuração do nosso aplicativo ASP.NET Core .


Aqui vamos armazenar todas as chaves que estarão envolvidas no desenvolvimento.



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

Quando um evento ocorre na comunidade, o VKontakte envia uma solicitação ao servidor com dados no formato JSON com informações básicas sobre o objeto que causou esse evento.


A estrutura do JSON recebido.
 { "type":< >, "object":<,  >, "group_id":<ID ,    > } 

Por exemplo:


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

Para a conveniência de desserializar o JSON recebido, usaremos o padrão 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; } } } 

Para processar solicitações de entrada, crie 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"); } } } 

Observação: após receber a notificação, seu servidor retornará a string "ok" e o status HTTP 200. Se o servidor retornar um erro várias vezes seguidas, a API de retorno de chamada interromperá temporariamente o envio de notificações.

A API de retorno de chamada está pronta!


Informações úteis:


  1. Exemplo do Github
  2. Serializando e desserializando dados JSON
  3. DI IoC
  4. SDK para .NET Core 2.2

Capítulo 3. Vk?


Para interagir com a API VK em C #, usaremos a biblioteca VkNET


Instalação via Nuget:
Gerenciador de pacotes:
PM> Install-Package VkNet


CLI do .NET:
> dotnet add package VkNet


UI:



Informações úteis:


  1. Documentação VkNET

Capítulo 4. Mais funcionalidade!


Antes de expandir a lógica do bot, autorizamos o grupo em nosso aplicativo da web.
Para fazer isso, registre IVkApi no contêiner de IoC.


Classe Startup.cs método 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; }); 

Agora expanda nosso CallbackController.cs adicionando o processamento de mensagens recebidas.


Implementamos IVkApi por analogia com a IConfiguration .


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

E o caso em si, que irá capturar novas mensagens. Nele, adicionamos um pouco de lógica.


Alguma documentação

RandomId - um identificador exclusivo (em relação ao API_ID e ao ID do remetente), projetado para impedir que a mesma mensagem seja enviada novamente. Ele é salvo com a mensagem e está disponível no histórico de mensagens.


O RandomId especificado é usado para verificar a exclusividade em todo o histórico de mensagens, portanto, use um grande intervalo (até int32).


PeerId é o identificador de destino.


Texto - o texto da mensagem pessoal. Necessário se o anexo não for especificado.


 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


Agora precisamos de um servidor para o qual todos os pedidos serão direcionados. Uma das opções gratuitas é o Heroku .


Após o registro no site, ofereceremos a criação de um novo aplicativo.



Digite o nome do projeto.



Após a criação do projeto, ele será redirecionado para a página Implementar



O Heroku CLI requer Git . Se você ainda não possui o Git instalado, faça o download antes de instalar a CLI.

Para começar, faça o download da Heroku CLI .


Nós autorizamos a conta Heroku.
$ heroku login


Vá para o diretório do projeto.
$ cd ( )


Crie no diretório atual um novo subdiretório chamado .git, contendo todos os arquivos de repositório necessários - a base do repositório Git.
$ git init


Conecte-se ao repositório remoto (nosso projeto)
$ heroku git:remote -a ( )


Os buildpacks são responsáveis ​​por converter o código implantado em slug, que pode ser executado no dinamômetro.
$ heroku buildpacks:set https://github.com/jincod/dotnetcore-buildpack.git -a ( )


Para começar a rastrear (adicionar ao controle de versão) nossos arquivos.
$ git add .


$ git commit -am "cookie"


$ git push heroku master


E vamos fazer uma gaivota.


Quando o aplicativo é carregado no Heroku, podemos abri-lo no seguinte link https: //**PROJECT_NAME**.herokuapp.com/


Voltamos ao nosso grupo e, nas configurações da API de retorno de chamada, especificamos o link,
voltando para o controlador de retorno de chamada .
https: //**PROJECT_NAME**.herokuapp.com/api/callback



O VK enviará uma solicitação JSON ao nosso servidor para confirmar o endereço. Após a resposta, a seguinte notificação será exibida: Endereço do servidor salvo com sucesso


Agora vamos escrever nosso bot em mensagens privadas.



Boa codificação!

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


All Articles