Платформе Bot не удается отправить FacebookQuickReply с помощью AddKeyboardCard или с помощью ChannelData

#c# #bots #botframework #facebook-messenger

#c# #боты #botframework #facebook-messenger

Вопрос:

Я использую Bot Framework 3.3.0, который, как я понимаю, поддерживает быстрые ответы Facebook, реализованные должным образом (в отличие от создания dynamic объекта и отправки его через ChannelData ). Имя класса Microsoft.Bot.Builder.ConnectorEx.FacebookQuickReply.

Вот как я создаю быстрые ответы из IDialog:

 var reply = context.MakeMessage();
reply.Text = msg;
var quickReplies = new List<FacebookQuickReply>()
{
    new FacebookQuickReply(FacebookQuickReply.ContentTypes.Text, "Cathay", "Cathay"),
    new FacebookQuickReply(FacebookQuickReply.ContentTypes.Text, "HK Airlines", "Hong Kong Airlines"),
    new FacebookQuickReply(FacebookQuickReply.ContentTypes.Text, "HK Express", "HK Express")
};
  

И вот два способа, которыми я пытаюсь отправить их в чат:

 //I tried both of the lines below
//reply.ChannelData = quickReplies.ToArray();
reply.AddKeyboardCard<FacebookQuickReply>("quick_replies", quickReplies);

await context.PostAsync(reply);
  

Первый способ, который я почерпнул из статьи Эзекиля Джадиба (привет, я знаю, что ты это читаешь!), не сработал у меня в facebook messenger. Отчасти причина в том, что в версии 3 FacebookQuickReply класс теперь запечатан и не может быть получен из него.

ОБНОВЛЕНИЕ: я заставил его работать, используя это:

 var channelData = new FacebookChannelData();

channelData.QuickReplies = new[]
{
    new FacebookQuickReply(FacebookQuickReply.ContentTypes.Text, "Cathay", "Cathay"),
    new FacebookQuickReply(FacebookQuickReply.ContentTypes.Text, "HK Airlines", "Hong Kong Airlines"),
    new FacebookQuickReply(FacebookQuickReply.ContentTypes.Text, "HK Express", "HK Express")
};

reply.ChannelData = channelData;
  

Где класс FacebookChannelData — это просто:

 public class FacebookChannelData
{
    [JsonProperty("quick_replies")]
    public FacebookQuickReply[] QuickReplies { get; set; }
}
  

Несмотря на то, что это работает, это не кажется правильным способом, потому что bot framework теперь предоставляет готовые к использованию классы для этого.

ЗАВЕРШИТЬ ОБНОВЛЕНИЕ

Второй способ (AddKeyboardCard) работает в эмуляторе (но не работает на реальном Facebook), но выдает совершенно неправильный JSON, который я вижу в эмуляторе. Результирующий JSON использует имя класса (почему?) вместо текста, который я предоставил:

 "attachments": [
    {
      "contentType": "application/vnd.microsoft.card.hero",
      "content": {
        "text": "quick_replies",
        "buttons": [
          {
            "type": "imBack",
            "title": "Microsoft.Bot.Builder.ConnectorEx.FacebookQuickReply",
            "value": "Microsoft.Bot.Builder.ConnectorEx.FacebookQuickReply"
          },
          {
            "type": "imBack",
            "title": "Microsoft.Bot.Builder.ConnectorEx.FacebookQuickReply",
            "value": "Microsoft.Bot.Builder.ConnectorEx.FacebookQuickReply"
          },
          {
            "type": "imBack",
            "title": "Microsoft.Bot.Builder.ConnectorEx.FacebookQuickReply",
            "value": "Microsoft.Bot.Builder.ConnectorEx.FacebookQuickReply"
          }
        ]
      }
    }
  ],
  

Что я делаю не так и как вы используете FacebookQuickReply и AddKeyboardCard() ?

Комментарии:

1. K48, просто для пояснения, в моей статье не использовалась ни одна из возможностей, предоставляемых фреймворком. Он был создан до того, как фреймворк получил поддержку быстрых ответов, поэтому класс FacebookQuickReply — это созданный мной класс, а не тот, который исходит из фреймворка.

Ответ №1:

Ключ к недавно добавленной функции FacebookQuickReply находится в этом коммите.

Похоже, что нужно создать KeyboardCard и использовать метод расширения ToFacebookMessage, чтобы получить значение ChannelData (как используется здесь)

Ответ №2:

Если вы используете PromptDialog , вы можете использовать следующий фрагмент для создания быстрых ответов в Messenger:

 PromptDialog.Choice(
    context,
    resume,
    list of options as strings,
    "What do you want to choose?",
    retry: "I didn't understand, let's try that again",
    attempts: 2,
    promptStyle: PromptStyle.Keyboard
);