Calling my. NET Core Teams Bot от Angular - PullRequest
0 голосов
/ 31 января 2020

Я создал бота Teams в. NET Ядро, следуя примеру, найденному здесь: https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/57.teams-conversation-bot

Это работает и работает локально с ngrok. У меня есть контроллер с маршрутом api / messages:

[Route("api/messages")]
[ApiController]
public class BotController : ControllerBase
{
    private readonly IBotFrameworkHttpAdapter Adapter;
    private readonly IBot Bot;

    public BotController(IBotFrameworkHttpAdapter adapter, IBot bot)
    {
        Adapter = adapter;
        Bot = bot;
    }

    [HttpPost]
    public async Task PostAsync()
    {
        // Delegate the processing of the HTTP POST to the adapter.
        // The adapter will invoke the bot.
        await Adapter.ProcessAsync(Request, Response, Bot);
    }
}

Теперь я хочу вызвать POST для api / messages от моего Angular клиента, используя TypeScript для отправки проактивного сообщения на указанный c Пользователь команды.

Я выяснил, как настроить параметры ConversationParameters в TeamsConversationBot.cs для конкретного пользователя c, выполнив следующие действия:

var conversationParameters = new ConversationParameters
{
    IsGroup = false,
    Bot = turnContext.Activity.Recipient,
    Members = new[] { new ChannelAccount("[insert unique Teams user guid here]") },
    TenantId = turnContext.Activity.Conversation.TenantId,
};

но я я пытаюсь понять, как создать запрос JSON, который отправляет руководство пользователя Teams (и, возможно, несколько других деталей) в мой маршрут API / сообщений от TypeScript.

Как мне go сделать это? Какие параметры / тело мне нужно отправить? Мне не удалось найти в Интернете примеры, показывающие, как это сделать.


Обновление ниже для дополнительного пояснения

Я создаю приложение для веб-чата, используя Angular для нашего клиентов. Я пытаюсь отправить упреждающее сообщение нашим внутренним сотрудникам, которые используют команды Microsoft, когда клиент выполняет какое-либо действие через приложение чата (инициирует беседу, отправляет сообщение и т. Д. c.).

Я создал бот Teams, используя. NET Ядро, используя этот пример: https://kutt.it/ZCftjJ. Изменяя этот пример, я могу жестко закодировать свой идентификатор пользователя Команды, и проактивное сообщение успешно отображается в командах:

var proactiveMessage = MessageFactory.Text($"This is a proactive message.");
var conversationParameters = new ConversationParameters
{
    IsGroup = false,
    Bot = turnContext.Activity.Recipient,
    Members = new[] { new ChannelAccount("insert Teams ID here") },
    TenantId = turnContext.Activity.Conversation.TenantId,
};

await ((BotFrameworkAdapter)turnContext.Adapter).CreateConversationAsync(teamsChannelId, serviceUrl, credentials, conversationParameters,
    async (t1, c1) =>
    {
        conversationReference = t1.Activity.GetConversationReference();
        await ((BotFrameworkAdapter)turnContext.Adapter).ContinueConversationAsync(_appId, conversationReference,
            async (t2, c2) =>
            {
                await t2.SendActivityAsync(proactiveMessage, c2);
            },
            cancellationToken);
    },
cancellationToken);

С чем я борюсь:

  1. Как настройте мое приложение Angular, чтобы уведомить моего бота о новом проактивном сообщении, которое я хочу отправить.
  2. Как настроить бота для принятия некоторых пользовательских параметров (идентификатор пользователя команды, сообщение).

Ответы [ 2 ]

3 голосов
/ 02 февраля 2020

Похоже, у вас уже есть успехи в проактивном обмене сообщениями. Это работает на 100%? Если нет, то я несколько раз рассмотрел топи c здесь о переполнении стека - вот пример, который может помочь: Программная отправка сообщения боту в Microsoft Teams

Однако Что касается опережающего сообщения, правда в том, что вы можете сделать это из любого места / любым способом. Например, у меня есть Azure функции, которые запускаются по собственному расписанию, и проактивно отправляют сообщения , как будто они от бота , хотя код вообще не работает внутри бота , Вы не полностью описали, где приложение Angular вписывается в картину (например, кто и для чего его использует), но в качестве примера в своем сценарии вы можете создать другую конечную точку внутри своего контроллера бота и выполнить работу внутри нее напрямую. (например, добавьте что-то вроде ниже:)

[HttpPost]
    public async Task ProActiveMessage([FromQuery]string conversationId)
    {
        //retrieve conversation details by id from storage (e.g. database)
        //send pro-active message
        //respond with something back to the Angular client
    }

надеюсь, что это поможет,

1 голос
/ 04 февраля 2020

Ответ Хилтон по-прежнему хорош, но часть о проактивном обмене сообщениями без предварительного взаимодействия требует слишком длительного ответа. Итак, отвечая на ваши последние комментарии:

Да, бот должен быть установлен для любой команды, в которой находится пользователь, и которую вы хотите предварительно проинформировать. В противном случае у него не будет разрешений на это.


Вам не нужно переопределять OnMembersAddedAsync; просто запросите список (см. ниже).


Вам не нужен идентификатор разговора, чтобы сделать это. Я бы сделал ваш API, вместо этого, принял бы их ID команды. Вы можете получить это, запросив список команд , что вам нужно сделать заранее и сохранить в таблице ha sh или где-то еще ... возможно, в базе данных, если размер вашей команды достаточно велик.

Для получения необходимой информации вам нужно для построения ConversationParameters :

var conversationParameters = new ConversationParameters
{
    IsGroup = false,
    Bot = turnContext.Activity.Recipient,
    Members = new ChannelAccount[] { teamMember },
    TenantId = turnContext.Activity.Conversation.TenantId,
};

..., которые затем вы используете для CreateConversationAsyn c :

await ((BotFrameworkAdapter)turnContext.Adapter).CreateConversationAsync(
    teamsChannelId,
    serviceUrl,
    credentials,
    conversationParameters,
    async (t1, c1) =>
    {
        conversationReference = t1.Activity.GetConversationReference();
        await ((BotFrameworkAdapter)turnContext.Adapter).ContinueConversationAsync(
            _appId,
            conversationReference,
            async (t2, c2) =>
            {
                await t2.SendActivityAsync(proactiveMessage, c2);
            },
            cancellationToken);
    },
    cancellationToken);

Да, вы можете изменить этот образец. Он возвращает неверный запрос, потому что в /api/messages разрешена только конкретная схема. Вам нужно будет добавить свою конечную точку. Вот пример NotifyController , который использует один из наших других примеров. Вы можете видеть, что принимает запросы GET . Вам просто нужно изменить нашу собственную сборку, которая принимает запросы POST.


Все это, как говорится, кажется, может быть, это большая задача, чем вы готовы. Ничего плохого в этом нет; Вот как мы учимся. Вместо того, чтобы прыгать прямо в это, я бы начал с:

  1. Получите Проактивный образец и копайте код до тех пор, пока вы действительно понять, как работает API.

  2. Получите Образец команд , а затем попытайтесь заставить его отправлять сообщения отдельным пользователям.

  3. Затем создайте своего бота, который отправляет сообщения пользователям без предварительного взаимодействия.

Если у вас возникли проблемы, не стесняйтесь просматривать мои ответы . Я отвечал на подобные вопросы, много. Имейте в виду, однако, что мы перешли от промежуточного программного обеспечения команд, о котором я упоминаю в некоторых своих ответах, к чему-то более интегрированному в SDK. Образцы наших команд (образцы 50-60) показывают, как делать практически все.

...