【问题标题】:Display Text doesn't echo back显示文本不回显
【发布时间】:2019-04-25 23:25:04
【问题描述】:

我正在创建一个带有标题、显示文本、文本和值的消息反馈按钮(v3 SDK)。运行机器人时标题设置正确,点击按钮后没有出现显示文本。

我已经设置了两张卡片动作。

CardAction yesBtn = new CardAction()
{
    Type = ActionTypes.MessageBack,
    Title = "Yes",
    DisplayText = "OK",
    Text = "Yes",
};


CardAction noBtn = new CardAction()
{
     Type = ActionTypes.MessageBack,
     Title = "No",
     DisplayText = "No",
     Text = "No",
};        

我找不到任何解决此问题的方法。 最相似的是: CardAction DisplayText doesn't seem to work 但没有答案。

微软bot框架的文档说

显示文本
可选的。执行操作时由用户在聊天流中回显。此文本不会发送到您的机器人。

但单击按钮后没有任何反应。

我也试过imBack ActionType,结果是一样的。

我在 bot 模拟器和 azure 门户上测试它,都不起作用。

【问题讨论】:

  • 您使用的是什么渠道?您是否尝试过使用 PostBack 而不是 MessageBack?查看CardActions 文档。
  • 感谢您的回复。我正在使用模拟器进行测试。而且 PostBack 也不起作用。
  • 卡行为本质上是特定于渠道的,因此实际上您为哪个渠道构建此机器人非常重要。即使您在模拟器中获得了所需的行为,它可能仍然无法在您的目标通道中工作。您可以在目标通道中进行测试,同时仍使用ngrok 在本地运行机器人。那么这个机器人是用于什么渠道的呢?
  • 感谢@KyleDelaney 的回复,我正在为facebook messenger 构建这个机器人。稍后我将在目标频道上测试我的机器人。那么,因为卡片行为是“通道特定的”,一些卡片功能比如 messageBack 可能无法在 Emulator 通道上测试?顺便说一句,感谢您提供的信息。
  • 这不是能不能在模拟器中测试的问题。关键是模拟器的行为不可能与每个通道都相同,因为并非所有通道都以相同的方式处理给定类型的动作。仅仅因为某些东西在模拟器中有效并不意味着它会在您的目标频道中以相同的方式工作。

标签: c# botframework


【解决方案1】:

卡行为本质上是特定于渠道的。

无论卡牌类型、行动类型或渠道如何,这都适用。虽然某些准则适用于卡片操作的属性,但您真的不能依赖像 displayText 这样的属性以您期望的方式运行。您需要自己测试该卡。以下代码可帮助您测试各种卡片操作类型和属性:

var actionTypes = new List<string>
{
    ActionTypes.ImBack,
    ActionTypes.PostBack,
    ActionTypes.MessageBack,
};

var cardActions = actionTypes.Select(actionType => new CardAction(
    actionType,
    $"{actionType} title",
    null,
    $"{actionType} value",
    $"{actionType} text",
    $"{actionType} displayText"
)).ToList();

var reply = activity.CreateReply("Reply:");

reply.Attachments = new List<Attachment> { new Attachment(HeroCard.ContentType, content: new HeroCard("Hero title", "Hero subtitle", "Hero text", buttons: cardActions)) };
reply.SuggestedActions = new SuggestedActions(new List<string> { activity.From.Id }, cardActions);

await Connector.Conversations.ReplyToActivityAsync(reply);

这三种操作类型(ImBack、PostBack 和 MessageBack)有一些与之相关的预期行为:

  • ImBack 旨在在对话历史记录中显示一条消息,就好像用户输入了它一样
  • PostBack 旨在向机器人发送隐藏元数据的隐形消息
  • MessageBack 旨在向机器人发送一条消息,该消息显示在对话历史记录中并且包含隐藏的元数据,结合了其他两种类型

同样,您不能指望这种行为在不同渠道中得到一致实施。在这三个中,事实证明 Facebook Messenger 平台只有 PostBack 类型,但实际上它的行为类似于 MessageBack,因为它向用户显示文本以及向机器人发送替代文本。在英雄卡片中,CardAction.Title 将用于按钮的标签和对话历史记录中显示的文本,CardAction.Value 将用作分配给传入活动的TextValue 属性的隐藏数据。 Facebook Messenger 连接器将忽略CardAction.TextCardAction.DisplayText

由于您只想在对话历史记录中显示文本,因此您很幸运。实际上,您使用哪种操作类型并不重要。 Facebook 连接器会自动将具有这三种操作类型中的任何一种的英雄卡片转换为带有 PostBack 按钮的generic template。建议的操作将转换为 Quick Replies,其行为略有不同,因为发送到您的机器人的数据将采用不同的格式,但您可以从中提取相同的信息。

如果您想直接将 Facebook 模板发送到 Messenger,而不是依赖连接器来转换英雄卡,您可以使用channel data。您可以像这样在 C# 中构建模板:

object data = new
{
    attachment = new
    {
        type = "template",
        payload = new
        {
            template_type = "generic",
            elements = new[]
            {
                new
                {
                    title = "generic title",
                    subtitle = "generic subtitle",
                    image_url = "",
                    buttons = new[]
                    {
                        new
                        {
                            type = "postback",
                            title = "postback title",
                            payload = "postback payload"
                        }
                    }
                }
            }
        }
    }
};

由于某种原因,SDK 不喜欢您使用这样的匿名类型,因此您需要在将其发送到 Facebook 之前将其转换为 JObject

reply.ChannelData = JObject.FromObject(data);
await connector.Conversations.ReplyToActivityAsync(reply);

【讨论】:

    猜你喜欢
    • 2014-11-16
    • 1970-01-01
    • 2017-09-11
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 2016-07-13
    • 2021-12-17
    相关资源
    最近更新 更多