Bot Framework 无法使用 AddKeyboardCard 或使用 ChannelData 发送 FacebookQuickReply

Bot Framework fails to send FacebookQuickReply using AddKeyboardCard or using ChannelData

我正在使用 Bot Framework 3.3.0,据我所知,它支持正确实施 Facebook 的快速回复(而不是创建 dynamic 对象并通过 ChannelData 发送)。 class 名字是 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);

我从 Ezequiel Jadib's article 获得的第一种方式(嗨,我知道你正在阅读这篇文章!)在 Facebook Messenger 上对我不起作用。部分原因是,在 v3.3 中,FacebookQuickReply class 似乎已被密封,无法从中导出。

更新:我通过使用它来实现它:

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 class 就是这样:

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

尽管它有效,但它似乎不是一种正确的方法,因为机器人框架现在为此提供了随时可用的 classes。

更新结束

第二种方式 (AddKeyboardCard) 在模拟器中有效(但在实际的 facebook 上无效),但产生完全错误的 JSON 我可以在模拟器中看到。结果 JSON 使用 class 名称(为什么?)而不是我提供的文本:

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

我做错了什么,你如何使用 FacebookQuickReplyAddKeyboardCard()

最近添加的Facebook快速回复功能的关键就在这个commit

看来要走的路是创建一个 KeyboardCard 并使用 ToFacebookMessage extension method to get the ChannelData value (as used here)

如果您使用的是 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
);