Mediabijlagen verzenden met Bot Framework SDK

VAN TOEPASSING OP: SDK v4

Berichten die worden uitgewisseld tussen gebruikers en bot, kunnen mediabijlagen bevatten, zoals afbeeldingen, video, audio en bestanden. De Bot Framework SDK ondersteunt de taak van het verzenden van uitgebreide berichten naar de gebruiker. Raadpleeg de documentatie van het kanaal voor informatie over beperkingen om te bepalen welk type rich messages een kanaal (Facebook, Slack, enzovoort) ondersteunt.

Notitie

De Sdk's voor Bot Framework JavaScript, C# en Python blijven ondersteund, maar de Java SDK wordt buiten gebruik gesteld met definitieve langetermijnondersteuning die eindigt op november 2023.

Bestaande bots die zijn gebouwd met de Java SDK blijven functioneren.

Voor het bouwen van nieuwe bots kunt u Power Virtual Agents gebruiken en lezen over het kiezen van de juiste chatbotoplossing.

Zie De toekomst van botbouw voor meer informatie.

Vereisten

Bijlagen verzenden

Als u de gebruikersinhoud, zoals een afbeelding of een video, wilt verzenden, kunt u een bijlage of lijst met bijlagen toevoegen aan een bericht.

Zie De gebruikerservaring ontwerpen voor voorbeelden van beschikbare kaarten.

Zie ook Wat is de groottelimiet van een bestand dat wordt overgedragen met behulp van kanalen? in de veelgestelde vragen.

Alle broncode die in deze sectie wordt weergegeven, is gebaseerd op het voorbeeld van het verwerken van bijlagen .

De Attachments eigenschap van het Activity object bevat een matrix met Attachment objecten die de mediabijlagen en uitgebreide kaarten vertegenwoordigen die aan het bericht zijn gekoppeld. Als u een mediabijlage wilt toevoegen aan een bericht, maakt u een Attachment object voor de reply activiteit en stelt u de ContentType, ContentUrlen Name eigenschappen in.

Als u het antwoordbericht wilt maken, definieert u de tekst en stelt u de bijlagen in. Het toewijzen van de bijlagen aan het antwoord is hetzelfde voor elk bijlagetype, maar de verschillende bijlagen worden anders ingesteld en gedefinieerd, zoals te zien is in de volgende fragmenten. Met de onderstaande code wordt het antwoord voor een inlinebijlage ingesteld:

Bots/AttachmentsBot.cs

{
    reply = MessageFactory.Text("This is an inline attachment.");

Vervolgens kijken we naar de typen bijlagen. Eerst is een inlinebijlage:

Bots/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}",
    };
}

Vervolgens een geüploade bijlage:

Bots/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,
    };
}

Ten slotte: een internetbijlage:

Bots/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",
        };
    }
}

Als een bijlage een afbeelding, audio of video is, communiceert de Verbinding maken orservice de bijlagegegevens naar het kanaal op een manier waarmee het kanaal die bijlage in het gesprek kan weergeven. Als de bijlage een bestand is, wordt de bestands-URL weergegeven als hyperlink in het gesprek.

Een herokaart verzenden

Naast eenvoudige afbeeldingen of videobijlagen kunt u een hero-kaart koppelen, waarmee u afbeeldingen en knoppen in één object kunt combineren en naar de gebruiker kunt verzenden. Markdown wordt ondersteund voor de meeste tekstvelden, maar ondersteuning kan per kanaal verschillen.

Als u een bericht wilt opstellen met een hero-kaart en -knop, kunt u een HeroCard object aan een bericht koppelen.

De volgende broncode is afkomstig uit het voorbeeld van het verwerken van bijlagen .

Bots/AttachmentsBot.cs


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

Gebeurtenissen binnen uitgebreide kaarten verwerken

Als u gebeurtenissen binnen uitgebreide kaarten wilt verwerken, gebruikt u kaartactieobjecten om op te geven wat er moet gebeuren wanneer de gebruiker een knop selecteert of tikt op een sectie van de kaart. Elke kaartactie heeft een eigenschap type en waarde .

Als u correct wilt functioneren, wijst u een actietype toe aan elk klikbaar item op een hero-kaart. In deze tabel worden de beschikbare actietypen vermeld en beschreven en wat er moet staan in de bijbehorende waardeeigenschap. De messageBack kaartactie heeft een meer gegeneraliseerde betekenis dan de andere kaartacties. Zie de sectie Kaartactie van het activiteitenschema voor meer informatie over de messageBack en andere kaartactietypen.

Type Description Waarde
call Start een telefoongesprek. Bestemming voor het telefoongesprek in deze indeling: tel:123123123123.
downloadFile Hiermee downloadt u een bestand. De URL van het bestand dat u wilt downloaden.
imBack Verzendt een bericht naar de bot en plaatst een zichtbaar antwoord in de chat. Tekst van het bericht dat moet worden verzonden.
messageBack Vertegenwoordigt een tekstantwoord dat moet worden verzonden via het chatsysteem. Een optionele programmatische waarde die moet worden opgenomen in gegenereerde berichten.
Openurl Hiermee opent u een URL in de ingebouwde browser. De URL die moet worden geopend.
playAudio Speelt audio af. De URL van de audio die moet worden afgespeeld.
playVideo Hiermee wordt een video afgespeeld. De URL van de video die moet worden afgespeeld.
postBack Verzendt een bericht naar de bot en plaatst mogelijk geen zichtbaar antwoord in de chat. Tekst van het bericht dat moet worden verzonden.
showImage Geeft een afbeelding weer. De URL van de afbeelding die moet worden weergegeven.
aanmelden Hiermee wordt een OAuth-aanmeldingsproces gestart. De URL van de OAuth-stroom die moet worden gestart.

Hero-kaart met verschillende gebeurtenistypen

In de volgende code ziet u voorbeelden met behulp van verschillende uitgebreide kaartevenementen.

Zie het voorbeeld Kaarten gebruiken voor voorbeelden van alle beschikbare kaarten.

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

Een adaptieve kaart verzenden

Hoewel u de berichtenfactory kunt gebruiken om een bericht te maken dat een bijlage (van welke aard dan ook) bevat, is een adaptieve kaart één specifiek type bijlage. Niet alle kanalen ondersteunen adaptieve kaarten en sommige kanalen ondersteunen mogelijk slechts gedeeltelijk adaptieve kaarten. Als u bijvoorbeeld een adaptieve kaart in Facebook verzendt, werken de knoppen niet terwijl teksten en afbeeldingen goed werken. De berichtenfactory is een Bot Framework SDK-helperklasse die wordt gebruikt om de stappen voor het maken voor u te automatiseren.

Adaptieve kaarten zijn een open kaartuitwisselingsindeling waarmee ontwikkelaars UI-inhoud op een algemene en consistente manier kunnen uitwisselen. Niet alle kanalen ondersteunen echter adaptieve kaarten.

De ontwerpfunctie voor adaptieve kaarten biedt een rijke, interactieve ontwerptijd voor het ontwerpen van adaptieve kaarten.

Notitie

U moet deze functie testen met de kanalen die uw bot gebruikt om te bepalen of deze kanalen adaptieve kaarten ondersteunen.

Als u adaptieve kaarten wilt gebruiken, moet u het AdaptiveCards NuGet-pakket toevoegen.

De volgende broncode is afkomstig uit het voorbeeld kaarten gebruiken.

Cards.cs

In dit voorbeeld wordt de JSON van een adaptieve kaart uit een bestand gelezen en toegevoegd als bijlage.

public static Attachment CreateAdaptiveCardAttachment()
{
    // combine path for cross platform support
    var paths = new[] { ".", "Resources", "adaptiveCard.json" };
    var adaptiveCardJson = File.ReadAllText(Path.Combine(paths));

    var adaptiveCardAttachment = new Attachment()
    {
        ContentType = "application/vnd.microsoft.card.adaptive",
        Content = JsonConvert.DeserializeObject(adaptiveCardJson),
    };

    return adaptiveCardAttachment;
}

Berichten kunnen ook meerdere bijlagen bevatten in een carrouselindeling, waardoor de bijlagen naast elkaar worden geplaatst en de gebruiker kan schuiven.

De volgende broncode is afkomstig uit het voorbeeld kaarten gebruiken.

Dialoogvensters/MainDialog.cs

Maak eerst het antwoord en definieer de bijlagen als een lijst.

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

Voeg vervolgens de bijlagen toe en stel het indelingstype in op carrousel. Hier voegen we ze één voor één toe, maar u kunt de lijst bewerken om de kaarten op de gewenste wijze toe te voegen.

// 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());

Zodra de bijlagen zijn toegevoegd, kunt u het antwoord net als elke andere verzenden.

// Send the card(s) to the user as an attachment to the activity
await stepContext.Context.SendActivityAsync(reply, cancellationToken);

Codevoorbeeld voor het verwerken van adaptieve kaartinvoer

In het volgende voorbeeld ziet u een manier om adaptieve kaartinvoer in een botdialoogvensterklasse te gebruiken. Het breidt het voorbeeld van hero-kaarten uit door de invoer die in het tekstveld is ontvangen, te valideren van de reagerende client. U moet eerst de tekstinvoer- en knopfunctionaliteit toevoegen aan de bestaande adaptieve kaart door de volgende code toe te voegen vlak voor de laatste vierkante haak van adaptiveCard.json, die zich in de map resources bevindt:

"actions": [
  {
    "type": "Action.ShowCard",
    "title": "Text",
    "card": {
      "type": "AdaptiveCard",
      "body": [
        {
          "type": "Input.Text",
          "id": "text",
          "isMultiline": true,
          "placeholder": "Enter your comment"
        }
      ],
      "actions": [
        {
          "type": "Action.Submit",
          "title": "OK"
        }
      ]
    }
  }
]

De id van het tekstinvoerveld is ingesteld op 'tekst'. Wanneer de gebruiker OK selecteert, heeft het bericht dat de adaptieve kaart genereert een waardeeigenschap met een eigenschap met de naam text die de gebruiker in het tekstinvoerveld van de kaart heeft ingevoerd.

Onze validator gebruikt Newtonsoft.json om dit eerst te converteren naar een JObjecten vervolgens een teksttekenreeks met bijgesneden tekst te maken voor vergelijking. Voeg dus toe:

using System;
using System.Linq;
using Newtonsoft.Json.Linq;

om het nieuwste stabiele NuGet-pakket van Newtonsoft.Json te MainDialog.cs en te installeren. In de validatiecode hebben we de logicastroom toegevoegd aan de codeopmerkingen. Deze ChoiceValidator methode wordt in het voorbeeld kaarten gebruiken geplaatst vlak na de gesloten accolade openbaar voor declaratie van MainDialog:

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

Nu hierboven in de MainDialog declaratiewijziging:

// Define the main dialog and its related components.
AddDialog(new ChoicePrompt(nameof(ChoicePrompt)));

in:

// Define the main dialog and its related components.
AddDialog(new ChoicePrompt(nameof(ChoicePrompt), ChoiceValidator));

Hiermee wordt uw validator aangeroepen om te zoeken naar adaptieve kaartinvoer telkens wanneer er een nieuwe keuzeprompt wordt gemaakt.

De Bot Kaarten gebruiken testen

  1. Voer het voorbeeld kaarten gebruiken lokaal uit en open de bot in de Bot Framework Emulator.
  2. Volg de aanwijzingen in de bot om een kaarttype weer te geven, zoals een adaptieve kaart.

Volgende stappen