Mengirim lampiran media dengan Bot Framework SDK

BERLAKU UNTUK: SDK v4

Pesan yang dipertukarkan antara pengguna dan bot dapat berisi lampiran media, seperti gambar, video, audio, dan file. Bot Framework SDK mendukung tugas mengirim pesan kaya kepada pengguna. Untuk menentukan jenis pesan kaya yang didukung saluran (Facebook, Slack, dan sebagainya), lihat dokumentasi saluran untuk informasi tentang batasan.

Catatan

Bot Framework JavaScript, C#, dan Python SDK akan terus didukung, namun, Java SDK dihentikan dengan dukungan jangka panjang akhir yang berakhir pada November 2023.

Bot yang ada yang dibangun dengan Java SDK akan terus berfungsi.

Untuk pembuatan bot baru, pertimbangkan untuk menggunakan Power Virtual Agents dan baca tentang memilih solusi chatbot yang tepat.

Untuk informasi selengkapnya, lihat Masa depan pembuatan bot.

Prasyarat

Mengirim lampiran

Untuk mengirim konten pengguna seperti gambar atau video, Anda bisa menambahkan lampiran atau daftar lampiran ke pesan.

Lihat Mendesain pengalaman pengguna untuk contoh kartu yang tersedia.

Lihat juga Berapa batas ukuran file yang ditransfer menggunakan saluran? di FAQ.

Semua kode sumber yang ditampilkan di bagian ini didasarkan pada sampel Penanganan lampiran .

Properti AttachmentsActivity objek berisi array Attachment objek yang mewakili lampiran media dan kartu kaya yang dilampirkan ke pesan. Untuk menambahkan lampiran media ke pesan, buat objek untuk reply aktivitas dan atur ContentTypeproperti , ContentUrl, dan Name .Attachment

Untuk membuat pesan balasan, tentukan teks lalu siapkan lampiran. Menetapkan lampiran ke balasan sama untuk setiap jenis lampiran, namun berbagai lampiran disiapkan dan didefinisikan secara berbeda, seperti yang terlihat dalam cuplikan berikut. Kode di bawah ini menyiapkan balasan untuk lampiran sebaris:

Bot/AttachmentsBot.cs

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

Selanjutnya, kita melihat jenis lampiran. Pertama adalah lampiran sebaris:

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

Kemudian, lampiran yang diunggah:

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

Terakhir, lampiran internet:

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

Jika lampiran adalah gambar, audio, atau video, layanan Koneksi or akan mengkomunikasikan data lampiran ke saluran dengan cara yang memungkinkan saluran merender lampiran tersebut dalam percakapan. Jika lampiran adalah file, URL file akan dirender sebagai hyperlink dalam percakapan.

Mengirim kartu pahlawan

Selain lampiran gambar atau video sederhana, Anda dapat melampirkan kartu hero, yang memungkinkan Anda menggabungkan gambar dan tombol dalam satu objek, dan mengirimkannya ke pengguna. Markdown didukung untuk sebagian besar bidang teks, tetapi dukungan dapat bervariasi menurut saluran.

Untuk membuat pesan dengan kartu dan tombol hero, Anda dapat melampirkan HeroCard objek ke pesan.

Kode sumber berikut berasal dari sampel Menangani lampiran .

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

Memproses peristiwa dalam kartu kaya

Untuk memproses peristiwa dalam kartu kaya, gunakan objek tindakan kartu untuk menentukan apa yang harus terjadi saat pengguna memilih tombol atau mengetuk bagian kartu. Setiap tindakan kartu memiliki properti jenis dan nilai .

Agar berfungsi dengan benar, tetapkan jenis tindakan ke setiap item yang dapat diklik pada kartu hero. Tabel ini mencantumkan dan menjelaskan jenis tindakan yang tersedia dan apa yang harus ada di properti nilai terkait. Tindakan messageBack kartu memiliki arti yang lebih umum daripada tindakan kartu lainnya. Lihat bagian Tindakan kartu dari skema Aktivitas untuk informasi selengkapnya tentang messageBack jenis tindakan kartu dan lainnya.

Tipe Deskripsi Nilai
panggil Memulai panggilan telepon. Tujuan untuk panggilan telepon dalam format ini: tel:123123123123.
downloadFile Mengunduh file. URL file yang akan diunduh.
imBack Mengirim pesan ke bot, dan memposting respons yang terlihat dalam obrolan. Teks pesan yang akan dikirim.
messageBack Mewakili respons teks yang akan dikirim melalui sistem obrolan. Nilai terprogram opsional untuk disertakan dalam pesan yang dihasilkan.
openUrl Membuka URL di browser bawaan. URL yang akan dibuka.
playAudio Memutar audio. URL audio yang akan diputar.
playVideo Memutar video. URL video yang akan diputar.
Postback Mengirim pesan ke bot, dan mungkin tidak memposting respons yang terlihat dalam obrolan. Teks pesan yang akan dikirim.
showImage Menampilkan gambar. URL gambar yang akan ditampilkan.
masuk Memulai proses masuk OAuth. URL alur OAuth untuk memulai.

Kartu hero menggunakan berbagai jenis peristiwa

Kode berikut menunjukkan contoh menggunakan berbagai peristiwa kartu kaya.

Untuk contoh semua kartu yang tersedia, lihat sampel Menggunakan kartu .

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

Mengirim Kartu Adaptif

Meskipun Anda dapat menggunakan pabrik pesan untuk membuat pesan yang berisi lampiran (dari jenis apa pun), Kartu Adaptif adalah salah satu jenis lampiran tertentu. Tidak semua saluran mendukung Kartu Adaptif, dan beberapa saluran mungkin hanya sebagian mendukung Kartu Adaptif. Misalnya, jika Anda mengirim Kartu Adaptif di Facebook, tombol tidak akan berfungsi saat teks dan gambar berfungsi dengan baik. Pabrik pesan adalah kelas pembantu Bot Framework SDK yang digunakan untuk mengotomatiskan langkah-langkah pembuatan untuk Anda.

Kartu Adaptif adalah format pertukaran kartu terbuka yang memungkinkan pengembang untuk bertukar konten UI dengan cara yang sama dan konsisten. Namun, tidak semua saluran mendukung Kartu Adaptif.

Perancang Kartu Adaptif memberikan pengalaman waktu desain interaktif yang kaya untuk menulis kartu adaptif.

Catatan

Anda harus menguji fitur ini dengan saluran yang akan digunakan bot Anda untuk menentukan apakah saluran tersebut mendukung kartu adaptif.

Untuk menggunakan Kartu Adaptif, pastikan untuk menambahkan AdaptiveCards paket NuGet.

Kode sumber berikut berasal dari sampel Menggunakan kartu .

Cards.cs

Contoh ini membaca JSON Kartu Adaptif dari file dan menambahkannya sebagai lampiran.

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

Pesan juga dapat menyertakan beberapa lampiran dalam tata letak carousel, yang menempatkan lampiran berdampingan dan memungkinkan pengguna untuk menggulir.

Kode sumber berikut berasal dari sampel Menggunakan kartu .

Dialog/MainDialog.cs

Pertama, buat balasan dan tentukan lampiran sebagai daftar.

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

Kemudian tambahkan lampiran dan atur jenis tata letak ke carousel. Di sini kami menambahkannya satu per satu, tetapi jangan ragu untuk memanipulasi daftar untuk menambahkan kartu sesuka Anda.

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

Setelah lampiran ditambahkan, Anda dapat mengirim balasan seperti yang lain.

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

Sampel kode untuk memproses input Kartu Adaptif

Sampel berikut menunjukkan salah satu cara untuk menggunakan input Kartu Adaptif dalam kelas dialog bot. Ini memperluas sampel kartu hero dengan memvalidasi input yang diterima di bidang teks dari klien yang merespons. Anda harus terlebih dahulu menambahkan fungsionalitas input teks dan tombol ke kartu adaptif yang ada dengan menambahkan kode berikut tepat sebelum tanda kurung akhir adaptiveCard.json, yang terletak di folder sumber daya:

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

ID bidang input teks diatur ke "teks". Ketika pengguna memilih OK, pesan yang dihasilkan Kartu Adaptif akan memiliki properti nilai yang memiliki properti bernama text yang berisi informasi yang dimasukkan pengguna di bidang input teks kartu.

Validator kami menggunakan Newtonsoft.json untuk terlebih dahulu mengonversi ini menjadi JObject, lalu membuat string teks yang dipangkas untuk perbandingan. Jadi tambahkan:

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

untuk MainDialog.cs dan menginstal paket NuGet stabil terbaru newtonsoft.Json. Dalam kode validator, kami menambahkan alur logika ke dalam komentar kode. Metode ini ChoiceValidator ditempatkan ke dalam sampel Menggunakan kartu tepat setelah kurung kurawal tertutup publik untuk deklarasi 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;
}

Sekarang di atas dalam MainDialog perubahan deklarasi:

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

untuk:

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

Ini akan memanggil validator Anda untuk mencari input Kartu Adaptif setiap kali permintaan pilihan baru dibuat.

Menguji bot Menggunakan Kartu

  1. Jalankan sampel Menggunakan kartu secara lokal dan buka bot di Emulator Kerangka Kerja Bot.
  2. Ikuti perintah di bot untuk menampilkan jenis kartu, seperti Kartu Adaptif.

Langkah berikutnya