Отправка приветственного сообщения пользователям

ОБЛАСТЬ ПРИМЕНЕНИЯ: ПАКЕТ SDK версии 4

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

Примечание.

Пакеты SDK для JavaScript, C# и Python для Bot Framework по-прежнему будут поддерживаться, однако пакет SDK java отменяется с окончательной долгосрочной поддержкой, заканчивающейся в ноябре 2023 года. В этом репозитории будут выполняться только критически важные исправления безопасности и ошибок.

Существующие боты, созданные с помощью пакета SDK для Java, будут продолжать функционировать.

Для создания нового бота рекомендуется использовать Power Virtual Agent и ознакомиться с выбором подходящего решения чат-бота.

Дополнительные сведения см. в статье "Будущее создания бота".

Необходимые компоненты

Сведения о примере кода

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

Два основных события, отслеживаемые ботом:

  • OnMembersAddedAsyncвызывается при подключении нового пользователя к боту.
  • OnMessageActivityAsyncвызывается, когда бот получает новые входные данные пользователя.

Logic flow diagram for C# sample.

Каждый раз, когда новый пользователь подключен, он предоставляется с WelcomeMessageпомощью и InfoMessagePatternMessage бота. При получении данных от нового пользователя бот проверяет WelcomeUserState и выясняет, имеет ли DidBotWelcomeUser значение true. Если это не так, он возвращает новому пользователю сообщение с приветствием.

Создание состояния пользователя

В момент запуска создается объект состояния пользователя, а в конструктор бота добавляются зависимости.

Startup.cs


// Create the Bot Framework Authentication to be used with the Bot Adapter.
services.AddSingleton<BotFrameworkAuthentication, ConfigurationBotFrameworkAuthentication>();

// Create the Bot Adapter with error handling enabled.

Bots\WelcomeUserBot.cs


// Initializes a new instance of the "WelcomeUserBot" class.
public WelcomeUserBot(UserState userState)
{
    _userState = userState;
}

Создание методов доступа к свойствам

Теперь мы создадим метод доступа к свойству, предоставляющий обработчик WelcomeUserState в методе OnMessageActivityAsync. Затем мы вызовем метод GetAsync, чтобы получить ключ с правильной областью действия. Мы будем сохранять данные о состоянии пользователя после каждого цикла обработки введенных пользователем данных с помощью метода SaveChangesAsync.

Bots\WelcomeUserState.cs

// Gets or sets whether the user has been welcomed in the conversation.
public bool DidBotWelcomeUser { get; set; } = false;

Bots\WelcomeUserBot.cs

var didBotWelcomeUser = await welcomeUserStateAccessor.GetAsync(turnContext, () => new WelcomeUserState(), cancellationToken);

    await _userState.SaveChangesAsync(turnContext, cancellationToken: cancellationToken);
}

Обнаружение и приветствие новых подключенных пользователей

В WelcomeUserBot мы проверяем обновление действия с помощью OnMembersAddedAsync(), чтобы узнать, добавлен ли новый пользователь в диалог. Затем мы отправляем ему набор из трех приветственных сообщений: WelcomeMessage, InfoMessage и PatternMessage. Ниже приведен полный код для этого взаимодействия.

Bots\WelcomeUserBot.cs

public class WelcomeUserBot : ActivityHandler
{
    // Messages sent to the user.
    private const string WelcomeMessage = "This is a simple Welcome Bot sample. This bot will introduce you " +
                                            "to welcoming and greeting users. You can say 'intro' to see the " +
                                            "introduction card. If you are running this bot in the Bot Framework " +
                                            "Emulator, press the 'Start Over' button to simulate user joining " +
                                            "a bot or a channel";

    private const string InfoMessage = "You are seeing this message because the bot received at least one " +
                                        "'ConversationUpdate' event, indicating you (and possibly others) " +
                                        "joined the conversation. If you are using the emulator, pressing " +
                                        "the 'Start Over' button to trigger this event again. The specifics " +
                                        "of the 'ConversationUpdate' event depends on the channel. You can " +
                                        "read more information at: " +
                                        "https://aka.ms/about-botframework-welcome-user";

    private const string LocaleMessage = "You can use the activity's 'GetLocale()' method to welcome the user " +
                                         "using the locale received from the channel. " + 
                                         "If you are using the Emulator, you can set this value in Settings.";
{
    foreach (var member in membersAdded)
    {
        if (member.Id != turnContext.Activity.Recipient.Id)
        {
            await turnContext.SendActivityAsync($"Hi there - {member.Name}. {WelcomeMessage}", cancellationToken: cancellationToken);
            await turnContext.SendActivityAsync(InfoMessage, cancellationToken: cancellationToken);
            await turnContext.SendActivityAsync($"{LocaleMessage} Current locale is '{turnContext.Activity.GetLocale()}'.", cancellationToken: cancellationToken);
            await turnContext.SendActivityAsync(PatternMessage, cancellationToken: cancellationToken);
        }
    }
}

Приветствие нового пользователя и удаление первого входящего сообщения

Также важно учитывать, когда входные данные пользователя могут на самом деле содержать полезные сведения, и это может отличаться для каждого канала. Чтобы убедиться, что у пользователя есть хороший опыт на всех возможных каналах, мы проверка флаг состояния didBotWelcomeUser и если это "false", мы не обрабатываем исходные входные данные пользователя. Вместо этого мы предоставляем пользователю начальное приветственное сообщение. Затем мы присваиваем значение true свойству welcomedUserProperty, которое хранится в UserState, и с этого момента наш код будет обрабатывать введенные этим пользователем данные от всех дополнительных действий сообщения.

Bots\WelcomeUserBot.cs

{
    var welcomeUserStateAccessor = _userState.CreateProperty<WelcomeUserState>(nameof(WelcomeUserState));
    var didBotWelcomeUser = await welcomeUserStateAccessor.GetAsync(turnContext, () => new WelcomeUserState(), cancellationToken);

    if (didBotWelcomeUser.DidBotWelcomeUser == false)
    {
        didBotWelcomeUser.DidBotWelcomeUser = true;

        // the channel should sends the user name in the 'From' object
        var userName = turnContext.Activity.From.Name;

        await turnContext.SendActivityAsync("You are seeing this message because this was your first message ever to this bot.", cancellationToken: cancellationToken);
        await turnContext.SendActivityAsync($"It is a good practice to welcome the user and provide personal greeting. For example, welcome {userName}.", cancellationToken: cancellationToken);
    }
    else
    await _userState.SaveChangesAsync(turnContext, cancellationToken: cancellationToken);
}

Обработка дополнительных входных данных

После приветствие нового пользователя данные ввода пользователей оцениваются для каждого поворота сообщения, а бот предоставляет ответ на основе контекста входных данных пользователя. Следующий код демонстрирует логику принятия решений, которая используется для создания ответа.

Ввод команд intro или help вызывает функцию SendIntroCardAsync, которая предоставляет пользователю информационную карту для имиджевого баннера. Этот код рассматривается в следующем разделе этой статьи.

Bots\WelcomeUserBot.cs

    switch (text)
    {
        case "hello":
        case "hi":
            await turnContext.SendActivityAsync($"You said {text}.", cancellationToken: cancellationToken);
            break;
        case "intro":
        case "help":
            await SendIntroCardAsync(turnContext, cancellationToken);
            break;
        default:
            await turnContext.SendActivityAsync(WelcomeMessage, cancellationToken: cancellationToken);
            break;
    }
}

Использование карты для имиджевого баннера с приветствием

Как упоминалось выше, в ответ на некоторые введенные пользователем данные создается карта для имиджевого баннера. См. подробнее в руководстве по отправке карты с вводными сведениями. Ниже представлен код, который предоставляет ответ с картой для имиджевого баннера этого бота.

Bots\WelcomeUserBot.cs

    {
        var card = new HeroCard
        {
            Title = "Welcome to Bot Framework!",
            Text = @"Welcome to Welcome Users bot sample! This Introduction card
                     is a great way to introduce your Bot to the user and suggest
                     some things to get them started. We use this opportunity to
                     recommend a few next steps for learning more creating and deploying bots.",
            Images = new List<CardImage>() { new CardImage("https://aka.ms/bf-welcome-card-image") },
            Buttons = new List<CardAction>()
            {
                new CardAction(ActionTypes.OpenUrl, "Get an overview", null, "Get an overview", "Get an overview", "https://docs.microsoft.com/en-us/azure/bot-service/?view=azure-bot-service-4.0"),
                new CardAction(ActionTypes.OpenUrl, "Ask a question", null, "Ask a question", "Ask a question", "https://stackoverflow.com/questions/tagged/botframework"),
                new CardAction(ActionTypes.OpenUrl, "Learn how to deploy", null, "Learn how to deploy", "Learn how to deploy", "https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-deploy-azure?view=azure-bot-service-4.0"),
            }
        };

        var response = MessageFactory.Attachment(card.ToAttachment());
        await turnContext.SendActivityAsync(response, cancellationToken);
    }
}

Тестирование бота

Скачайте и установите последнюю версию Bot Framework Emulator.

  1. Выполните этот пример на локальном компьютере. Если вам нужны инструкции, ознакомьтесь с файлом READMEдля примера C# или примера JavaScript.
  2. Откройте эмулятор для тестирования бота.
    1. При запуске беседы с ботом вы отправите вам ряд приветственных сообщений.

    2. При первом отправке сообщения "hello" бот отвечает на некоторые советы.

    3. При отправке последующих сообщений "hello" бот отвечает с сообщением "Вы сказали привет".

      Screenshot of initial interactions with your bot in the Emulator.

    4. Отправьте боту сообщение справки. Он отвечает, отправив герою карта.

      Screenshot of the help message and the bot response in the Emulator.

Дополнительные ресурсы

См. подробнее о добавлении мультимедиа в сообщения.

Следующие шаги