如何通过 Bot Framework 向 Teams 中的用户发送通知?
Posted
技术标签:
【中文标题】如何通过 Bot Framework 向 Teams 中的用户发送通知?【英文标题】:How do I send a notification to a user in Teams via the Bot Framework? 【发布时间】:2019-09-23 14:16:21 【问题描述】:我有一个使用 Microsoft Bot Framework 的 v4 创建的 Bot。我可以在 Azure 门户的“网络聊天测试”部分成功使用此机器人。我还可以在我在 Microsoft Teams 中创建的应用程序中成功使用此机器人。我现在想从“网络聊天中的测试”部分向 Teams 中的特定用户发送通知。例如,在“网络聊天测试”部分,我想输入
Hello someuser@mytenant.com
当这是通过“网络聊天中的测试”部分发送时,我想在 Microsoft Teams 中仅向 someuser@mytenant.com
显示“Hello”。我已经成功地标记了来自“网络聊天测试”的字符串。因此,我知道我想发送什么,以及我想发送给谁。但是,我不知道如何实际发送它。
目前,我的机器人中有以下内容:
public class EchoBot : ActivityHandler
private ConcurrentDictionary<string, ConversationReference> _conversationReferences;
public EchoBot(ConcurrentDictionary<string, ConversationReference> conversationReferences)
_conversationReferences = conversationReferencs;
private void AddConversationReference(Activity activity)
var reference = activity.GetConversationReference();
_conversationReferences.AddOrUpdate(reference.User.Id, reference, (key, newValue) => reference);
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> context, CancellationToken cancellationToken)
AddConversationReference(context.Activity as Activity);
var parameters = GetParameters(); // Parses context.Activity.Text;
// Send a message to the target (i.e. someuser@mytenant.com)
var connection = new Microsoft.Bot.Connector.ConnectorClient(new Uri(context.Activity.ServiceUrl));
var tenant = context.Activity.GetChannelData<TeamsChannelData>().Tenant;
// how do I send the message to parameters.Target?
// Confirm message was sent to the sender
var confirmation = $"Message was sent to parameters.Target.";
await context.SendActivityAsync(MessageFactory.Text(confirmation));
我已经查看了如何send proactive notifications to users。但是,我在 a) 获取 parameters.Target
中指定的用户和 b) 向该用户发送通知方面没有成功。我错过了什么?
【问题讨论】:
【参考方案1】:首先,您需要将user@email.com
映射到他们的 Teams 用户 ID(可能使用静态字典),格式为:
29:1I9Is_Sx0O-Iy2rQ7Xz1lcaPKlO9eqmBRTBuW6XzXXXXXXXXMij8BVMdBcL9L_RwWNJyAHFQb0TXXXXXX
您可以通过以下任一方式获取 Teams 用户 ID:
-
Querying the roster,或
让用户向机器人发送消息,并在传入消息上设置断点,查看团队用户 ID 的
Activity.ChannelData
,或
动态构建所有传入消息的静态字典,其中存储映射到其团队用户 ID 的用户电子邮件(我相信两者都在 Activity.ChannelData
中找到)。
注意:#1 和 #2 都要求用户首先向机器人发送消息,这有点违背主动消息的目的
拥有适当的团队 ID 后,您只需 send a proactive message to a Teams user。此链接的末尾还提到了trustServiceUrl
,如果您在尝试发送主动消息时遇到权限/身份验证问题,您可能会发现它很方便。
【讨论】:
谢谢。但是,我一直无法查询名册。我的机器人在团队的“对话”选项卡中正确回显了输入。但是,当我尝试查询名册时,Team
属性为空。我用这条线:var members = (await turnContext.TurnState.Get<IConnectorClient>().Conversations.GetConversationMembersAsync( turnContext.Activity.GetChannelData<TeamsChannelData>().Team.Id).ConfigureAwait(false)).ToList();
显示here
您是否将机器人添加到团队中? Teams > App Studio > Manifest Editor > YourBot > Test and Distribute > Install > [Dropdown by Add] Add to a team
?
我没有将应用添加到团队中。但是,我确实在 Teams 中安装了 Teams 应用程序。我正在寻找一种仅使用 Teams 应用程序而无需在 Teams 中创建实际团队的方法。
@ZachTempleton 你不能这样做,因为机器人没有适当的范围。这是为了防止垃圾邮件。以上是关于如何通过 Bot Framework 向 Teams 中的用户发送通知?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Bot Framework V4 在 Teams 中发送主动式 1:1 消息