Compartilhar via


Enviar mensagem de boas-vinda aos usuários

APLICA-SE A: SDK v4

Ao criar um bot, o principal objetivo é envolver seu usuário em uma conversa produtiva. Uma das melhores maneiras de fazer isso é garantir que, a partir do momento em que o usuário se conectar pela primeira vez, ele entenda o objetivo e as funcionalidades principais do bot, a razão pela qual seu bot foi criado. Este artigo fornece exemplos de código para ajudá-lo a dar boas-vindas aos usuários em seu bot.

Observação

Os SDKs JavaScript, C# e Python do Bot Framework continuarão a ser compatíveis. No entanto, o SDK Java está sendo desativado, com o suporte final de longo prazo terminando em novembro de 2023.

Os bots existentes criados com o SDK para Java continuarão a funcionar.

Para a criação de novos bots, considere usar o Microsoft Copilot Studio e leia sobre como escolher a solução de copiloto certa.

Para obter mais informações, confira O futuro da criação de bots.

Pré-requisitos

Sobre este código de exemplo

Esse código de exemplo mostra como detectar e dar as boas-vindas a novos usuários quando eles se conectam inicialmente ao seu bot. O diagrama a seguir mostra o fluxo lógico desse bot.

Os dois principais eventos encontrados pelo bot são:

  • OnMembersAddedAsync, chamado quando um novo usuário se conecta ao seu bot.
  • OnMessageActivityAsync, chamado quando seu bot recebe novas entradas de usuário.

Diagrama de fluxo lógico para exemplo de C#.

Sempre que um novo usuário é conectado, ele recebe WelcomeMessage, InfoMessage e PatternMessage do bot. Quando uma nova entrada do usuário é recebida, WelcomeUserState é conferido para ver se DidBotWelcomeUser está definido como true. Se não, uma mensagem inicial de boas-vindas será retornada ao usuário.

Criar estado do usuário

O objeto de estado do usuário é criado na inicialização e a dependência é injetada no construtor de bot.

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;
}

Criar acessadores de propriedade

Agora, criamos um acessador de propriedade que nos fornece um identificador para WelcomeUserState dentro do método OnMessageActivityAsync. Em seguida, chame o método GetAsync para obter a chave de escopo correta. Em seguida, salvamos os dados de estado do usuário após cada iteração de entrada do usuário, usando o método 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);
}

Detectar e saudar usuários conectados recentemente

Em WelcomeUserBot, verificamos se há uma atualização de atividade, usando OnMembersAddedAsync() para ver se um novo usuário foi adicionado à conversa e, em seguida, enviamos a ele um conjunto de três mensagens inicias de boas-vindas: WelcomeMessage, InfoMessage e PatternMessage. O código completo dessa interação é mostrado abaixo.

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);
        }
    }
}

Recepção do novo usuário e descarte da entrada inicial

Também é importante considerar quando a entrada de usuário pode realmente conter informações úteis, e isso pode variar para cada canal. Para garantir que o usuário tenha uma boa experiência em todos os canais possíveis, verificamos o sinalizador de status didBotWelcomeUser e, se ele for "false", não processamos a entrada de usuário inicial. Em vez disso, forneceremos ao usuário uma mensagem inicial de boas-vindas. O booliano welcomedUserProperty é definido como "true", armazenado em UserState e nosso código agora processará essa entrada do usuário usando todas as atividades adicionais de mensagem.

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);
}

Processar entrada adicional

Depois que um novo usuário é recebido, as informações de entrada de usuário são avaliadas para cada turno de mensagem, e o bot fornece uma resposta com base no contexto dessa entrada de usuário. O código a seguir mostra a lógica de decisão usada para gerar essa resposta.

Uma entrada de “intro” ou “help” chama a função SendIntroCardAsync para apresentar ao usuário um cartão Hero informativo. Esse código é examinado na próxima seção deste artigo.

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;
    }
}

Usar a saudação do cartão Hero

Conforme mencionado acima, algumas entradas do usuário geram um cartão Hero em resposta à solicitação. Saiba mais sobre as saudações do cartão Hero aqui: Enviar um cartão de introdução. Veja abaixo o código necessário para criar a resposta do cartão Hero do bot.

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);
    }
}

Testar o bot

Baixe e instale o Bot Framework Emulator mais recente

  1. Execute o exemplo localmente em seu computador. Se precisar de instruções, confira o arquivo README do exemplo em C# ou do exemplo em JavaScript.
  2. Abra o Emulator para testar seu bot.
    1. Quando você iniciar uma conversa com seu bot, ele enviará uma série de mensagens de boas-vindas.

    2. Quando você envia uma mensagem de "olá" pela primeira vez, seu bot responde com alguns conselhos.

    3. Quando você envia mensagens de "olá" subsequentes, seu bot responde com "Você disse olá".

      Captura de tela das interações iniciais com o bot no emulador.

    4. Envie uma mensagem de "ajuda" para seu bot. Ele responde enviando um hero card.

      Captura de tela da mensagem de ajuda e da resposta do bot no emulador.

Recursos adicionais

Saiba mais sobre várias respostas de mídia em Adicionar mídia a mensagens.

Próximas etapas