Initier un message de bot à l’utilisateur sur BotFramework

J’ai un bot construit sur BotFramework 3.5 et hébergé sur Azure en tant qu’application Web. Je n’ai rencontré aucun problème lors de la mise en œuvre de scénarios dans lesquels le bot devait répondre aux commentaires de l’utilisateur. Cependant, il est nécessaire de lui apprendre à démarrer les conversations selon un horaire déterminé. Pour atteindre cet objective, j’ai créé un WebJob qui est essentiellement une application console simple. Voici un code utilisé pour initier un message de bot à utilisateur:

var botAccount = new ChannelAccount(id: from); var userAccount = new ChannelAccount(id: to); var conversation = new ConversationAccount(false, conversationId); var connector = new ConnectorClient(serviceUrl); IMessageActivity message = Activity.CreateMessageActivity(); message.From = botAccount; message.Recipient = userAccount; message.Conversation = conversation; message.Text = text; message.Locale = locale; await connector.Conversations.SendToConversationAsync((Activity)message); 

from, to, serviceUrl, conversationId – sont tirés de la conversation précédente, alors je suppose qu’ils sont valides. Cependant, SendToConversationAsync exception SendToConversationAsync est levée:

 System.UnauthorizedAccessException: Authorization for Microsoft App ID 3a26a4d4-f75a-4feb-b3e0-37a7fa24e5fc failed with status code Unauthorized and reason phrase 'Unauthorized' ---> System.Net.Http.HttpRequestException: Response status code does not indicate success: 401 (Unauthorized) 

Le fichier app.config contient les mêmes valeurs que l’API de bot d’origine, y compris AppId et AppSecret. J’ai vu quelques questions soulevées sur le même sujet, mais je n’ai pas réussi à trouver de réponse.

Est-ce que je manque quelque chose? Est-ce une approche valide d’envoyer des messages de la part de bot depuis l’application console?

Selon votre description, j’ai suivi ce didacticiel pour vous familiariser avec le connecteur, ainsi que pour l’envoi et la réception d’activités.

Sur la base de votre code, j’ai créé mon application console et je pouvais reproduire le même problème, puis j’ai trouvé un problème git concernant le même problème. Après quelques essais, je pourrais le faire fonctionner comme prévu de mon côté, vous pouvez vous y référer:

 MicrosoftAppCredentials.TrustServiceUrl("{ServiceUrl}", DateTime.Now.AddDays(7)); var account=new MicrosoftAppCredentials("MicrosoftAppIdKey", "MicrosoftAppPasswordKey"); var connector = new ConnectorClient(new Uri("{ServiceUrl}"),account); 

OU

Implémentez votre DelegatingHandler

 public class MyDelegatingHandler : DelegatingHandler { private ssortingng _token; public MyDelegatingHandler(ssortingng token) { _token = token; } protected override Task SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", _token); return base.SendAsync(request, cancellationToken); } } 

Ensuite, vous devez créer votre ConnectorClient comme suit:

 var account=new MicrosoftAppCredentials("{MicrosoftAppIdKey}", "{MicrosoftAppPasswordKey}"); var jwtToken=await account.GetTokenAsync(); var connector = new ConnectorClient(new Uri("{serviceUrl}"),handlers:new MyDelegatingHandler(jwtToken)); 

Voici l’extrait de code de mon application console, vous pouvez vous y référer:

 try { var userAccount = new ChannelAccount() { Id = "default-user", Name = "user" }; var botAccount = new ChannelAccount() { Id = "934493jn5f6f348f", Name = "console-Bot" }; ssortingng url = "{serviceUrl}"; MicrosoftAppCredentials.TrustServiceUrl(url, DateTime.Now.AddDays(7)); var account = new MicrosoftAppCredentials("{MicrosoftAppIdKey}", "{MicrosoftAppPasswordKey}"); var connector = new ConnectorClient(new Uri(url), account); IMessageActivity message = Activity.CreateMessageActivity(); message.From = botAccount; message.Recipient = userAccount; message.Conversation = new ConversationAccount() { Id = "{conversationId}" }; message.Text = "Message sent from console application!!!"; message.Locale = "en-us"; var response = await connector.Conversations.SendToConversationAsync((Activity)message); Console.WriteLine($"response:{response.Id}"); } catch (Exception e) { Console.WriteLine($"exception:{e.Message}\r\n{e.StackTrace}"); } 

Résultat

entrez la description de l'image ici

Essayez de créer une nouvelle conversation comme celle-ci:

 var conversationId = await connector.Conversations.CreateDirectConversationAsync(botAccount, userAccount);