Как перенести функциональность проактивных сообщений 1: 1 в Команды с Bot Framework V4 C # SDK - PullRequest
0 голосов
/ 11 июня 2019

У меня есть реализация Bot Framework V3 SDK (работает нормально), которая может инициировать приватный чат 1: 1 с любым пользователем в определенной команде с помощью бота Microsoft Teams (установленного в той же команде).У меня возникают проблемы при попытке перенести его в SDK V4.

Я читал в различных статьях и других вопросах, что это невозможно сделать, если пользователь сначала не свяжется с ботом (чтобы избежать спама для пользователей),но это не относится к версии V3 и не является опцией для нужной мне функциональности.

В исходном решении используется метод расширения "CreateOrGetDirectConversation" из сборки Microsoft.Bot.Connector.Teams, но он недоступен вверсия сборки V4.

Я пытался использовать методы CreateDirectConversation / CreateDirectConversationAsync, но безуспешно (они всегда приводят к ошибкам "Bad Request").

Этокод, фактически работающий с использованием библиотек 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 голосов
/ 11 июня 2019

По документам, Упреждающий обмен сообщениями для ботов :

Боты могут создавать новые разговоры с отдельным пользователем Microsoft Teams, если ваш бот имеет информацию о пользователе, полученную в результате предыдущего добавленияв личном, групповом или групповом чатах.Эта информация позволяет вашему боту заблаговременно уведомлять их.Например, если ваш бот был добавлен в команду, он мог бы запросить состав команды и отправить пользователям отдельные сообщения в личных чатах, или пользователь мог бы @mention другим пользователем, чтобы заставить бота отправить этому пользователю прямое сообщение.

Примечание. Расширение 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 ошибка, вам может понадобиться доверять Teams ServiceUrl :

MicrosoftAppCredentials.TrustServiceUrl(turnContext.Activity.ServiceUrl); 

Ресурсы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...