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 中删除该应用程序并使用相同的名称重新创建它。
上查看更多信息
在我们的场景中,我认为对此的限制不在我认为可行的解决方案的范围内,因此我决定采用不同的途径来获取团队数据。由于数据是在这之后的事件中通过的,所以我然后抓住它并用它做我需要做的事情。
我正在安装 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 中删除该应用程序并使用相同的名称重新创建它。
上查看更多信息在我们的场景中,我认为对此的限制不在我认为可行的解决方案的范围内,因此我决定采用不同的途径来获取团队数据。由于数据是在这之后的事件中通过的,所以我然后抓住它并用它做我需要做的事情。