最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

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

IT培训 admin 0浏览 0评论

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

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

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

即如何使用节点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"
}

..创建一张看起来像这样的卡片:

如果用户在文本框中输入“Testing Testing 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中看到。

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

使用自适应卡与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();

在你的bot.ts文件中(步骤3):

const activity = dc.context.activity;

if (!activity.text.trim() && activity.value) {
    activity.text = JSON.stringify(activity.value);
}

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

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

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

即如何使用节点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"
}

..创建一张看起来像这样的卡片:

如果用户在文本框中输入“Testing Testing 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中看到。

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

使用自适应卡与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();

在你的bot.ts文件中(步骤3):

const activity = dc.context.activity;

if (!activity.text.trim() && activity.value) {
    activity.text = JSON.stringify(activity.value);
}
发布评论

评论列表 (0)

  1. 暂无评论