如何使用Bot Framework V4 C#SDK在Teams中迁移1:1主动消息功能

时间:2019-06-11 08:38:03

标签: c# migration botframework microsoft-teams proactive

我有一个Bot Framework V3 SDK实现(工作正常),可以使用Microsoft Teams Bot(安装在同一团队中)与特定团队中的任何用户进行1:1私人聊天。 我在尝试将其迁移到V4 SDK时遇到问题。

我读过各种文章和其他问题,除非用户先联系机器人(以避免向用户发送垃圾邮件),否则无法做到这一点,但是对于V3版本而言并非如此,并且不是该功能的选项我需要的。

原始解决方案使用CreateOrGetDirectConversation程序集的扩展名“ Microsoft.Bot.Connector.Teams”,但是在V4版本的程序集中不可用。

我尝试使用CreateDirectConversation / CreateDirectConversationAsync方法,但没有成功(它们总是会导致“错误请求”错误)。

这是使用V3库实际运行的代码:

// Create 1:1 conversation
var conversation = connectorClient.Conversations.CreateOrGetDirectConversation(botAccount, user, tenantId);
// Send message to the user
var message = Activity.CreateMessageActivity();
message.Type = ActivityTypes.Message;
message.Text = "My message";
connectorClient.Conversations.SendToConversation((Activity)message, conversation.Id);

我发现迁移非常困难。我想念什么吗?

1 个答案:

答案 0 :(得分:0)

根据文档,Proactive messaging for bots

  

只要您的机器人在个人,groupChat或团队范围内拥有通过先前添加获得的用户信息,机器人就可以与单个Microsoft Teams用户创建新的对话。该信息使您的机器人可以主动通知他们。例如,如果您的机器人被添加到团队中,它可以查询团队花名册并在个人聊天中向用户发送个人消息,或者用户可以@提及其他用户以触发该机器人向该用户发送直接消息。

注意:Microsoft.Bot.Builder.Teams扩展名仍在V4的预发行版中,这就是为什么很难为其找到示例和代码的原因。

添加中间件

Startup.cs中:

var credentials = new SimpleCredentialProvider(Configuration["MicrosoftAppId"], Configuration["MicrosoftAppPassword"]);

services.AddSingleton(credentials);

[...]

services.AddBot<YourBot>(options =>
{
    options.CredentialProvider = credentials;

    options.Middleware.Add(
        new TeamsMiddleware(
            new ConfigurationCredentialProvider(this.Configuration)));
[...]

准备机器人

在您的主要<YourBot>.cs中:

private readonly SimpleCredentialProvider _credentialProvider;

[...]

public <YourBot>(ConversationState conversationState, SimpleCredentialProvider CredentialProvider)
{
     _credentialProvider = CredentialProvider;

[...]

发送消息

var teamConversationData = turnContext.Activity.GetChannelData<TeamsChannelData>();
var connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl), _credentialProvider.AppId, _credentialProvider.Password);

var userId = <UserIdToSendTo>;
var tenantId = teamConversationData.Tenant.Id;
var parameters = new ConversationParameters
{
    Members = new[] { new ChannelAccount(userId) },
    ChannelData = new TeamsChannelData
    {
        Tenant = new TenantInfo(tenantId),
    },
};

var conversationResource = await connectorClient.Conversations.CreateConversationAsync(parameters);
var message = Activity.CreateMessageActivity();
message.Text = "This is a proactive message.";
await connectorClient.Conversations.SendToConversationAsync(conversationResource.Id, (Activity)message);

注意:如果需要获取用户ID,则可以使用:

var members = (await turnContext.TurnState.Get<IConnectorClient>().Conversations.GetConversationMembersAsync(
    turnContext.Activity.GetChannelData<TeamsChannelData>().Team.Id).ConfigureAwait(false)).ToList();

此外,我在测试中不需要此功能,但是如果遇到401错误,则可能需要trust the Teams ServiceUrl

MicrosoftAppCredentials.TrustServiceUrl(turnContext.Activity.ServiceUrl); 

资源