除了使用自适应卡之外,还有其他方法可以启用日历选项作为 V4 聊天机器人 C# 中的输入吗?

2023-12-02

有没有办法在聊天机器人中启用日期和时间输入(即日历选项)而不使用自适应卡,正如我从下面的链接中了解到的,除 Microsoft 渠道外,所有渠道均不支持自适应卡。

如何使用 C# 添加通过卡片内的提示选项显示的自定义选项以及在 BOT V4 中单击选择时触发操作?

我使用以下输入启用了自适应卡:

[BotFramework]:如何捕获/提取通过在瀑布对话框中的 C# Web 聊天机器人中呈现的自适应卡提交的值?

然后我的问题是:除了使用英雄卡等自适应卡或任何其他卡(自适应卡除外)之外,如何在 BOT 中启用日期时间输入?

语言:C# 软件开发工具包:V4 渠道:网络聊天渠道 部署在:Azure

如果有办法,我要求您提供详细的分步指南,因为我是 BOT 和编码的新手。

感谢和问候 -ChaitanyanNG

我无法尝试 GitHub 上的以下内容,因为这与 React 有关,但我的代码是用 C# 和 AZURE 的 SDK V4 编写的:

https://github.com/microsoft/BotFramework-WebChat/tree/master/samples/10.a.customization-card-components

预期结果:显示日历选项和时间选项来选择日期和时间,以便我可以捕获输入值并在瀑布对话框 C# 中继续我的过程

实际结果:无法实现,因为自适应卡似乎在网络聊天渠道中不受支持,仅在 Skype 等 Microsoft 渠道中受支持


@mrichardson-MSFT:感谢迄今为止的所有帮助。

问题描述:

我有带有多个瀑布对话框类的 BOT 程序,最后一个对话框类STEP #1:我展示了带有两个日期和时间输入的自适应卡,一个用于开始,另一个用于停止实际结果:自适应在模拟器和网络聊天频道中均成功显示,没有任何问题STEP #2:当我单击步骤 1 中显示的自适应卡上的 SetSchedule 时,应在步骤 #2 中捕获值并显示在屏幕上实际结果: 在模拟器中工作得很好,但在网络聊天频道机器人中却不行。我在网络聊天频道 BOT 中收到错误。 请找到用于访问机器人的 HTML 文件、瀑布对话框类和随附的自适应卡 json 文件以供参考。请同时找到网络聊天频道中附加的错误屏幕截图以供参考。

您能否像解决登录问题一样指导我解决此问题?请求您立即提供帮助,这阻碍了我的工作。

感谢和问候 -ChaitanyanNG

using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Schema;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Threading.Tasks;

namespace EchoBot.Dialogs
{
    public class Adaptivecarddialog : WaterfallDialog
    {
        public const string cards = @"./AdaptiveCard.json";

        public Adaptivecarddialog(string dialogId, IEnumerable<WaterfallStep> steps = null)
            : base(dialogId, steps)
        {
            AddStep(async (stepContext, cancellationToken) =>
            {
                var cardAttachment = CreateAdaptiveCardAttachment(cards);

                var reply = stepContext.Context.Activity.CreateReply();
                reply.Attachments = new List<Attachment>() { cardAttachment };

                await stepContext.Context.SendActivityAsync(reply, cancellationToken);
                var opts = new PromptOptions
                {
                    Prompt = new Activity
                    {
                        Type = ActivityTypes.Message,
                        // You can comment this out if you don't want to display any text. Still works.
                    }
                };

                // Display a Text Prompt and wait for input
                return await stepContext.PromptAsync(nameof(TextPrompt), opts);
            });

            AddStep(async (stepContext, cancellationToken) =>
            {
                var res = stepContext.Result.ToString();
                dynamic jobject = JsonConvert.DeserializeObject(res);
                string NewStartDateTime = jobject.Startdate + " " + jobject.Starttime;
                string NewStopDateTime = jobject.Stopdate + " " + jobject.Stoptime;
                await stepContext.Context.SendActivityAsync($"StartDateTime:{NewStartDateTime}", cancellationToken: cancellationToken);
                await stepContext.Context.SendActivityAsync($"StopDateTime:{NewStopDateTime}", cancellationToken: cancellationToken);

                return await stepContext.EndDialogAsync();
            });

        }

        public static new string Id => "Adaptivecarddialog";

        public static Adaptivecarddialog Instance { get; } = new Adaptivecarddialog(Id);

        public static Attachment CreateAdaptiveCardAttachment(string filePath)
        {
            var adaptiveCardJson = File.ReadAllText(filePath);
            var adaptiveCardAttachment = new Attachment()
            {
                ContentType = "application/vnd.microsoft.card.adaptive",
                Content = JsonConvert.DeserializeObject(adaptiveCardJson),
            };
            return adaptiveCardAttachment;
        }
    }
}

{
  "type": "AdaptiveCard",
  "body": [
    {
      "type": "TextBlock",
      "id": "Start date text",
      "separator": true,
      "text": "Schedule Start DateTime:"
    },
    {
      "type": "Input.Date",
      "id": "Startdate",
      "separator": true,
      "value": "2019-05-24"
    },
    {
      "type": "Input.Time",
      "id": "Starttime",
      "separator": true,
      "value": "08:00"
    },
    {
      "type": "TextBlock",
      "id": "Stop date text",
      "separator": true,
      "text": "Schedule Stop DateTime:"
    },
    {
      "type": "Input.Date",
      "id": "Stopdate",
      "separator": true,
      "value": "2019-05-25"
    },
    {
      "type": "Input.Time",
      "id": "Stoptime",
      "separator": true,
      "value": "08:00"
    }
  ],
  "actions": [
    {
      "type": "Action.Submit",
      "id": "SubmitBtn",
      "title": "SetSchedule"
    }
  ],
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
  "version": "1.0"
}

尝试两次时出现错误消息:第一次尝试{错误:{代码:“BotError”,消息:“发送活动失败:机器人超时”},httpStatusCode:504} 错误:{代码:“BotError”,消息:“发送活动失败:机器人超时”} 代码:“机器人错误” 消息:“发送活动失败:机器人超时” http状态代码:504

enter image description hereSecondTry {error: {code: "BotError", message: "Failed to send activity: bot returned an error"},…} error: {code: "BotError", message: "Failed to send activity: bot returned an error"} code: "BotError" message: "Failed to send activity: bot returned an error" httpStatusCode: 500

HTML 文件:

<!DOCTYPE html>
<html lang="en-US">
<head>
    <title>Web Chat: Custom style options</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!--
      For demonstration purposes, we are using the development branch of Web Chat at "/master/webchat.js".
      When you are using Web Chat for production, you should use the latest stable release at "/latest/webchat.js",
      or lock down on a specific version with the following format: "/4.1.0/webchat.js".
    -->
    <script src="https://cdn.botframework.com/botframework-webchat/master/webchat.js"></script>
    <style>
        html, body {
            height: 100%
        }

        body {
            margin: 0
        }

        #webchat {
            height: 100%;
            width: 100%;
        }
    </style>
</head>
<body>
    <div id="webchat" role="main">

    </div>
    <script>
        (async function () {
            // In this demo, we are using Direct Line token from MockBot.
            // To talk to your bot, you should use the token exchanged using your Direct Line secret.
            // You should never put the Direct Line secret in the browser or client app.
            // https://learn.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-direct-line-3-0-authentication

            // Token is found by going to Azure Portal > Your Web App Bot > Channels > Web Chat - Edit > Secret Keys - Show
            // It looks something like this: pD*********xI.8ZbgTHof3GL_nM5***********aggt5qLOBrigZ8
            const token = '<<Your Direct Line Secret Key>>';

            // You can modify the style set by providing a limited set of style options
            const styleOptions = {
                botAvatarImage: 'https://learn.microsoft.com/en-us/azure/bot-service/v4sdk/media/logo_bot.svg?view=azure-bot-service-4.0',
                botAvatarInitials: 'BF',
                userAvatarImage: 'https://avatars1.githubusercontent.com/u/45868722?s=96&v=4',
                userAvatarInitials: 'WC',
                bubbleBackground: 'rgba(0, 0, 255, .1)',
                bubbleFromUserBackground: 'rgba(0, 255, 0, .1)'
            };

            // We are using a customized store to add hooks to connect event
            const store = window.WebChat.createStore({}, ({ dispatch }) => next => action => {
                if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {
                    // When we receive DIRECT_LINE/CONNECT_FULFILLED action, we will send an event activity using WEB_CHAT/SEND_EVENT
                    dispatch({
                        type: 'WEB_CHAT/SEND_EVENT',
                        payload: {
                            name: 'webchat/join',
                            value: { language: window.navigator.language }
                        }
                    });
                }
                return next(action);
            });

            window.WebChat.renderWebChat({
                directLine: window.WebChat.createDirectLine({ token }),
                styleOptions,store
            }, document.getElementById('webchat'));

            document.querySelector('#webchat > *').focus();
        })().catch(err => console.error(err));
    </script>
</body>
</html>

简短的回答是该功能不可用。自适应卡是任何基于 UI 的日期/时间选择器的最佳途径。是的,自适应卡在 Microsoft 渠道(包括 WebChat)上得到完全支持,但在其他渠道上支持较少。

你最好的选择是使用日期时间提示.

有很多不同复杂程度的方法可以实现这一点,但是虚拟助理日历技能它的使用相当广泛。它是日期提示 and 时间提示可能是很好的起点。

CoreBot 还有一个日期解析对话框这可能会有所帮助并且更容易理解。


在聊天机器人中使用 DateTime 相当复杂,因为“星期三下午 4 点”可能意味着星期三凌晨 4 点或下午 4 点。这Timex 分辨率样本如果您要使用基于文本的输入,应该提供处理此问题的其他想法。


这可能在 WebChat 中不适合您,因为你的其他问题。我刚刚测试了这张卡的日期和时间输入,它正在工作:

{
    "type": "AdaptiveCard",
    "actions": [{
        "type": "Action.Submit",
        "id": "submit",
        "title": "Submit"
    }],
    "body": [
        {
            "type": "Input.Date",
            "id": "date",
            "title": "New Input.Toggle"
        },
        {
            "type": "Container",
            "items": [
                {
                    "type": "Input.Time",
                    "id": "time",
                    "title": "New Input.Toggle"
                }
            ]
        }
    ],
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.0"
}

enter image description here

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

除了使用自适应卡之外,还有其他方法可以启用日历选项作为 V4 聊天机器人 C# 中的输入吗? 的相关文章

随机推荐

  • SQL Server LAG() 函数计算行之间的差异

    我是 SQL Server 新手 对 lag 函数有一些疑问 我必须计算两个用户活动之间的平均距离 以天为单位 然后 我必须对所有用户进行分组 计算每个用户的行之间的所有日期差异 最后选择该组的平均值 Just to be clear I
  • CUDA 中的全局内存与动态全局内存分配

    我有一个 CUDA v5 5 应用程序需要使用全局内存 理想情况下 我更喜欢使用常量内存 但我已经耗尽了常量内存 溢出的内容必须放置在全局内存中 我还有一些需要偶尔写入的变量 在 GPU 上进行一些缩减操作之后 我将其放置在全局内存中 为了
  • 请求另一个域/服务器上的内容

    我正在尝试请求位于另一个域 服务器上的数据 但是当我尝试发送请求时遇到异常 var request new XMLHttpRequest request open GET http www w3schools com ajax cd cat
  • nginx proxy_pass 与socks5 代理?

    我正在尝试设置 proxy pass 同时也使用袜子5代理 我可以使用以下命令通过curl 访问我的支持服务 curl x socks5h localhost 8001 svo dev null I http abcd 1234 8000
  • 如何使用 Ruby 找到目录中最近修改的文件夹?

    如何使用 Ruby 在目录中找到最近修改的文件夹 不是文件 Dir glob a directory max by f File mtime f Dir glob a directory 返回中的所有目录名称a directory 作为字符
  • 警告消息澄清

    我在用着SNPassoc用于查找数据 SNP 和连续变量结果之间关联的 R 包 我进行了分析并得到了结果 但是 我收到警告消息 Warning in terms formula formula data data varlist has c
  • 使用 dplyr 将唯一 ID 分配给组内的不同值

    问题 我需要为具有两级分组的数据创建一个唯一的 ID 字段 在这里的示例代码中 它是Emp and Color ID 的结构需要如下 Emp 每个的唯一编号Color 重复的序列号Colors 这些值由句点分隔 示例数据 dat lt da
  • 当我使用 GZIPOutputStream 将文件发布到 servlet 时文件已损坏

    我尝试修改 BalusC优秀教程here发送 gzip 压缩文件 这是一个工作java类 import java io File import java io FileInputStream import java io FileNotFo
  • 如何在 Mercurial 队列中仅推送一个特定补丁?

    这就是我所做的 hg init hg qnew m p1 p1 patch some changes hg qrefresh hg qpop hg qnew m p2 p2 patch some changes hg qrefresh hg
  • Angular 正则表达式测试输入的 ng-pattern 验证不一致

    我对我的输入进行了 ng 模式验证 ng pattern g 这并不是每次都起作用 并表现出非常奇怪的行为 See plnkr ngMessage 仅在我输入的每两个字符上显示 但控制台正确评估正则表达式测试 我在浏览器开发工具中的 Ang
  • PHPWord 转 PDF 无法加载库

    我一整天都在努力让它发挥作用 现在我可以将文档另存为 docx 文件 但我希望能够将文档另存为 PDF 我已尝试使用 DOMPDF 和 TCPDF 但我不断收到错误 无法加载 PDF 库 我确认路径是正确的 我错过了什么吗 感谢您的帮助 r
  • 在 WPF 中加载多个图像时防止内存膨胀

    我有一个非常简单的 WPF 应用程序 用于预览任何给定文件夹中的图像 一次一张图像 您可以将其视为 Windows Image Viewer 的克隆 该应用程序有一个 PreviewKeyUp 事件 用于在按下左箭头或右箭头键时加载文件夹中
  • Jquery getJSON 无法跨站点工作

    我有一段 javascript 可以抓取 JSON 数据 当在本地执行时 一切似乎都工作正常 但是 当我尝试从其他站点访问它时 它不起作用 这是脚本 function var aT new AjaxTest aT getJson var A
  • jquery 事件处理程序相对于(内联)javascript 事件处理程序的执行顺序

    如果我错了 请纠正我 但在我看来 jQuery 事件处理与 javascript 事件处理完全分开 我知道 jQuery 和 javascript 事件处理程序本身的执行顺序是未定义的 但是是否可以假设所有 javascript 处理程序都
  • 仅执行场景大纲中的特定示例

    我们希望在 Java 测试自动化框架中使用 Cucumber 更好地管理测试数据 为一个Scenario Outline 我们希望将测试参数按其运行的适用环境进行分类 例如 Scenario Outline Login into appli
  • 执行具有多个结果集的存储过程

    我正在使用 SSIS 2016 存储过程返回 4 个结果集 只有第一个结果集是相关的 需要写入表中 我无法修改存储过程 我不关心其他结果集中返回的任何数据 存储过程位于 SQL Server 2016 数据库中 结果也将驻留在 SQL Se
  • 是否可以在 Shiny 的条件面板中使用 uiOutput?

    我有一个非常基本的 Shiny 应用程序 我在用renderUI and uiOutput填充一个selectInput可以选择日期 但我只想这样selectInput当用户通过单选按钮选择一个选项时出现 就目前而言 应用程序单选按钮没有任
  • 在 ie10 中强制浏览器和文档模式为 ie9

    这段代码 似乎只将文档更改为ie9而不是浏览器 除了按 F12 并手动更改之外 还有其他想法吗 站点无法设置浏览器模式 在浏览器从站点请求内容之前选择浏览器模式 这指定了站点如何识别浏览器 例如 UA 字符串 正如您所提到的 文档模式可以由
  • DataSet TableAdapter 抛出 OVER SQL 构造或不支持的语句

    我有一个 t sql 查询写成这个示例帮助 SELECT t gName AS Product isnull SUM CASE WHEN t Col 1 THEN t Quantity END 0 AS 180ml isnull SUM C
  • 除了使用自适应卡之外,还有其他方法可以启用日历选项作为 V4 聊天机器人 C# 中的输入吗?

    有没有办法在聊天机器人中启用日期和时间输入 即日历选项 而不使用自适应卡 正如我从下面的链接中了解到的 除 Microsoft 渠道外 所有渠道均不支持自适应卡 如何使用 C 添加通过卡片内的提示选项显示的自定义选项以及在 BOT V4 中