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