【问题标题】:TeamsBot - How do I get the Team Id from a conversationupdate event?TeamsBot - 如何从对话更新事件中获取团队 ID?
【发布时间】:2021-04-16 13:29:51
【问题描述】:

我正在安装 Teams 机器人并将其添加到团队中。当我将它添加到团队中时,在初次调用时,我在 OnTurnAsync 中正确获得了“conversationUpdate”事件。我遇到的问题是,任何获取团队本身的调用都失败了,因为我可以看到那里没有任何东西可以让 Id 调用以获取团队数据。

我希望能够将它添加到团队,获取该事件,然后获取与它添加到的团队相关的数据。

这是我正在尝试的。

        private const string ActOnType = "conversationUpdate";

        public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default)
        {
            if (IsConversationUpdate(turnContext))
            {
                // This fails because TeamsGetInfo is returning null
                var teamDetails = await TeamsInfo.GetTeamDetailsAsync(turnContext,  turnContext.Activity.TeamsGetTeamInfo().Id, cancellationToken);
            }
        }

        private bool IsConversationUpdate(ITurnContext turnContext) => string.Equals(turnContext.Activity.Type,
            ActOnType, StringComparison.InvariantCultureIgnoreCase);

其他说明...
turnContext.Activity.TeamsGetChannelId() 为空,ChannelData 也是如此。 任何进一步的调用都有频道数据,但我将机器人添加到团队的初始调用没有。

从通话中添加我的 JSON

{
    "membersAdded": [
        {
            "id": "29:1HqtPeQvYpNL682R_NeBMndg6kYbZbBHsZliZdAT2xWsJWzS0_b50S1ijo2hmPu5i0HTrvqPiOBxqpbtJjS7zyja",
            "aadObjectId": "{valid guid}"
        },
        {
            "id": "28:{valid guid}"
        }
    ],
    "type": "conversationUpdate",
    "timestamp": "2021-01-11T18:15:49.9118003Z",
    "id": "f:{valid guid}",
    "channelId": "msteams",
    "serviceUrl": "https://smba.trafficmanager.net/amer/",
    "from": {
        "id": "29:1HqtPeQvYpNL682R_NeBMndg6kXaZbBHsZliZdAT2xWsJWzS0_gOS1ijo2hmPu5i0HTrvqPiOBxqpbtJjS6zyjA",
        "aadObjectId": "{valid guid}"
    },
    "conversation": {
        "conversationType": "personal",
        "tenantId": "{valid guid}",
        "id": "a:1UgWdBcfpF4JUtOCCjQZsvhjl-QK9YBBnALG7ACgA0QdKx_xGICsQ3d6l94t_pPed7fvtnwSnRlYcWe7kXT7dStP-YCtuvliI8GPZj9Sd5P2wHsBAAn1ibwdad4Lq-O3B"
    },
    "recipient": {
        "id": "28:{valid guid}",
        "name": "LocalBot"
    },
    "channelData": {
        "tenant": {
            "id": "{valid guid}"
        }
    }
}  

【问题讨论】:

  • 你的机器人的基类是什么?
  • @HiltonGiesnow TeamsActivityHandler

标签: c# botframework microsoft-teams


【解决方案1】:

我正在查看我拥有的旧对话更新日志,其中肯定有一个 TeamId - 我无法想象它已被删除。您可以通过查看 ngrok 日志 (http://127.0.0.1:4040) 来检查您是否在本地工作。如果它在那里,它可能由于某种原因没有填充到TeamsChannelData,但您仍然可以通过访问activity.ChannelData 本身直接访问它。

[更新] 这是我在 2020 年某个时候保存的旧有效载荷的示例:

"channelData": {
        "team": {
            "id": "19:02...55@thread.skype",
            "name": "[Group Name]",
            "aadGroupId": "[Guid]"
        },
        "eventType": "teamMemberAdded",
        "tenant": {
            "id": "[Guid]"
        }
    }

【讨论】:

  • 我已经从通话中添加了我的 JSON。它说 {valid guid} 是我替换的有效 GUID。我没有看到可用的 TeamId。 f:GUID 引发错误请求。 Activity.ChannelData 只有租户数据。
  • From 和 Recipient 也抛出 BadRequest
  • 是的,这确实很奇怪 - 请参阅我的更新答案以及示例有效负载。我不知道 Teams 中是否发生了某些变化,或者您是否遇到了负载问题。这里有很多来自 Teams 的人,所以他们可能能够在幕后更多地了解这一点。
  • 我会尝试上面@HiltonGiesenow 的建议;在过去,我尝试过类似的线路并且它有效。但我听说你听到了一个糟糕的请求,这很糟糕。您可能想使用 NGROK 来查看那里发生了什么。除此之外,我记得一个related older thread, but they use it differently 看看它是否有帮助。
【解决方案2】:

您也可以在 OnMessageActivityAsync 中找到这些频道数据。 enter image description here

【讨论】:

    【解决方案3】:

    我会在这里发布答案,以防有人进入...

    您只能在机器人加入团队时获得一次此事件。如果您错过了它,您将不再获得数据。卸载并重新安装机器人不会再次触发该事件。如果您仍然没有收到,建议您从 Azure 中删除该应用,然后使用相同的名称重新执行。

    github discussion上查看更多信息

    在我们的场景中,我认为这方面的限制不在我认为可行的解决方案的范围内,因此我决定采用不同的途径来获取团队数据。由于数据是在这之后的事件中通过的,所以我抓住它并做我需要做的事情。

    【讨论】:

      【解决方案4】:

      https://github.com/microsoft/botbuilder-dotnet的源代码中搜索了一下,发现有两个东西表明你的turnContext中没有Channel。

      代码如下:

      // Microsoft.Bot.Builder.Teams.TeamsActivityExtensions
      public static TeamInfo TeamsGetTeamInfo(this IActivity activity)
      {
          var channelData = activity.GetChannelData<TeamsChannelData>();
          return channelData?.Team;
      }
      
      // Microsoft.Bot.Schema.Activity
      public TypeT GetChannelData<TypeT>()
      {
          if (this.ChannelData == null)
          {
              return default(TypeT);
          }
      
          if (this.ChannelData.GetType() == typeof(TypeT))
          {
              return (TypeT)this.ChannelData;
          }
      
          return ((JObject)this.ChannelData).ToObject<TypeT>();
      }
      
      
      

      【讨论】:

      • 这是我的问题,我希望有办法解决。任何后续调用都有频道数据,但我将机器人添加到团队的初始调用没有。
      • 我们正在与我们的团队进行内部检查,很快就会回复您。
      猜你喜欢
      • 1970-01-01
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多