【问题标题】:Bot Framework bot can't post in Microsoft Teams channel without being prompted [duplicate]Bot Framework 机器人无法在没有提示的情况下在 Microsoft Teams 频道中发布
【发布时间】:2017-09-26 19:24:49
【问题描述】:

我有一个使用 Microsoft Bot Framework 构建的机器人,在 Azure 应用服务中发布,我想在 Microsoft Teams 频道中发布该机器人以响应 POST 调用。我在继承自 ApiController 的 WebhookAPIController 类中有以下内容:

[HttpPost]
[Route("api/WebhookAPI")]
public async Task<HttpResponseMessage> RespondToWebhook([FromBody] PostTestModel value)
{
    try
    {
        await CreateChannelConversation(value.text);
        var resp = new HttpResponseMessage(HttpStatusCode.OK);
        return resp;
    }
    catch (Exception ex)
    {
        return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
    }            
}

private async Task CreateChannelConversation(string value)
{
    var connector = new ConnectorClient(new Uri(System.Configuration.ConfigurationManager.AppSettings["serviceUrl"]));
    var channelData = new Dictionary<string, string>();
    channelData["teamsChannelId"] = System.Configuration.ConfigurationManager.AppSettings["ChannelId"];
    IMessageActivity newMessage = Activity.CreateMessageActivity();
    newMessage.Type = ActivityTypes.Message;
    newMessage.Text = "Hello channel.";
    ConversationParameters conversationParams = new ConversationParameters(
        isGroup: true,
        bot: null,
        members: null,
        topicName: "Test Conversation",
        activity: (Activity)newMessage,
        channelData: channelData);
    var result = await connector.Conversations.CreateConversationAsync(conversationParams);
}

此代码从 AppSettings 中获取服务 URL 和 Channel ID;据我所知,给定 Teams 频道的频道 ID 永远不会改变。但是,当我对 (bot URL)/api/WebhookAPI 进行 POST 调用时,没有发布任何消息,并且我收到以下错误消息作为响应:

{
    "message": "An error has occurred.",
    "exceptionMessage": "Authorization for Microsoft App ID [ID omitted] failed with status code Unauthorized and reason phrase 'Unauthorized'",
    "exceptionType": "System.UnauthorizedAccessException",
    "stackTrace": "   at Microsoft.Bot.Connector.JwtTokenRefresher.<SendAsync>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)\r\n   at Microsoft.Bot.Connector.Conversations.<CreateConversationWithHttpMessagesAsync>d__5.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at Microsoft.Bot.Connector.ConversationsExtensions.<CreateConversationAsync>d__1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at WebhookTestBot.Controllers.WebhookAPIController.<CreateChannelConversation>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at WebhookTestBot.Controllers.WebhookAPIController.<RespondToWebhook>d__1.MoveNext()",
    "innerException": {
    "message": "An error has occurred.",
    "exceptionMessage": "Response status code does not indicate success: 401 (Unauthorized).",
    "exceptionType": "System.Net.Http.HttpRequestException",
    "stackTrace": "   at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()\r\n   at Microsoft.Bot.Connector.JwtTokenRefresher.<SendAsync>d__2.MoveNext()"
}

但是,如果我首先@-提及频道中的机器人,则 POST 调用会返回 200,并且机器人会在频道中发布。有没有一种方法可以让我的机器人能够在不被提及的情况下在频道中发帖?

【问题讨论】:

    标签: c# azure botframework microsoft-teams


    【解决方案1】:

    得到它的工作,感谢this answer。在调用 CreateConversationAsync() 之前将以下代码添加到 CreateChannelConversation():

    MicrosoftAppCredentials.TrustServiceUrl(ConfigurationManager.AppSettings["serviceUrl"], DateTime.MaxValue);

    【讨论】:

      【解决方案2】:

      所以您对 serviceUrl 和 ChannelID 都进行了硬编码?当您@提及它时,频道 ID 是否与机器人收到的内容相匹配?它应该看起来像这样:“19:693ecdb923ac4458a5c23661b505fc84@thread.skype” 另请注意:the teamsChannelId is being deprecated in the future,因此您应该改为更改为 channelData.channel.id。我将在 MSDN 上更新示例代码。

      无论如何,假设硬编码值与您所在的频道匹配,您的代码应该可以工作,并且可以在我的测试用例中工作。

      您说您首先@提及该机器人并且它有效。你能详细解释一下你的测试用例吗?

      【讨论】:

        【解决方案3】:

        尝试将凭据添加到 ConnectorClient 构造函数:

        string appId = ConfigurationManager.AppSettings["MicrosoftAppId"];
        string appPassword = ConfigurationManager.AppSettings["MicrosoftAppPassword"];
        var appCredentials = new MicrosoftAppCredentials(appId, appPassword);
        var connector = new ConnectorClient(new Uri(ConfigurationManager.AppSettings["serviceUrl"]), appCredentials );
        

        【讨论】:

          猜你喜欢
          • 2017-05-20
          • 2019-06-17
          • 2020-07-26
          • 2017-12-19
          • 1970-01-01
          • 1970-01-01
          • 2018-05-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多