TeamsBot - 如何从对话更新事件中获取团队 ID?

TeamsBot - How do I get the Team Id from a conversationupdate event?

我正在安装 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}"
        }
    }
}  

https://github.com/microsoft/botbuilder-dotnet 的源代码中搜索了一下,发现两件事表明 turnContext 中没有频道。

代码如下:

// 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>();
}


我正在查看旧的 conversationUpdate 日志,其中肯定有一个 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]"
        }
    }

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

我会 post 在这里回答,以防有人问起...

当机器人被添加到团队时,您只能获得一次此事件。如果错过,您将无法再获取数据。卸载并重新安装机器人不会再次触发该事件。如果您仍然没有得到它,建议的操作是从 Azure 中删除该应用程序并使用相同的名称重新创建它。

github discussion

上查看更多信息

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