L'obiettivo principale durante la creazione di qualsiasi bot è coinvolgere l'utente in una conversazione significativa. Uno dei modi migliori per realizzare questo obiettivo è garantire che dal primo momento in cui si connette, un utente sia in grado di identificare l'obiettivo principale e le capacità del bot, ovvero il motivo per cui è stato creato. Questo articolo fornisce esempi di codice per fare in modo che il bot visualizzi un messaggio di benvenuto agli utenti.
Nota
Gli SDK JavaScript, C# e Python di Bot Framework continueranno a essere supportati, ma Java SDK verrà ritirato con il supporto finale a lungo termine che termina a novembre 2023.
I bot esistenti creati con Java SDK continueranno a funzionare.
Copia dell'esempio dell'utente di benvenuto in Esempio C#, esempio JS, esempio Java o esempio Python. Il codice dell'esempio viene usato per illustrare come inviare messaggi di benvenuto.
Informazioni sul codice di esempio
Questo codice di esempio illustra come rilevare e accogliere i nuovi utenti quando sono inizialmente connessi al bot. Il diagramma seguente illustra il flusso della logica per questo bot.
OnMembersAddedAsync, chiamato quando un nuovo utente si connette al bot.
OnMessageActivityAsync, chiamato quando il bot riceve un nuovo input utente.
Ogni volta che un nuovo utente è connesso, viene fornito con un WelcomeMessage, InfoMessagee PatternMessage dal bot.
Quando viene ricevuto nuovo input dell'utente, viene eseguita una verifica su WelcomeUserState per controllare se DidBotWelcomeUser è impostato su true. In caso contrario, all'utente viene visualizzato un messaggio iniziale di benvenuto.
I due eventi principali rilevati dal bot sono:
onMembersAdded, chiamato quando un nuovo utente si connette al bot.
onMessage, chiamato quando il bot riceve un nuovo input utente.
Ogni volta che un nuovo utente è connesso, viene fornito con un welcomeMessage, infoMessagee patternMessage dal bot.
Quando viene ricevuto nuovo input dell'utente, viene eseguita una verifica su welcomedUserProperty per controllare se didBotWelcomeUser è impostato su true. In caso contrario, all'utente viene visualizzato un messaggio iniziale di benvenuto.
Se DidBotWelcomeUser è true, viene eseguita la valutazione dell'input dell'utente. A seconda del contenuto dell'input dell'utente, questo bot eseguirà una delle operazioni seguenti:
Visualizzerà un messaggio in risposta al saluto ricevuto dall'utente.
Visualizzerà un scheda banner contenente maggiori informazioni sui bot.
Invierà di nuovo il messaggio WelcomeMessage spiegando quali valori di input sono previsti per questo bot.
I due eventi principali rilevati dal bot sono:
onMembersAdded, chiamato quando un nuovo utente si connette al bot.
onMessageActivity, chiamato quando il bot riceve un nuovo input utente.
Ogni volta che un nuovo utente è connesso, viene fornito con un WELCOME_MESSAGE, INFO_MESSAGEe PATTERN_MESSAGE dal bot.
Quando viene ricevuto nuovo input dell'utente, viene eseguita una verifica su WelcomeUserState per controllare se getDidBotWelcomeUser() è impostato su true. In caso contrario, all'utente viene visualizzato un messaggio iniziale di benvenuto.
I due eventi principali rilevati dal bot sono:
on_members_added_activity, chiamato quando un nuovo utente si connette al bot.
on_message_activity, chiamato quando il bot riceve un nuovo input utente.
Ogni volta che un nuovo utente è connesso, viene fornito un messaggio di benvenuto, un messaggio informativo e un messaggio di modello dal bot.
Quando viene ricevuto un nuovo input utente, la welcome_user_state.did_welcome_user proprietà viene controllata. Se non è impostata su true, all'utente viene restituito un messaggio iniziale dell'utente di benvenuto. Se è impostato su true, in base al contenuto dell'input dell'utente, questo bot eseguirà una delle operazioni seguenti:
Visualizzerà un messaggio in risposta al saluto ricevuto dall'utente.
Visualizzerà un scheda banner contenente maggiori informazioni sui bot.
L'oggetto di stato dell'utente viene creato all'avvio e la dipendenza viene inserita nel costruttore del 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;
}
All'avvio, lo stato dell'utente è definito in index.js e utilizzato dal costruttore del bot.
index.js
// Create HTTP server
const server = restify.createServer();
server.use(restify.plugins.bodyParser());
server.listen(process.env.port || process.env.PORT || 3978, function() {
console.log(`\n${ server.name } listening to ${ server.url }`);
console.log('\nGet Bot Framework Emulator: https://aka.ms/botframework-emulator');
L'oggetto stato utente viene creato all'avvio e alla dipendenza inserita nel costruttore del bot dal contenitore Spring.
Application.java
@Bean
public Bot getBot(UserState userState) {
return new WelcomeUserBot(userState);
}
WelcomeUserBot.java
private final UserState userState;
// Initializes a new instance of the "WelcomeUserBot" class.
@Autowired
public WelcomeUserBot(UserState withUserState) {
userState = withUserState;
}
All'avvio, lo stato dell'utente è definito in app.py e utilizzato dal costruttore del bot.
app.py
# Create the Bot
BOT = WelcomeUserBot(USER_STATE)
# Listen for incoming requests on /api/messages.
Creare ora una funzione di accesso alla proprietà che fornisce un handle a WelcomeUserState all'interno del metodo OnMessageActivityAsync.
Chiamare quindi il metodo GetAsync per ottenere la chiave con ambito corretto. Salvare infine i dati sullo stato dell'utente dopo ogni iterazione di input dell'utente usando il metodo 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);
Creare ora una funzione di accesso alla proprietà che fornisce un handle alla proprietà welcomedUserProperty che è salvata in modo permanente in userState.
this.onMessage(async (context, next) => {
// Read UserState. If the 'DidBotWelcomedUser' does not exist (first time ever for a user)
// set the default to false.
const didBotWelcomedUser = await this.welcomedUserProperty.get(context, false);
/**
* Override the ActivityHandler.run() method to save state changes after the bot logic completes.
*/
async run(context) {
await super.run(context);
// Save state changes
await this.userState.saveChanges(context);
}
Creare ora una funzione di accesso alla proprietà che fornisce un handle a WelcomeUserState all'interno del metodo onMessageActivity.
Chiamare quindi il metodo get per ottenere la chiave con ambito corretto. Salvare infine i dati sullo stato dell'utente dopo ogni iterazione di input dell'utente usando il metodo saveChanges.
WelcomeUserBot.java
// Get state data from UserState.
StatePropertyAccessor<WelcomeUserState> stateAccessor =
userState.createProperty("WelcomeUserState");
CompletableFuture<WelcomeUserState> stateFuture =
stateAccessor.get(turnContext, WelcomeUserState::new);
Usa la funzione di accesso alle proprietà nel gestore on_message_activity ed esegue l'override del gestore on_turn per salvare lo stato prima della fine del turno.
# Get the state properties from the turn context.
welcome_user_state = await self.user_state_accessor.get(
turn_context, WelcomeUserState
)
async def on_turn(self, turn_context: TurnContext):
await super().on_turn(turn_context)
# save changes to WelcomeUserState after each turn
await self._user_state.save_changes(turn_context)
In WelcomeUserBot viene verificata la presenza di un aggiornamento dell'attività con OnMembersAddedAsync() per sapere se alla conversazione è stato aggiunto un nuovo utente al quale inviare un set di tre messaggi iniziali di benvenuto, ovvero WelcomeMessage, InfoMessage e PatternMessage. Ecco il codice completo per questa interazione.
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);
}
}
}
Questo codice JavaScript invia messaggi iniziali di benvenuto quando viene aggiunto un utente. Per eseguire questa operazione, si verifica l'attività della conversazione e si controlla se alla conversazione è stato aggiunto un nuovo membro.
bots/welcomeBot.js
// Sends welcome messages to conversation members when they join the conversation.
// Messages are only sent to conversation members who aren't the bot.
this.onMembersAdded(async (context, next) => {
// Iterate over all new members added to the conversation
for (const idx in context.activity.membersAdded) {
// Greet anyone that was not the target (recipient) of this message.
// Since the bot is the recipient for events from the channel,
// context.activity.membersAdded === context.activity.recipient.Id indicates the
// bot was added to the conversation, and the opposite indicates this is a user.
if (context.activity.membersAdded[idx].id !== context.activity.recipient.id) {
await context.sendActivity(`Welcome to the 'Welcome User' Bot. This bot will introduce you to welcoming and greeting users.`);
await context.sendActivity(`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`);
await context.sendActivity(`You can use the activity's 'locale' property to welcome the user ` +
`using the locale received from the channel. ` +
`If you are using the Emulator, you can set this value in Settings. ` +
`Current locale is '${ context.activity.locale }'`);
await context.sendActivity(`It is a good pattern to use this event to send general greeting to user, explaining what your bot can do. ` +
`In this example, the bot handles 'hello', 'hi', 'help' and 'intro'. ` +
`Try it now, type 'hi'`);
}
}
// By calling next() you ensure that the next BotHandler is run.
await next();
});
In WelcomeUserBot viene verificata la presenza di un aggiornamento dell'attività con onMembersAdded() per sapere se alla conversazione è stato aggiunto un nuovo utente al quale inviare un set di tre messaggi iniziali di benvenuto, ovvero WELCOME_MESSAGE, INFO_MESSAGE e PATTERN_MESSAGE. Ecco il codice completo per questa interazione.
WelcomeUserBot.java
public class WelcomeUserBot extends ActivityHandler {
// Messages sent to the user.
private static final String WELCOME_MESSAGE =
"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 static final String INFO_MESSAGE =
"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 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.";
private static final String PATTERN_MESSAGE =
"It is a good pattern to use this event to send general greeting"
+ "to user, explaining what your bot can do. In this example, the bot "
+ "handles 'hello', 'hi', 'help' and 'intro'. Try it now, type 'hi'";
on_members_added_activity verifica se è stato aggiunto un nuovo utente e quindi invia tre messaggi di benvenuto iniziali: un messaggio di benvenuto, un messaggio informativo e un messaggio modello.
bots/welcome-user-bot.py
"""
Greet when users are added to the conversation.
Note that all channels do not send the conversation update activity.
If you find that this bot works in the emulator, but does not in
another channel the reason is most likely that the channel does not
send this activity.
"""
for member in members_added:
if member.id != turn_context.activity.recipient.id:
await turn_context.send_activity(
f"Hi there { member.name }. " + self.WELCOME_MESSAGE
)
await turn_context.send_activity(self.INFO_MESSAGE)
await turn_context.send_activity(
f"{ self.LOCALE_MESSAGE } Current locale is { turn_context.activity.locale }."
)
await turn_context.send_activity(self.PATTERN_MESSAGE)
Salutare il nuovo utente e rimuovere l'input iniziale
È anche importante considerare quando l'input dell'utente potrebbe effettivamente contenere informazioni utili e questo può variare per ogni canale. Per garantire che l'utente abbia un'esperienza ottimale su tutti i canali possibili, controlliamo il flag di stato didBotWelcomeUser e, se questo è "false", non viene elaborato l'input iniziale dell'utente. All'utente viene invece visualizzato un messaggio iniziale di benvenuto. La proprietà booleana welcomedUserProperty viene quindi impostata su "true" e archiviata in UserState. A questo punto il codice elabora l'input dell'utente da tutte le altre attività di messaggio.
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
È anche importante considerare quando l'input dell'utente potrebbe effettivamente contenere informazioni utili e questo può variare per ogni canale. Per garantire che l'utente abbia un'esperienza ottimale su tutti i canali possibili, controlliamo la proprietà didBotWelcomedUser, se non esiste, la impostiamo su "false" e non elaboriamo l'input iniziale dell'utente. All'utente viene invece visualizzato un messaggio iniziale di benvenuto. La proprietà booleana didBotWelcomeUser viene quindi impostata su "true" e il codice elabora l'input dell'utente da tutte le altre attività di messaggio.
bots/welcomeBot.js
this.onMessage(async (context, next) => {
// Read UserState. If the 'DidBotWelcomedUser' does not exist (first time ever for a user)
// set the default to false.
const didBotWelcomedUser = await this.welcomedUserProperty.get(context, false);
// Your bot should proactively send a welcome message to a personal chat the first time
// (and only the first time) a user initiates a personal chat with your bot.
if (didBotWelcomedUser === false) {
// The channel should send the user name in the 'From' object
const userName = context.activity.from.name;
await context.sendActivity('You are seeing this message because this was your first message ever sent to this bot.');
await context.sendActivity(`It is a good practice to welcome the user and provide personal greeting. For example, welcome ${ userName }.`);
// Set the flag indicating the bot handled the user's first message.
await this.welcomedUserProperty.set(context, true);
} else {
}
// By calling next() you ensure that the next BotHandler is run.
await next();
});
È importante considerare quando l'input dell'utente può contenere informazioni utili, che possono variare per ogni canale. Per garantire che l'utente abbia un'esperienza ottimale su tutti i canali possibili, controlliamo il flag di stato getDidBotWelcomeUser e, se questo è "false", non viene elaborato l'input iniziale dell'utente. All'utente viene invece visualizzato un messaggio iniziale di benvenuto. Il valore bool setDidBotWelcomeUser viene quindi impostato su "true", archiviato in UserState e il codice ora elabora l'input dell'utente da tutte le attività di messaggio aggiuntive.
WelcomeUserBot.java
@Override
protected CompletableFuture<Void> onMessageActivity(TurnContext turnContext) {
// Get state data from UserState.
StatePropertyAccessor<WelcomeUserState> stateAccessor =
userState.createProperty("WelcomeUserState");
CompletableFuture<WelcomeUserState> stateFuture =
stateAccessor.get(turnContext, WelcomeUserState::new);
return stateFuture.thenApply(thisUserState -> {
if (!thisUserState.getDidBotWelcomeUser()) {
thisUserState.setDidBotWelcomeUser(true);
// the channel should send the user name in the 'from' object
String userName = turnContext.getActivity().getFrom().getName();
return turnContext
.sendActivities(
MessageFactory.text(FIRST_WELCOME_ONE),
MessageFactory.text(String.format(FIRST_WELCOME_TWO, userName))
);
// Save any state changes.
.thenApply(response -> userState.saveChanges(turnContext))
È anche importante considerare quando l'input dell'utente potrebbe effettivamente contenere informazioni utili, questo può variare per ogni canale. Per garantire che l'esperienza utente sia ottimale in tutti i canali possibili, on_message_activity controlla la proprietà did_welcome_user. La prima volta, lo imposta su false e non elabora l'input dell'utente. L'utente riceve invece un messaggio di benvenuto iniziale. Imposta quindi did_welcome_user su true ed elabora l'input dell'utente da tutte le altre attività di messaggio.
bots/welcome-user-bot.py
if not welcome_user_state.did_welcome_user:
welcome_user_state.did_welcome_user = True
await turn_context.send_activity(
"You are seeing this message because this was your first message ever to this bot."
)
name = turn_context.activity.from_property.name
await turn_context.send_activity(
f"It is a good practice to welcome the user and provide personal greeting. For example: Welcome {name}"
)
Elaborare l'input aggiuntivo
Dopo che un nuovo utente è stato accolto, le informazioni di input dell'utente vengono valutate per ogni turno di messaggio e il bot fornisce una risposta in base al contesto dell'input dell'utente. Il codice seguente mostra la logica delle decisioni usata per generare la risposta.
Se l'input è 'intro' o 'help', viene chiamata la funzione SendIntroCardAsync per presentare all'utente una scheda banner informativa. Il codice relativo viene esaminato nella sezione successiva di questo articolo.
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;
}
}
Se l'input è 'intro' o 'help', si usa CardFactory per presentare all'utente una scheda adattiva introduttiva. Il codice relativo viene esaminato nella sezione successiva di questo articolo.
bots/welcomeBot.js
// This example uses an exact match on user's input utterance.
// Consider using LUIS or QnA for Natural Language Processing.
const text = context.activity.text.toLowerCase();
switch (text) {
case 'hello':
case 'hi':
await context.sendActivity(`You said "${ context.activity.text }"`);
break;
case 'intro':
case 'help':
await this.sendIntroCard(context);
break;
default:
await context.sendActivity(`This is a simple Welcome Bot sample. 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`);
}
Se l'input è 'intro' o 'help', viene chiamata la funzione sendIntroCard per presentare all'utente una scheda banner informativa. Il codice relativo viene esaminato nella sezione successiva di questo articolo.
WelcomeUserBot.java
// This example hardcodes specific utterances.
// You should use LUIS or QnA for more advance language understanding.
String text = turnContext.getActivity().getText().toLowerCase();
switch (text) {
case "hello":
case "hi":
return turnContext.sendActivities(MessageFactory.text("You said " + text));
case "intro":
case "help":
return sendIntroCard(turnContext);
default:
return turnContext.sendActivity(WELCOME_MESSAGE);
}
L'input dell'introduzione o della Guida di un utente fa sì che il bot chiami __send_intro_card, che presenta all'utente una scheda adattiva introduttiva.
bots/welcome-user-bot.py
if text in ("hello", "hi"):
await turn_context.send_activity(f"You said { text }")
elif text in ("intro", "help"):
await self.__send_intro_card(turn_context)
else:
await turn_context.send_activity(self.WELCOME_MESSAGE)
Uso delle schede banner per i saluti
Come accennato in precedenza, con alcuni input dell'utente viene generata una scheda banner in risposta alla richiesta. Per altre informazioni sulle schede banner per i saluti, vedere Inviare una scheda introduttiva. Ecco il codice necessario per creare la risposta della scheda banner di questo bot.
{
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);
}
}
bots/welcomeBot.js
async sendIntroCard(context) {
const card = CardFactory.heroCard(
'Welcome to Bot Framework!',
'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.',
['https://aka.ms/bf-welcome-card-image'],
[
{
type: ActionTypes.OpenUrl,
title: 'Get an overview',
value: 'https://docs.microsoft.com/en-us/azure/bot-service/?view=azure-bot-service-4.0'
},
{
type: ActionTypes.OpenUrl,
title: 'Ask a question',
value: 'https://stackoverflow.com/questions/tagged/botframework'
},
{
type: ActionTypes.OpenUrl,
title: 'Learn how to deploy',
value: 'https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-deploy-azure?view=azure-bot-service-4.0'
}
]
);
await context.sendActivity({ attachments: [card] });
}
WelcomeUserBot.java
private CompletableFuture<ResourceResponse> sendIntroCard(TurnContext turnContext) {
HeroCard card = new HeroCard();
card.setTitle("Welcome to Bot Framework!");
card.setText(
"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."
);
CardImage image = new CardImage();
image.setUrl("https://aka.ms/bf-welcome-card-image");
card.setImages(Collections.singletonList(image));
CardAction overviewAction = new CardAction();
overviewAction.setType(ActionTypes.OPEN_URL);
overviewAction.setTitle("Get an overview");
overviewAction.setText("Get an overview");
overviewAction.setDisplayText("Get an overview");
overviewAction.setValue(
"https://docs.microsoft.com/en-us/azure/bot-service/?view=azure-bot-service-4.0"
);
CardAction questionAction = new CardAction();
questionAction.setType(ActionTypes.OPEN_URL);
questionAction.setTitle("Ask a question");
questionAction.setText("Ask a question");
questionAction.setDisplayText("Ask a question");
questionAction.setValue("https://stackoverflow.com/questions/tagged/botframework");
CardAction deployAction = new CardAction();
deployAction.setType(ActionTypes.OPEN_URL);
deployAction.setTitle("Learn how to deploy");
deployAction.setText("Learn how to deploy");
deployAction.setDisplayText("Learn how to deploy");
deployAction.setValue(
"https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-deploy-azure?view=azure-bot-service-4.0"
);
card.setButtons(Arrays.asList(overviewAction, questionAction, deployAction));
Activity response = MessageFactory.attachment(card.toAttachment());
return turnContext.sendActivity(response);
}
bots/welcome-user-bot.py
async def __send_intro_card(self, turn_context: TurnContext):
card = 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=[CardImage(url="https://aka.ms/bf-welcome-card-image")],
buttons=[
CardAction(
type=ActionTypes.open_url,
title="Get an overview",
text="Get an overview",
display_text="Get an overview",
value="https://docs.microsoft.com/en-us/azure/bot-service/?view=azure-bot-service-4.0",
),
CardAction(
type=ActionTypes.open_url,
title="Ask a question",
text="Ask a question",
display_text="Ask a question",
value="https://stackoverflow.com/questions/tagged/botframework",
),
CardAction(
type=ActionTypes.open_url,
title="Learn how to deploy",
text="Learn how to deploy",
display_text="Learn how to deploy",
value="https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-deploy-azure?view=azure-bot-service-4.0",
),
],
)
return await turn_context.send_activity(
MessageFactory.attachment(CardFactory.hero_card(card))
)