Inviare allegati multimediali con Bot Framework SDK

SI APPLICA A: SDK v4

I messaggi scambiati tra utente e bot possono contenere allegati multimediali come immagini, video, audio e file. Bot Framework SDK supporta l'attività di invio di messaggi avanzati all'utente. Per determinare il tipo di messaggi avanzati supportati da un canale (Facebook, Slack e così via), consultare la documentazione del canale per informazioni sulle limitazioni.

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. Verranno eseguite solo correzioni di bug e sicurezza critiche all'interno di questo repository.

I bot esistenti creati con Java SDK continueranno a funzionare.

Per la creazione di nuovi bot, prendere in considerazione l'uso di Power Virtual Agents e leggere la scelta della soluzione chatbot appropriata.

Per altre informazioni, vedere Il futuro della compilazione di bot.

Prerequisiti

Inviare allegati

Per inviare il contenuto dell'utente, come un'immagine o un video, è possibile aggiungere un allegato o un elenco di allegati a un messaggio.

Vedere Progettare l'esperienza utente per esempi di schede disponibili.

Vedere anche Qual è il limite di dimensioni di un file trasferito tramite canali? nelle domande frequenti.

Tutto il codice sorgente illustrato in questa sezione si basa sull'esempio Di gestione degli allegati.

La proprietà Attachments dell'oggetto Activity contiene una matrice degli oggetti Attachment che rappresentano gli allegati multimediali e le schede avanzate allegate al messaggio. Per aggiungere un allegato multimediale a un messaggio, creare un oggetto Attachment per l'attività reply e impostare le proprietà ContentType, ContentUrl, e Name.

Per creare il messaggio di risposta, definire il testo e quindi configurare gli allegati. La procedura di assegnazione degli allegati alla risposta è la stessa per ogni tipo di allegato, ma i vari allegati vengono configurati e definiti in modo diverso, come si nota nei frammenti seguenti. Il codice seguente consente di configurare la risposta per un allegato inline:

Bots/AttachmentsBot.cs

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

Verranno ora esaminati i tipi di allegati. Il primo è un allegato inline:

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

Quindi, come allegato caricato:

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

Ed infine, ecco un allegato Internet:

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

Se l'allegato è un'immagine, un audio o un video, il servizio del connettore comunicherà i dati allegati al canale in modo da permettere al canale di eseguire il rendering di tale allegato all'interno della conversazione. Se l'allegato è un file, l'URL del file verrà reso come collegamento ipertestuale all'interno della conversazione.

Inviare una scheda banner

Oltre alla semplice immagine o agli allegati video, è possibile allegare una scheda banner, che consente di combinare le immagini e i pulsanti in un oggetto e li inviano all'utente. La sintassi markdown è supportata per la maggior parte dei campi di testo, ma il supporto può variare a seconda del canale.

Per comporre un messaggio con una scheda hero e un pulsante, è possibile allegare un HeroCard oggetto a un messaggio.

Il codice sorgente seguente proviene dall'esempio Di gestione degli allegati.

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

Elaborare gli eventi nelle schede avanzate

Per elaborare gli eventi all'interno di schede avanzate, utilizzare oggetti azione scheda per specificare cosa deve accadere quando l'utente seleziona un pulsante o tocca una sezione della scheda. Ogni azione della scheda ha una proprietà di tipo e valore .

Per funzionare correttamente, assegnare un tipo di azione a ogni elemento selezionabile su una scheda hero. Questa tabella elenca e descrive i tipi di azioni disponibili e il valore da inserire nella proprietà valore associata. L'azione messageBack della scheda ha un significato più generalizzato rispetto alle altre azioni della scheda. Vedere la sezione Azione scheda dello schema Attività per altre informazioni sui messageBack tipi di azione e altri tipi di azione scheda.

Type Descrizione Valore
call Avvia una chiamata telefonica. Destinazione della chiamata telefonica in questo formato: tel:123123123123.
downloadFile Scarica un file. URL del file da scaricare.
ImBack Invia un messaggio al bot e pubblica una risposta visibile nella chat. Testo del messaggio da inviare.
messageBack Rappresenta una risposta di testo da inviare tramite il sistema di chat. Valore programmatico facoltativo da includere nei messaggi generati.
openUrl Apre un URL nel browser predefinito. URL da aprire.
PlayAudio Riproduce un contenuto audio. URL dell'audio da riprodurre.
PlayVideo Riproduce un contenuto video. URL del video da riprodurre.
PostBack Invia un messaggio al bot e potrebbe non pubblicare una risposta visibile nella chat. Testo del messaggio da inviare.
showImage Visualizza un'immagine. URL dell'immagine da visualizzare.
signin Avvia un processo di accesso OAuth. URL del flusso OAuth da iniziare.

Scheda banner usando vari tipi di evento

Il codice seguente illustra gli esempi relativi a vari eventi di schede avanzate.

Per esempi di tutte le schede disponibili, vedere l'esempio Using cards (Uso di schede).

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

Invio di una scheda adattiva

Anche se è possibile usare la factory dei messaggi per creare un messaggio contenente un allegato (di qualsiasi tipo), una scheda adattiva è un tipo specifico di allegato. Non tutti i canali supportano schede adattive e alcuni canali possono supportare solo parzialmente le schede adattive. Se ad esempio se si invia una scheda adattiva in Facebook, testi e immagini funzionano correttamente, mentre i pulsanti non funzionano. La factory dei messaggi è una classe helper di Bot Framework SDK usata per automatizzare i passaggi di creazione.

Le schede adattive sono un formato di scambio di schede aperto che consente agli sviluppatori di scambiare il contenuto dell'interfaccia utente in modo comune e coerente. Tuttavia, non tutti i canali supportano le schede adattive.

Progettazione schede adattive offre un'esperienza di progettazione interattiva avanzata per la creazione di schede adattive.

Nota

È consigliabile testare questa funzionalità con i canali che verranno usati dal bot per determinare se tali canali supportano le schede adattive.

Per usare Schede adattive, assicurarsi di aggiungere il pacchetto NuGet AdaptiveCards.

Il codice sorgente seguente proviene dall'esempio Using cards .The following source code is from the Using cards sample .

Cards.cs

Questo esempio legge il codice JSON della scheda adattiva da un file e lo aggiunge come allegato.

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

I messaggi possono anche includere più allegati in un layout di sequenza, che inserisce gli allegati affiancati e consente all'utente lo scorrimento.

Il codice sorgente seguente proviene dall'esempio Using cards .The following source code is from the Using cards sample .

Dialogs/MainDialog.cs

Creare la risposta e definire gli allegati sotto forma di elenco.

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

Aggiungere quindi gli allegati e impostare il tipo di layout su carousel. In questo caso gli allegati vengono aggiunti uno alla volta, ma è possibile modificare l'elenco per aggiungere le schede nel modo che si preferisce.

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

Dopo aver aggiunto gli allegati, è possibile inviare la risposta come qualsiasi altra.

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

Esempio di codice per l'elaborazione dell'input di schede adattive

L'esempio seguente illustra un modo per usare gli input della scheda adattiva all'interno di una classe di dialogo del bot. Estende l'esempio di schede hero convalidando l'input ricevuto nel campo di testo dal client che risponde. È prima necessario aggiungere la funzionalità input di testo e pulsante alla scheda adattiva esistente aggiungendo il codice seguente subito prima della parentesi quadra finale di adaptiveCard.json, che si trova nella cartella resources:

"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"
        }
      ]
    }
  }
]

L'ID del campo di input di testo è impostato su "text". Quando l'utente seleziona OK, il messaggio generato dalla scheda adattiva avrà una proprietà valore con una proprietà denominata text che contiene le informazioni immesse dall'utente nel campo di input di testo della scheda.

Il validator usa Newtonsoft.json per convertirlo prima in un JObjectoggetto e quindi creare una stringa di testo tagliata per il confronto. Aggiungere:

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

in MainDialog.cs e installare il pacchetto NuGet stabile più recente di Newtonsoft.Json. Nel codice del validator è stato aggiunto il flusso logico nei commenti del codice. Questo ChoiceValidator metodo viene inserito nell'esempio Using cards subito dopo la parentesi graffa chiusa per la dichiarazione di 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;
}

A questo ora sopra nella modifica della MainDialog dichiarazione:

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

Verrà richiamato il validator per cercare l'input della scheda adattiva ogni volta che viene creata una nuova richiesta di scelta.

Testare il bot Using Cards

  1. Eseguire l'esempio Using cards localmente e aprire il bot in Bot Framework Emulator.
  2. Seguire le istruzioni nel bot per visualizzare un tipo di scheda, ad esempio una scheda adattiva.

Passaggi successivi