【问题标题】:Bot Framework - imBack or postBack message without buttons? Is it possible?Bot Framework - 没有按钮的 imBack 或 postBack 消息?可能吗?
【发布时间】:2017-12-08 03:07:13
【问题描述】:

我正在尝试通过一些 postBack 操作向我的 Skype、Slack 或 Messenger 用户显示卡片(或链接列表)。

Herocard 工作正常,它们显示带有文本的按钮,如下例所示:

    IMessageActivity replyMessage = context.MakeMessage();
    replyMessage.Attachments.Add(
    new HeroCard
    {
        Subtitle = "Settings",
        Buttons = new List<CardAction> {
            new CardAction(ActionTypes.ImBack, $"Spell-check {spellcheckst}", value: $"Set Spell-check setting {spellcheckst}", text: $"Spell-check {spellcheckst}", displayText: $"Spell-check {spellcheckst}"),
            new CardAction(ActionTypes.ImBack, $"Small-talk {smalltalkst}", value: $"Set Small-talk setting {smalltalkst}", text: $"Small-talk {smalltalkst}", displayText: $"Small-talk {smalltalkst}")

        }
    }.ToAttachment()
    );
    await context.PostAsync(replyMessage);

但按钮会占用大量屏幕空间,而且很多时候它们的标题会被截断。

有没有办法在不显示按钮的情况下触发 postBack 或 imBack 卡片操作。这是一个示例场景,当用户请求帮助时,Bot 显示命令列表:

  1. 添加网页Try Me
  2. 删除网页Try Me
  3. 显示帮助Try Me

“Try Me”链接会像上面的按钮一样回发到机器人。

这可能吗?

谢谢

【问题讨论】:

    标签: c# bots botframework


    【解决方案1】:

    确实,大按钮名称会产生问题,而且它看起来像卡片外星人。取而代之的是,您可以使用 Carousel Cards 来做到这一点。将以下代码放入您的对话框并检查。我正在做它并且它正在工作。

     public Task StartAsync(IDialogContext context)
            {
                context.Wait(MessageReceivedAsync);
    
                return Task.CompletedTask;
            }
            public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
            {
                var reply = context.MakeMessage();
    
                reply.AttachmentLayout = AttachmentLayoutTypes.Carousel;
                reply.Attachments = GetCardsAttachments();
    
                await context.PostAsync(reply);
    
                context.Wait(this.MessageReceivedAsync);
            }
    
            private static IList<Attachment> GetCardsAttachments()
            {
                return new List<Attachment>()
                {
                    GetHeroCard(
                        "Add a webpage",
                        "",
                        "",
                        new CardImage(url: "https://cdn.dribbble.com/users/22691/screenshots/1958250/attachments/340010/Button_800x600.gif?sz=328"),
                        new CardAction(ActionTypes.ImBack, "Add a webpage", value: "Add a webpage")),
                    GetHeroCard(
                        "delete a webpage",
                        "",
                        "",
                        new CardImage(url: "https://cdn.dribbble.com/users/22691/screenshots/1958250/attachments/340010/Button_800x600.gif?sz=328"),
                        new CardAction(ActionTypes.ImBack, "delete a webpage", value: "delete a webpage")),
                    GetHeroCard(
                        "Display help",
                        "",
                        "",
                        new CardImage(url: "https://cdn.dribbble.com/users/22691/screenshots/1958250/attachments/340010/Button_800x600.gif?sz=328"),
                        new CardAction(ActionTypes.ImBack, "Display help", value: "Display help")),
                    GetHeroCard(
                        "etc",
                        "",
                        "",
                        new CardImage(url: "https://cdn.dribbble.com/users/22691/screenshots/1958250/attachments/340010/Button_800x600.gif?sz=328"),
                        new CardAction(ActionTypes.ImBack, "etc", value: "etc")),
    
                };
            }
    
            private static Attachment GetHeroCard(string title, string subtitle, string text, CardImage cardImage, CardAction cardAction)
            {
                var heroCard = new HeroCard
                {
                    Title = title,
                    Subtitle = subtitle,
                    Text = text,
                    Images = new List<CardImage>() { cardImage },
                    Buttons = new List<CardAction>() { cardAction },
                };
    
                return heroCard.ToAttachment();
            }
    

    我希望这将帮助您解决您的问题。

    以下是屏幕截图供您参考。

    【讨论】:

      【解决方案2】:

      使用按钮,您可以将标题设置为显示文本,并将值设置为您需要回发的内容。然后你可以在按钮上方有一小段文字,上面写着“单击任何按钮尝试”。

      我在 messenger 中使用这种方法,使我的按钮文本简短,但按钮的“有效负载”(或值)设置为更丰富的描述。接下来的事情是,该值不会显示给用户,而是由框架在消息活动的通道数据部分中接收。

      【讨论】:

        猜你喜欢
        • 2017-04-14
        • 2016-08-28
        • 1970-01-01
        • 2021-08-27
        • 2017-04-16
        • 1970-01-01
        • 2019-01-13
        • 1970-01-01
        相关资源
        最近更新 更多