在 Microsoft Bot Framework v4 中处理自适应卡 - Nodejs

2024-02-12

  return new Promise((resolve, reject) => {
                            x = context.sendActivity({
                            text: 'hi',
                             attachments: [CardFactory.adaptiveCard(menuJson)]
                            })

我正在尝试发送一张自适应卡,其中包含一个 Input.text 字段...现在我的问题是如何使用上下文对象从我的程序中的用户获取输入数据?

即如何使用 Node js 处理 bot 框架 v4 中的自适应卡?


自适应卡发送的提交结果与常规用户文本略有不同。当用户在聊天中输入内容并发送普通消息时,最终会出现context.activity.text。当用户在自适应卡上填写输入时,它最终会出现在context.activity.value,这是一个对象,其中键名称是id在你的menuJson值为自适应卡中的字段值。

例如,json:

{
    "type": "AdaptiveCard",
    "body": [
        {
            "type": "TextBlock",
            "text": "Test Adaptive Card"
        },
        {
            "type": "ColumnSet",
            "columns": [
                {
                    "type": "Column",
                    "items": [
                        {
                            "type": "TextBlock",
                            "text": "Text:"
                        }
                    ],
                    "width": 20
                },
                {
                    "type": "Column",
                    "items": [
                        {
                            "type": "Input.Text",
                            "id": "userText",
                            "placeholder": "Enter Some Text"
                        }
                    ],
                    "width": 80
                }
            ]
        }
    ],
    "actions": [
        {
            "type": "Action.Submit",
            "title": "Submit"
        }
    ],
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.0"
}

.. 创建一张如下所示的卡片:

如果用户在文本框中输入“测试测试 123”并单击“提交”,context.activity看起来像:

{ type: 'message',
  value: { userText: 'Testing Testing 123' },
  from: { id: 'xxxxxxxx-05d4-478a-9daa-9b18c79bb66b', name: 'User' },
  locale: '',
  channelData: { postback: true },
  channelId: 'emulator',
  conversation: { id: 'xxxxxxxx-182b-11e9-be61-091ac0e3a4ac|livechat' },
  id: 'xxxxxxxx-182b-11e9-ad8e-63b45e3ebfa7',
  localTimestamp: 2019-01-14T18:39:21.000Z,
  recipient: { id: '1', name: 'Bot', role: 'bot' },
  timestamp: 2019-01-14T18:39:21.773Z,
  serviceUrl: 'http://localhost:58453' }

用户提交的内容可见context.activity.value.userText.

请注意,自适应卡提交作为回发发送,这意味着提交数据不会作为对话的一部分出现在聊天窗口中 - 它保留在自适应卡上。

使用自适应卡瀑布对话框 https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-concept-dialog?view=azure-bot-service-4.0#waterfall-dialogs

您的问题与此不太相关,但由于您最终可能会尝试此操作,因此我认为将其包含在我的答案中可能很重要。

本质上,自适应卡片不像提示那样工作。有提示时,将显示提示并等待用户输入,然后再继续。但是对于自适应卡(即使它包含输入框和提交按钮),自适应卡中没有代码会导致瀑布对话框在继续对话框之前等待用户输入。

因此,如果您使用接受用户输入的自适应卡,您通常希望处理用户在瀑布对话框上下文之外提交的任何内容。

话虽这么说,如果您想使用自适应卡作为瀑布对话框的一部分,有一个解决方法。基本上,你:

  1. 显示自适应卡
  2. 显示文本提示
  3. 将用户的自适应卡输入转换为文本提示的输入

在您的瀑布对话框文件中(步骤 1 和 2):

async displayCard(step) {
    // Display the Adaptive Card
    await step.context.sendActivity({
        text: 'Adaptive Card',
        attachments: [yourAdaptiveCard],
});
    // Display a Text Prompt
    return await step.prompt('textPrompt', 'waiting for user input...');
}

async handleResponse(step) {
    // Do something with step.result
    // Adaptive Card submissions are objects, so you likely need to JSON.parse(step.result)
    ...
    return await step.next();

In your bot.ts文件(步骤 3):

const activity = dc.context.activity;

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

在 Microsoft Bot Framework v4 中处理自适应卡 - Nodejs 的相关文章

随机推荐

  • 为什么 startActivityForResult 不返回任何内容?

    我在 PreferenceActivity 中有一个 选择图像 Intent i new Intent Intent ACTION PICK android provider MediaStore Images Media EXTERNAL
  • 类型错误:参数 1 必须是 ImagingCore,而不是 ImagingCore

    在 Windows 下我收到此错误 如何修复PIL 这是错误 TypeError 参数 1 必须是 ImagingCore 而不是 ImagingCore usr bin python coding utf 8 from PIL impor
  • 如何在java网络中广播

    这是我第一次用java进行网络编程 我正在寻找一种以某种方式向整个网络中的所有节点发送广播的方法 让他们知道我的存在 我正在尝试制作一款多人网络游戏 我希望客户能够看到所有可用的游戏以选择加入哪一个 我想知道如何从服务器广播以及如何让客户端
  • 带有文件参数的 Jenkins 管道作业

    我正在整理一个 Jenkins 管道作业 该作业将采用文件参数 我可以触发该作业并将其指向一个文件 但是我找不到该文件的最终位置 在普通的自由式作业中 它将位于工作区中 上传的文件去哪儿了 或者文件参数当前不适用于管道 目前管道和文件参数存
  • VS2008:自动生成的文件和 XML 文档

    这与其说是一个问题 不如说是一个烦恼 我的项目包含许多自动生成的文件 使用 mgmtclassgen exe 当我生成 XML 文档时 我的精美注释库受到来自这些 autogen 文件的 xml 文档警告的困扰 有没有办法a 抑制为这些文件
  • CakePHP SQLSTATE[HY000][14]错误

    我正在尝试将当前的 CakePHP 2 x 应用程序升级到 3 x 我修复了命名空间和文件夹结构问题 现在我遇到了数据库问题 在我的测试服务器中 我创建了相同的 MySQL 数据库并授予用户访问权限 然后我就改变了config app ph
  • Python:列表中 Nan 的相等性?

    我只是想弄清楚这些结果背后的逻辑 gt gt gt nan float nan gt gt gt nan nan False I understand that this is because the eq method is define
  • iOS - 如何访问设备的文件库?

    我正在尝试构建一个可以打开设备上存储的任何 pdf 的应用程序 但我真的不知道如何获取这些文件的句柄 我搜索了文档 发现的每个类都假设我已经拥有该文件的句柄 我在这里一定缺少一些东西 有多种应用程序可以访问音频和图片文件 肯定有办法访问 p
  • 如何使用VBA从Excel工作表中的图片获取EXIF信息

    如何使用 VBA 从 Excel 工作表中的形状图片获取 EXIF 信息 如纬度 经度等 是否可以在不从工作表或压缩的 Excel 工作簿中提取或复制图片的情况下获得它 我可以使用以下代码迭代压缩文件夹内容 Public Sub ReadZ
  • 如何在 Blazor Server 中动态添加、删除输入文本框并获取值?

    我有 Blazor 服务器应用程序 如何在单击按钮时动态添加新的输入文本框并将其删除 并在单击提交按钮时获取所有输入文本框的值 以便将它们保存在数据库中 for int i count i gt 1 i div class row div
  • 在 Spring Boot 中使用@Profile

    我有 Spring Boot 应用程序 1 1 5 发布 并通过配置属性启用我的配置文件spring profiles active MyProfile 配置文件被正确激活 我可以通过正在创建的配置文件中的 bean 看到这一点 然后我有一
  • 从键盘获取输入,无需等待输入

    fgets 和 getch 等函数将等待用户输入 然后再继续 我想要的是这个功能 如果用户按 x 变量将开始递减 c 将使变量开始递增 问题是当我尝试获取输入时程序停止 我希望变量在等待用户输入时继续递增或递减并且不 冻结 我正在使用 Vi
  • 将密码重置添加到 Django Admin 会转到错误的 URL?

    我正在关注以下部分添加密码重置功能 https docs djangoproject com en 2 1 ref contrib admin adding a password reset feature到 Django Admin 它会
  • 为什么不从 WinRT 应用程序(在 StreamSocket 上)连接到 win32 应用程序(在 QTcpSocket 上)

    我正在开发一个带有 Metro 应用程序和 win32 桌面的 Windows 8 1 聊天客户端应用程序 问题是未在 Tcp 套接字上从 winrt 应用程序连接到 win32 应用程序 异常连接失败 错误未从其他计算机回复 有什么问题
  • SwiftUI [演示] / 尝试在已经演示的...上演示视图

    我正在开发一个 SwiftUI 应用程序 首先出现警告 然后出现错误 可能是因为我忽略了这些警告 我想展示我收到的警告 希望有人能指出我可能做错的事情 这是相关代码 struct CustomListView View var localL
  • 如何在 Swagger 中将 https:///swagger 更改为自定义

    我的任务是将 Swagger 安装到 Web API 项目中 已安装 来自 nuget 的最新版本的 Swashbuckle Swashbuckle Core Net45 和 Swashbuckle Net45 自定义 App Start
  • 将 .plist 文件解析为纯 XML C#

    我正在尝试使用 c 读取我的 Apple Safari 历史记录 该历史记录存储在 plist 文件中 但是我总是收到错误 并且我不确定正确的方法是什么 我尝试执行的代码是这样的 XmlDocument xmd new XmlDocumen
  • 如何使用 INotifyPropertyChanged 更新列表框项目

    我有一个列表框 它与对象集合进行数据绑定 我想修改项目的显示方式 以向用户显示这些对象之一是我的程序中的 START 对象 我尝试按照以下方式执行此操作 但列表框不会自动更新 使控制无效也不起作用 我能找到的唯一方法是完全删除数据绑定并再次
  • PHP:仅使用模数和指数进行 RSA 加密

    现在 我只有模数和指数 我应该如何在 PHP 中使用模数和指数进行加密 我花了很多时间在网上寻找答案 但毫无用处 谢谢你的时间 使用 phpseclib 一个纯粹的PHP RSA 实现 http phpseclib sourceforge
  • 在 Microsoft Bot Framework v4 中处理自适应卡 - Nodejs

    return new Promise resolve reject gt x context sendActivity text hi attachments CardFactory adaptiveCard menuJson 我正在尝试发