Chatbot pour Vkontakte sur ASP.NET Core C #

Cet article fournit un exemple étape par étape de création d'un bot de conversation simple sur le réseau social VK sur ASP.NET Core C #.


Chapitre 1. Préparation


Commençons par créer et mettre en place une communauté.




Choisissez n'importe quel type de communauté



Remplissez les champs avec toutes les données et vous avez terminé! Groupe créé.



Configurons l'API



Créer une clé API (autoriser tout)



Afin de répondre à tout événement, notre script doit en savoir plus sur eux. Il existe deux approches pour cela: l'API de rappel et l'interrogation longue. Nous implémenterons l'API de rappel.


Un peu de théorie

L'API de rappel est un outil pour suivre l'activité des utilisateurs dans la communauté VKontakte. En l'utilisant, vous pouvez implémenter, par exemple:


  • Un bot pour envoyer des réponses instantanées aux messages entrants.
  • Le système de modération automatique du contenu.
  • Service de collecte et de traitement des indicateurs d'engagement du public.

L' interrogation longue est une technologie qui vous permet de recevoir des données sur de nouveaux événements à l'aide de «requêtes longues». Le serveur reçoit une demande, mais ne lui envoie pas de réponse immédiatement, mais uniquement lorsqu'un événement se produit (par exemple, un nouveau message arrive) ou que le délai spécifié expire.


En utilisant l'API de rappel, nous n'avons pas besoin de répéter régulièrement les demandes pour suivre les mises à jour - nous les recevrons instantanément.


Configuration de l'API de rappel


Choisir la dernière version de l'API



Sélectionnez le type d'événement "message entrant".



Informations utiles:


  1. Présentation de l'API VK
  2. API de rappel VK
  3. Schéma Json

Chapitre 2. Implémentation de l'API de rappel


Lancez votre IDE préféré, créez une application Web ASP.NET Core.


Type de projet: Web Api
Framework: netcoreapp 2.2



Pour confirmer l'adresse du serveur, nous devons renvoyer une chaîne avec une valeur unique.
Nous le prenons dans les paramètres de l'API de rappel.



Développons la configuration de notre application ASP.NET Core .


Ici, nous allons stocker toutes les clés qui seront impliquées dans le développement.



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

Lorsqu'un événement se produit dans la communauté, VKontakte enverra une demande au serveur avec des données au format JSON avec des informations de base sur l'objet qui a provoqué cet événement.


La structure du JSON entrant.
 { "type":< >, "object":<,  >, "group_id":<ID ,    > } 

Par exemple:


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

Pour faciliter la désérialisation du JSON entrant, nous utiliserons le modèle DTO (Data Transfer Object) .


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

Pour traiter les demandes entrantes, créez 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"); } } } 

Remarque: après avoir reçu la notification, votre serveur doit renvoyer la chaîne "ok" et l'état de HTTP 200. Si le serveur renvoie une erreur plusieurs fois de suite, l'API de rappel cessera temporairement de lui envoyer des notifications.

L'API de rappel est prête!


Informations utiles:


  1. Exemple Github
  2. Sérialisation et désérialisation des données JSON
  3. DI IoC
  4. SDK pour .NET Core 2.2

Chapitre 3. Vk?


Pour interagir avec l' API VK en C #, nous utiliserons la bibliothèque VkNET


Installation via Nuget:
Gestionnaire de packages:
PM> Install-Package VkNet


CLI .NET:
> dotnet add package VkNet


UI:



Informations utiles:


  1. Documentation VkNET

Chapitre 4. Plus de fonctionnalités!


Avant d'étendre la logique du bot, nous autorisons le groupe dans notre application web.
Pour ce faire, enregistrez IVkApi dans le conteneur IoC.


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

Développez maintenant notre CallbackController.cs en ajoutant le traitement des messages entrants.


Nous implémentons IVkApi par analogie avec IConfiguration .


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

Et l'affaire elle-même, qui attrapera de nouveaux messages. Nous y ajoutons un peu de logique.


Quelques documents

RandomId - un identifiant unique (en relation avec l'API_ID et l'ID de l'expéditeur), conçu pour empêcher que le même message ne soit envoyé à nouveau. Il est enregistré avec le message et est disponible dans l'historique des messages.


Le RandomId spécifié est utilisé pour vérifier l'unicité dans l'historique complet des messages, utilisez donc une large plage (jusqu'à int32).


PeerId est l'identifiant de destination.


Texte - le texte du message personnel. Obligatoire si la pièce jointe n'est pas spécifiée.


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

Chapitre 5. Déployer


Maintenant, nous avons besoin d'un serveur où toutes les demandes seront dirigées. Heroku est l' une des options gratuites .


Après vous être inscrit sur le site, nous vous proposerons de créer une nouvelle application.



Saisissez le nom du projet.



Une fois le projet créé, il sera redirigé vers la page Déployer



Heroku CLI nécessite Git . Si vous n'avez pas encore installé Git, téléchargez-le avant d'installer la CLI.

Pour commencer, téléchargez la CLI Heroku .


Nous autorisons le compte Heroku.
$ heroku login


Accédez au répertoire du projet.
$ cd ( )


Créez le répertoire en cours un nouveau sous-répertoire nommé .git contenant tous les fichiers de référentiel nécessaires - la base du référentiel Git.
$ git init


Connectez-vous au référentiel distant (notre projet)
$ heroku git:remote -a ( )


Les buildpacks sont responsables de la conversion du code déployé en slug, qui peut ensuite être exécuté sur dyno.
$ heroku buildpacks:set https://github.com/jincod/dotnetcore-buildpack.git -a ( )


Afin de commencer à suivre (ajouter au contrôle de version) nos fichiers.
$ git add .


$ git commit -am "cookie"


$ git push heroku master


Et allons faire une mouette.


Lorsque notre application est téléchargée sur Heroku, nous pouvons l'ouvrir au lien suivant https: //**PROJECT_NAME**.herokuapp.com/


Nous revenons à notre groupe, et dans les paramètres de l'API de rappel, nous spécifions le lien,
se tournant vers le contrôleur de rappel .
https: //**PROJECT_NAME**.herokuapp.com/api/callback



VK enverra une demande JSON à notre serveur pour confirmer l'adresse. Après la réponse, la notification suivante s'affiche: L' adresse du serveur a été enregistrée avec succès


Nous allons maintenant écrire notre bot dans des messages privés.



Bon codage!

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


All Articles