A felhasználó és a robot között kicserélt üzenetek tartalmazhatnak médiamellékleteket, például képeket, videókat, hangokat és fájlokat. A Bot Framework SDK támogatja azt a feladatot, hogy gazdag üzeneteket küldjön a felhasználónak. A csatornák (Facebook, Slack stb.) által támogatott gazdag üzenetek típusának meghatározásához tekintse meg a csatorna dokumentációját a korlátozásokról.
Feljegyzés
A Bot Framework JavaScript, C# és Python SDK-k továbbra is támogatottak lesznek, a Java SDK-t azonban 2023 novemberében végső hosszú távú támogatással kivonják.
A Java SDK-val létrehozott meglévő robotok továbbra is működni fognak.
Az új robotépítéshez fontolja meg a Microsoft Copilot Studio használatát, és olvassa el a megfelelő copilot-megoldás kiválasztását.
Az ebben a szakaszban látható összes forráskód a Mellékletek kezelése mintán alapul.
Az Attachments objektum tulajdonsága Activity olyan objektumtömböt Attachment tartalmaz, amely az üzenethez csatolt médiamellékleteket és gazdag kártyákat jelöli. Ha médiamellékletet szeretne hozzáadni egy üzenethez, hozzon létre egy Attachment objektumot a reply tevékenységhez, és állítsa be a , ContentUrlés Name a ContentTypetulajdonságokat.
A válaszüzenet létrehozásához adja meg a szöveget, majd állítsa be a mellékleteket. A mellékletek a válaszhoz való hozzárendelése minden melléklettípus esetében ugyanaz, azonban a különböző mellékletek beállítása és definiálása másként történik, ahogyan az alábbi kódrészletekben látható. Az alábbi kód egy beágyazott melléklet válaszát állítja be:
Robotok/AttachmentsBot.cs
{
reply = MessageFactory.Text("This is an inline attachment.");
Ezután a mellékletek típusait tekintjük át. Az első egy beágyazott melléklet:
Robotok/AttachmentsBot.cs
{
var imagePath = Path.Combine(Environment.CurrentDirectory, @"Resources", "architecture-resize.png");
var imageData = Convert.ToBase64String(File.ReadAllBytes(imagePath));
return new Attachment
{
Name = @"Resources\architecture-resize.png",
ContentType = "image/png",
ContentUrl = $"data:image/png;base64,{imageData}",
};
}
Ezután egy feltöltött melléklet:
Robotok/AttachmentsBot.cs
{
if (string.IsNullOrWhiteSpace(serviceUrl))
{
throw new ArgumentNullException(nameof(serviceUrl));
}
if (string.IsNullOrWhiteSpace(conversationId))
{
throw new ArgumentNullException(nameof(conversationId));
}
var imagePath = Path.Combine(Environment.CurrentDirectory, @"Resources", "architecture-resize.png");
var connector = turnContext.TurnState.Get<IConnectorClient>() as ConnectorClient;
var attachments = new Attachments(connector);
var response = await attachments.Client.Conversations.UploadAttachmentAsync(
conversationId,
new AttachmentData
{
Name = @"Resources\architecture-resize.png",
OriginalBase64 = File.ReadAllBytes(imagePath),
Type = "image/png",
},
cancellationToken);
var attachmentUri = attachments.GetAttachmentUri(response.Id);
return new Attachment
{
Name = @"Resources\architecture-resize.png",
ContentType = "image/png",
ContentUrl = attachmentUri,
};
}
Végül egy internetes melléklet:
Robotok/AttachmentsBot.cs
{
// ContentUrl must be HTTPS.
return new Attachment
{
Name = @"Resources\architecture-resize.png",
ContentType = "image/png",
ContentUrl = "https://docs.microsoft.com/en-us/bot-framework/media/how-it-works/architecture-resize.png",
};
}
}
A válaszüzenet létrehozásához adja meg a szöveget, majd állítsa be a mellékleteket. A mellékletek a válaszhoz való hozzárendelése minden melléklettípus esetében ugyanaz, azonban a különböző mellékletek beállítása és definiálása másként történik, ahogyan az alábbi kódrészletekben látható. Az alábbi kód egy beágyazott melléklet válaszát állítja be:
robotok/attachmentsBot.js
*/
const firstChar = turnContext.activity.text[0];
if (firstChar === '1') {
Ha egyetlen tartalmat, például képet vagy videót szeretne küldeni a felhasználónak, többféleképpen is küldhet médiatartalmat. Először beágyazott mellékletként:
Végül egy URL-címben található internetes melléklet:
robotok/attachmentsBot.js
* Returns an attachment to be sent to the user from a HTTPS URL.
*/
getInternetAttachment() {
// NOTE: The contentUrl must be HTTPS.
return {
name: 'architecture-resize.png',
contentType: 'image/png',
contentUrl: 'https://docs.microsoft.com/en-us/bot-framework/media/how-it-works/architecture-resize.png'
Az ebben a szakaszban látható forráskód a Mellékletek kezelése mintán alapul.
Az getAttachments() objektum metódusa Activity olyan objektumtömböt Attachment tartalmaz, amely az üzenethez csatolt médiamellékleteket és gazdag kártyákat jelöli. Ha médiamellékletet szeretne hozzáadni egy üzenethez, hozzon létre egy Attachment objektumot a reply tevékenységhez, és állítsa be a , ContentUrlés Name a ContentTypetulajdonságokat.
A válaszüzenet létrehozásához adja meg a szöveget, majd állítsa be a mellékleteket. A mellékletek a válaszhoz való hozzárendelése minden melléklettípus esetében ugyanaz, azonban a különböző mellékletek beállítása és definiálása másként történik, ahogyan az alábbi kódrészletekben látható. Az alábbi kód egy beágyazott melléklet válaszát állítja be:
AttachmentsBot.java
result = getInlineAttachment()
.thenApply(attachment -> {
Activity reply = MessageFactory.text("This is an inline attachment.");
reply.setAttachment(attachment);
return reply;
});
Ezután a mellékletek típusait tekintjük át. Az első egy beágyazott melléklet:
AttachmentsBot.java
// Creates an inline attachment sent from the bot to the user using a base64 string.
// Using a base64 string to send an attachment will not work on all channels.
// Additionally, some channels will only allow certain file types to be sent this way.
// For example a .png file may work but a .pdf file may not on some channels.
// Please consult the channel documentation for specifics.
private CompletableFuture<Attachment> getInlineAttachment() {
return getEncodedFileData("architecture-resize.png")
.thenApply(encodedFileData -> {
Attachment attachment = new Attachment();
attachment.setName("architecture-resize.png");
attachment.setContentType("image/png");
attachment.setContentUrl("data:image/png;base64," + encodedFileData);
return attachment;
});
}
// Creates an Attachment to be sent from the bot to the user from a HTTP URL.
private static Attachment getInternetAttachment() {
// ContentUrl must be HTTPS.
Attachment attachment = new Attachment();
attachment.setName("architecture-resize.png");
attachment.setContentType("image/png");
attachment.setContentUrl("https://docs.microsoft.com/en-us/bot-framework/media/how-it-works/architecture-resize.png");
return attachment;
}
A válaszüzenet létrehozásához adja meg a szöveget, majd állítsa be a mellékleteket. A mellékletek a válaszhoz való hozzárendelése minden melléklettípus esetében ugyanaz, azonban a különböző mellékletek beállítása és definiálása másként történik, ahogyan az alábbi kódrészletekben látható.
Az alábbi kód egy beágyazott melléklet válaszát állítja be:
robotok/attachments_bot.py
reply.text = "This is an inline attachment."
reply.attachments = [self._get_inline_attachment()]
Ha egyetlen tartalmat, például képet vagy videót szeretne küldeni a felhasználónak, többféleképpen is küldhet médiatartalmat. Először beágyazott mellékletként:
robotok/attachments_bot.py
def _get_inline_attachment(self) -> Attachment:
"""
Creates an inline attachment sent from the bot to the user using a base64 string.
Using a base64 string to send an attachment will not work on all channels.
Additionally, some channels will only allow certain file types to be sent this way.
For example a .png file may work but a .pdf file may not on some channels.
Please consult the channel documentation for specifics.
:return: Attachment
"""
file_path = os.path.join(os.getcwd(), "resources/architecture-resize.png")
with open(file_path, "rb") as in_file:
base64_image = base64.b64encode(in_file.read()).decode()
return Attachment(
name="architecture-resize.png",
content_type="image/png",
content_url=f"data:image/png;base64,{base64_image}",
)
Ezután egy feltöltött melléklet:
robotok/attachments_bot.py
async def _get_upload_attachment(self, turn_context: TurnContext) -> Attachment:
"""
Creates an "Attachment" to be sent from the bot to the user from an uploaded file.
:param turn_context:
:return: Attachment
"""
with open(
os.path.join(os.getcwd(), "resources/architecture-resize.png"), "rb"
) as in_file:
image_data = in_file.read()
connector = await turn_context.adapter.create_connector_client(
turn_context.activity.service_url
)
conversation_id = turn_context.activity.conversation.id
response = await connector.conversations.upload_attachment(
conversation_id,
AttachmentData(
name="architecture-resize.png",
original_base64=image_data,
type="image/png",
),
)
base_uri: str = connector.config.base_url
attachment_uri = (
base_uri
+ ("" if base_uri.endswith("/") else "/")
+ f"v3/attachments/{response.id}/views/original"
)
return Attachment(
name="architecture-resize.png",
content_type="image/png",
content_url=attachment_uri,
)
Végül egy URL-címben található internetes melléklet:
robotok/attachments_bot.py
def _get_internet_attachment(self) -> Attachment:
"""
Creates an Attachment to be sent from the bot to the user from a HTTP URL.
:return: Attachment
"""
return Attachment(
name="architecture-resize.png",
content_type="image/png",
content_url="https://docs.microsoft.com/en-us/bot-framework/media/how-it-works/architecture-resize.png",
)
Ha egy melléklet kép, hang vagy videó, az Összekötő szolgáltatás úgy közli a mellékletadatokat a csatornával, hogy a csatorna megjeleníthesse a mellékletet a beszélgetésen belül. Ha a melléklet fájl, a fájl URL-címe hivatkozásként jelenik meg a beszélgetésben.
Fő képkártya küldése
Az egyszerű kép- vagy videomellékletek mellett egy főképkártyát is csatolhat, amellyel képeket és gombokat egyesíthet egy objektumban, és elküldheti őket a felhasználónak. A Markdown a legtöbb szövegmező esetében támogatott, de a támogatás csatornánként eltérő lehet.
private static async Task DisplayOptionsAsync(ITurnContext turnContext, CancellationToken cancellationToken)
{
// Create a HeroCard with options for the user to interact with the bot.
var card = new HeroCard
{
Text = "You can upload an image or select one of the following choices",
Buttons = new List<CardAction>
{
// Note that some channels require different values to be used in order to get buttons to display text.
// In this code the emulator is accounted for with the 'title' parameter, but in other channels you may
// need to provide a value for other parameters like 'text' or 'displayText'.
new CardAction(ActionTypes.ImBack, title: "1. Inline Attachment", value: "1"),
new CardAction(ActionTypes.ImBack, title: "2. Internet Attachment", value: "2"),
new CardAction(ActionTypes.ImBack, title: "3. Uploaded Attachment", value: "3"),
},
};
var reply = MessageFactory.Attachment(card.ToAttachment());
await turnContext.SendActivityAsync(reply, cancellationToken);
Ha hőskártyával és gombbal szeretne üzenetet írni, csatolhat egy objektumot HeroCard egy üzenethez.
* @param {Object} turnContext
*/
async displayOptions(turnContext) {
const reply = { type: ActivityTypes.Message };
// Note that some channels require different values to be used in order to get buttons to display text.
// In this code the emulator is accounted for with the 'title' parameter, but in other channels you may
// need to provide a value for other parameters like 'text' or 'displayText'.
const buttons = [
{ type: ActionTypes.ImBack, title: '1. Inline Attachment', value: '1' },
{ type: ActionTypes.ImBack, title: '2. Internet Attachment', value: '2' },
{ type: ActionTypes.ImBack, title: '3. Uploaded Attachment', value: '3' }
];
const card = CardFactory.heroCard('', undefined,
buttons, { text: 'You can upload an image or select one of the following choices.' });
reply.attachments = [card];
Ha hőskártyával és gombbal szeretne üzenetet írni, csatolhat egy objektumot HeroCard egy üzenethez.
private static CompletableFuture<Void> displayOptions(TurnContext turnContext) {
// Create a HeroCard with options for the user to interact with the bot.
HeroCard card = new HeroCard();
card.setText("You can upload an image or select one of the following choices");
// Note that some channels require different values to be used in order to get buttons to display text.
// In this code the emulator is accounted for with the 'title' parameter, but in other channels you may
// need to provide a value for other parameters like 'text' or 'displayText'.
card.setButtons(
new CardAction(ActionTypes.IM_BACK, "1. Inline Attachment", "1"),
new CardAction(ActionTypes.IM_BACK, "2. Internet Attachment", "2"),
new CardAction(ActionTypes.IM_BACK, "3. Uploaded Attachment", "3")
);
Activity reply = MessageFactory.attachment(card.toAttachment());
return turnContext.sendActivity(reply).thenApply(resourceResponse -> null);
}
Ha hőskártyával és gombbal szeretne üzenetet írni, csatolhat egy objektumot HeroCard egy üzenethez.
async def _display_options(self, turn_context: TurnContext):
"""
Create a HeroCard with options for the user to interact with the bot.
:param turn_context:
:return:
"""
# Note that some channels require different values to be used in order to get buttons to display text.
# In this code the emulator is accounted for with the 'title' parameter, but in other channels you may
# need to provide a value for other parameters like 'text' or 'displayText'.
card = HeroCard(
text="You can upload an image or select one of the following choices",
buttons=[
CardAction(
type=ActionTypes.im_back, title="1. Inline Attachment", value="1"
),
CardAction(
type=ActionTypes.im_back, title="2. Internet Attachment", value="2"
),
CardAction(
type=ActionTypes.im_back, title="3. Uploaded Attachment", value="3"
),
],
)
Események feldolgozása gazdag kártyákon belül
A gazdag kártyákon belüli események feldolgozásához használjon kártyaműveleti objektumokat annak meghatározására, hogy mi történjen, ha a felhasználó kiválaszt egy gombot, vagy koppintson a kártya egy szakaszára. Minden kártyaművelet típus- és értéktulajdonságokkal rendelkezik.
A helyes működéshez rendeljen hozzá egy művelettípust egy főkártya minden kattintható eleméhez. Ez a táblázat felsorolja és ismerteti a rendelkezésre álló művelettípusokat, valamint a társított érték tulajdonságban szereplő értékeket.
A messageBack kártyaműveletnek általánosabb jelentése van, mint a többi kártyaműveletnek. A tevékenységséma Kártyaművelet szakaszában további információt talál az messageBack egyéb kártyaművelet-típusokról.
Típus
Leírás
Érték
hív
Telefonhívást kezdeményez.
A telefonhívás célhelye ebben a formátumban: tel:123123123123.
downloadFile
Letölt egy fájlt.
A letölteni kívánt fájl URL-címe.
imBack
Üzenetet küld a robotnak, és látható választ jelenít meg a csevegésben.
A küldendő üzenet szövege.
messageBack
A csevegőrendszeren keresztül küldendő szöveges választ jelöli.
Nem kötelező programozott érték, amely belefoglalható a létrehozott üzenetekbe.
openUrl
Megnyitja az URL-címet a beépített böngészőben.
A megnyitni kívánt URL-cím.
playAudio
Hang lejátszása.
A lejátszandó hang URL-címe.
playVideo
Videó lejátszása.
A lejátszandó videó URL-címe.
postBack
Üzenetet küld a robotnak, és előfordulhat, hogy nem küld látható választ a csevegésben.
A küldendő üzenet szövege.
showImage
Kép megjelenítése.
A megjelenítendő kép URL-címe.
bejelentkezés
OAuth-bejelentkezési folyamatot kezdeményez.
A kezdeményezni kívánt OAuth-folyamat URL-címe.
Hőskártya különböző eseménytípusok használatával
Az alábbi kód különböző gazdag kártyaeseményeket használó példákat mutat be.
Az összes elérhető kártya példáiért lásd a Kártyák használata mintát.
Cards.cs
public static HeroCard GetHeroCard()
{
var heroCard = new HeroCard
{
Title = "BotFramework Hero Card",
Subtitle = "Microsoft Bot Framework",
Text = "Build and connect intelligent bots to interact with your users naturally wherever they are," +
" from text/sms to Skype, Slack, Office 365 mail and other popular services.",
Images = new List<CardImage> { new CardImage("https://sec.ch9.ms/ch9/7ff5/e07cfef0-aa3b-40bb-9baa-7c9ef8ff7ff5/buildreactionbotframework_960.jpg") },
Buttons = new List<CardAction> { new CardAction(ActionTypes.OpenUrl, "Get Started", value: "https://docs.microsoft.com/bot-framework") },
};
return heroCard;
}
Cards.cs
public static SigninCard GetSigninCard()
{
var signinCard = new SigninCard
{
Text = "BotFramework Sign-in Card",
Buttons = new List<CardAction> { new CardAction(ActionTypes.Signin, "Sign-in", value: "https://login.microsoftonline.com/") },
};
return signinCard;
}
Az összes elérhető kártya példáiért lásd a Kártyák használata mintát.
createOAuthCard() {
return CardFactory.oauthCard(
'OAuth connection', // Replace with the name of your Azure AD connection
'Sign In',
'BotFramework OAuth Card'
);
}
Az összes elérhető kártya példáiért lásd a Kártyák használata mintát.
Cards.java
public static HeroCard getHeroCard() {
HeroCard heroCard = new HeroCard();
heroCard.setTitle("BotFramework Hero Card");
heroCard.setSubtitle("Microsoft Bot Framework");
heroCard.setText("Build and connect intelligent bots to interact with your users naturally wherever they are," +
" from text/sms to Skype, Slack, Office 365 mail and other popular services.");
heroCard.setImages(new CardImage("https://sec.ch9.ms/ch9/7ff5/e07cfef0-aa3b-40bb-9baa-7c9ef8ff7ff5/buildreactionbotframework_960.jpg"));
heroCard.setButtons(new CardAction(ActionTypes.OPEN_URL, "Get Started", "https://docs.microsoft.com/bot-framework"));
return heroCard;
}
Cards.java
public static SigninCard getSigninCard() {
SigninCard signinCard = new SigninCard();
signinCard.setText("BotFramework Sign-in Card");
signinCard.setButtons(new CardAction(ActionTypes.SIGNIN, "Sign-in", "https://login.microsoftonline.com/"));
return signinCard;
}
Az összes elérhető kártya példáiért lásd a Kártyák használata mintát.
def create_oauth_card(self) -> Attachment:
card = OAuthCard(
text="BotFramework OAuth Card",
connection_name="OAuth connection", # Replace it with the name of your Azure AD connection.
buttons=[
CardAction(
type=ActionTypes.signin,
title="Sign in",
value="https://example.org/signin",
)
],
)
return CardFactory.oauth_card(card)
Adaptív kártya küldése
Bár az üzenet-előállítóval bármilyen mellékletet tartalmazó üzenetet hozhat létre, az Adaptív kártya egy adott melléklettípus. Nem minden csatorna támogatja az Adaptív kártyákat, és egyes csatornák csak részben támogatják az adaptív kártyákat. Ha például adaptív kártyát küld a Facebookon, a gombok nem fognak működni, miközben a szövegek és képek jól működnek. Az üzenet-előállító egy Bot Framework SDK-segédosztály, amellyel automatizálhatja a létrehozási lépéseket.
Az adaptív kártyák nyílt kártyacsere formátumot jelentenek, amely lehetővé teszi a fejlesztők számára a felhasználói felületi tartalmak közös és konzisztens cseréjét. Azonban nem minden csatorna támogatja az adaptív kártyákat.
Az Adaptív kártyák tervezője gazdag, interaktív tervezési időt biztosít az adaptív kártyák létrehozásához.
Feljegyzés
Ezt a funkciót a robot által használt csatornákkal kell tesztelnie annak megállapításához, hogy ezek a csatornák támogatják-e az adaptív kártyákat.
Az üzenetek több mellékletet is tartalmazhatnak a körhinta elrendezésben, amelyek egymás mellett helyezik el a mellékleteket, és lehetővé teszik a felhasználó számára a görgetést.
A következő forráskód a Kártyák használata mintából származik.
Párbeszédpanelek/MainDialog.cs
Először hozza létre a választ, és adja meg listaként a mellékleteket.
// Cards are sent as Attachments in the Bot Framework.
// So we need to create a list of attachments for the reply activity.
var attachments = new List<Attachment>();
// Reply to the activity we received with an activity.
var reply = MessageFactory.Attachment(attachments);
Ezután adja hozzá a mellékleteket, és állítsa be az elrendezés típusát körhintára.
Itt egyenként adjuk hozzá őket, de nyugodtan módosíthatja a listát, hogy tetszés szerint adja hozzá a kártyákat.
// Display a carousel of all the rich card types.
reply.AttachmentLayout = AttachmentLayoutTypes.Carousel;
reply.Attachments.Add(Cards.CreateAdaptiveCardAttachment());
reply.Attachments.Add(Cards.GetAnimationCard().ToAttachment());
reply.Attachments.Add(Cards.GetAudioCard().ToAttachment());
reply.Attachments.Add(Cards.GetHeroCard().ToAttachment());
reply.Attachments.Add(Cards.GetOAuthCard().ToAttachment());
reply.Attachments.Add(Cards.GetReceiptCard().ToAttachment());
reply.Attachments.Add(Cards.GetSigninCard().ToAttachment());
reply.Attachments.Add(Cards.GetThumbnailCard().ToAttachment());
reply.Attachments.Add(Cards.GetVideoCard().ToAttachment());
A mellékletek hozzáadása után ugyanúgy küldheti el a választ, mint bármelyik másikat.
// Send the card(s) to the user as an attachment to the activity
await stepContext.Context.SendActivityAsync(reply, cancellationToken);
A következő forráskód a Kártyák használata mintából származik.
párbeszédpanelek/mainDialog.js
Adja hozzá a mellékleteket, és állítsa az elrendezés típusát körhintára.
A mellékletek hozzáadása után ugyanúgy küldheti el a választ, mint bármelyik másikat.
A következő forráskód a Kártyák használata mintából származik.
MainDialog.java
Először hozza létre a választ, és adja meg listaként a mellékleteket.
// Cards are sent as Attachments in the Bot Framework.
// So we need to create a list of attachments for the reply activity.
List<Attachment> attachments = new ArrayList<>();
// Reply to the activity we received with an activity.
Activity reply = MessageFactory.attachment(attachments);
Ezután adja hozzá a mellékleteket, és állítsa be az elrendezés típusát körhintára.
Itt egyenként adjuk hozzá őket, de nyugodtan módosíthatja a listát, hogy tetszés szerint adja hozzá a kártyákat.
// Display a carousel of all the rich card types.
reply.setAttachmentLayout(AttachmentLayoutTypes.CAROUSEL);
reply.getAttachments().add(Cards.createAdaptiveCardAttachment());
reply.getAttachments().add(Cards.getAnimationCard().toAttachment());
reply.getAttachments().add(Cards.getAudioCard().toAttachment());
reply.getAttachments().add(Cards.getHeroCard().toAttachment());
reply.getAttachments().add(Cards.getOAuthCard().toAttachment());
reply.getAttachments().add(Cards.getReceiptCard().toAttachment());
reply.getAttachments().add(Cards.getSigninCard().toAttachment());
reply.getAttachments().add(Cards.getThumbnailCard().toAttachment());
reply.getAttachments().add(Cards.getVideoCard().toAttachment());
A mellékletek hozzáadása után ugyanúgy küldheti el a választ, mint bármelyik másikat.
// Send the card(s) to the user as an attachment to the activity
return stepContext.getContext().sendActivity(reply)
Az itt látható forráskód a kártyák mintáján alapul.
párbeszédpanelek/main_dialog.py
Először hozza létre a választ, és adja meg listaként a mellékleteket.
reply = MessageFactory.list([])
Ezután adja hozzá a mellékleteket, és állítsa be az elrendezés típusát körhintára.
Itt egyenként adjuk hozzá őket, de nyugodtan módosíthatja a listát, hogy tetszés szerint adja hozzá a kártyákat.
Az alábbi minta bemutatja, hogyan használhat adaptív kártya bemeneteket egy robot párbeszédpanel-osztályán belül.
Kibővíti a főképkártyák mintáját a válaszul szolgáló ügyfél szövegmezőjében kapott bemenet érvényesítésével.
Először hozzá kell adnia a szövegbeviteli és gombfunkciókat a meglévő adaptív kártyához, ha a következő kódot adja hozzá a adaptiveCard.json utolsó zárójele előtt, amely az erőforrások mappájában található:
A szövegbeviteli mező azonosítója "szöveg". Amikor a felhasználó az OK gombot választja, az Adaptív kártya által generált üzenet egy olyan értéktulajdonságú tulajdonságot text fog kapni, amely tartalmazza a felhasználó által a kártya szövegbeviteli mezőjébe beírt adatokat.
Az érvényesítő Newtonsoft.json használ, hogy először átalakítsa ezt egy JObject, majd hozzon létre egy levágott szöveges sztringet az összehasonlításhoz. Így adja hozzá:
using System;
using System.Linq;
using Newtonsoft.Json.Linq;
a Newtonsoft.Json legújabb stabil NuGet-csomagjának MainDialog.cs és telepítéséhez.
Az érvényesítő kódban hozzáadtuk a logikai folyamatot a kód megjegyzéseihez.
Ezt ChoiceValidator a metódust a Rendszer a Kártyák használata mintába helyezi a MainDialog deklarálásához szükséges zárt kapcsos zárójelek után:
private async Task ChoiceValidator(
PromptValidatorContext promptContext,
CancellationToken cancellationToken)
{
// Retrieves Adaptive Card comment text as JObject.
// looks for JObject field "text" and converts that input into a trimmed text string.
var jobject = promptContext.Context.Activity.Value as JObject;
var jtoken = jobject?["text"];
var text = jtoken?.Value().Trim();
// Logic: 1. if succeeded = true, just return promptContext
// 2. if false, see if JObject contained Adaptive Card input.
// No = (bad input) return promptContext
// Yes = update Value field with JObject text string, return "true".
if (!promptContext.Recognized.Succeeded && text != null)
{
var choice = promptContext.Options.Choices.FirstOrDefault(
c => c.Value.Equals(text, StringComparison.InvariantCultureIgnoreCase));
if (choice != null)
{
promptContext.Recognized.Value = new FoundChoice
{
Value = choice.Value,
};
return true;
}
}
return promptContext.Recognized.Succeeded;
}
Most fent a MainDialog deklaráció módosításában:
// Define the main dialog and its related components.
AddDialog(new ChoicePrompt(nameof(ChoicePrompt)));
erre:
// Define the main dialog and its related components.
AddDialog(new ChoicePrompt(nameof(ChoicePrompt), ChoiceValidator));
Ez meghívja az érvényesítőt, hogy minden új választási kérés létrehozásakor keresse meg az adaptív kártya bemenetét.
Nyissa meg mainDialog.js , és keresse meg a futtatási módszert async run(turnContext, accessor) : Ez a metódus kezeli a bejövő tevékenységeket.
A hívás dialogSet.add(this); után adja hozzá a következőket:
// The following check looks for a non-existent text input
// plus Adaptive Card input in _activity.value.text
// If both conditions exist, the Activity Card text
// is copied into the text input field.
if(turnContext._activity.text == null
&& turnContext._activity.value.text != null) {
this.logger.log('replacing null text with Activity Card text input');
turnContext._activity.text = turnContext._activity.value.text;
}
Ha ez az ellenőrzés nem létező szöveges bemenetet talál az ügyféltől, azt látja, hogy van-e bemenet egy adaptív kártyáról.
Ha egy adaptív kártya bemenete _activity.value.textlétezik, akkor ezt a normál szövegbeviteli mezőbe másolja.
Az érvényesítő a com.microsoft.bot.schema szerializálási segédje segítségével először átalakítja ezt egy JsonNode, majd egy levágott szöveges sztringet az összehasonlításhoz. Ehhez további importálásra is szükség lesz, ezért vegye fel a következőt:
MainDialog.java.
Az érvényesítő kódban hozzáadtuk a logikai folyamatot a kód megjegyzéseihez.
Ez PromptValidator a kifejezés a Kártyák használata mintába kerül a MainDialog deklarálásához használt zárt zárójel nyilvános zárójele után:
PromptValidator<FoundChoice> validator = (promptContext) -> {
// Retrieves Adaptive Card comment text as JObject.
// looks for JObject field "text" and converts that input into a trimmed text
// string.
JsonNode jsonNode = Serialization.getAs(promptContext.getContext().getActivity().getValue(), JsonNode.class);
JsonNode textNode = jsonNode != null ? jsonNode.get("text") : null;
String text = textNode != null ? textNode.textValue() : "";
// Logic: 1. if succeeded = true, just return promptContext
// 2. if false, see if JObject contained Adaptive Card input.
// No = (bad input) return promptContext
// Yes = update Value field with JObject text string, return "true".
if (!promptContext.getRecognized().getSucceeded() && text != null) {
Optional<Choice> choice = promptContext.getOptions()
.getChoices()
.stream()
.filter(c -> StringUtils.compareIgnoreCase(c.getValue(), text) == 0)
.findFirst();
if (choice.isPresent()) {
promptContext.getRecognized().setValue(new FoundChoice() {
{
setValue(choice.get().getValue());
}
});
return CompletableFuture.completedFuture(true);
}
}
return CompletableFuture.completedFuture(promptContext.getRecognized().getSucceeded());
};
Most fent a MainDialog deklaráció módosításában:
// Define the main dialog and its related components.
addDialog(new ChoicePrompt("ChoicePrompt"));
erre:
// Define the main dialog and its related components.
addDialog(new ChoicePrompt("ChoicePrompt", validator, null));
Ez meghívja az érvényesítőt, hogy minden új választási kérés létrehozásakor keresse meg az adaptív kártya bemenetét.
Hozzon létre és küldjön egy tevékenységet a felhasználónak javasolt műveletekkel.
Ezt choice_validator a módszert a Rendszer a "Kártyák használata" mintába helyezi a zárt kapcsos zárójel nyilvános deklarációja MainDialogután:
@staticmethod
async def choice_validator(prompt_context: PromptValidatorContext) -> bool:
if prompt_context.context.activity.value:
text = prompt_context.context.activity.value["text"].lower()
if not prompt_context.recognized.succeeded and text:
matching_choices = [choice for choice in prompt_context.options.choices if choice.value.lower() == text]
if matching_choices:
choice = matching_choices[0]
prompt_context.recognized.value = FoundChoice(
value=choice.value,
index=0,
score=1.0
)
return True
return prompt_context.recognized.succeeded