首页 > 解决方案 > 聊天准备好后回调

问题描述

我正在使用 Microsoft Bot Framework 构建 ChatBot 服务,将 Azure 作为服务,并使用 QnA Maker 构建键值对。

在我们的实现中,我们使用 Azure 将所有内容完全托管在云中,因此,我们无法访问该框架的任何代码隐藏。这一切都是通过网页在 JS 中完成的。没有我们可以从后端推送的“卡片”或特殊的“接口”。因此,我不得不实现一些“hack”,我已经实现了自己的 JS 功能,当页面加载时,它会代表用户发送一条消息以触发 QnA Maker 响应.

我遇到的问题是,即使 DOM 可能已经准备好,ChatBot 实现和后端服务可能还没有!它可能仍处于“正在连接...”或加载状态,因此,当我的 JS 尝试发送消息时,它根本不会触发,因为发送消息的按钮在服务就绪之前被禁用。这部分全部由机器人框架控制。因此,在某些实例中(通常是当天的第一个实例或一段时间后的第一个实例),消息“嗨!我有一个问题...”仍保留在“用户聊天栏”中,并且永远不会火灾。

这是我的问题:有没有办法让机器人框架在准备好接收输入后执行回调?如果是这样,我会将回调放在 JS 实现中的什么位置?或者,在触发发送事件之前,我怎么能“等到按钮启用”?

如果不清楚或者您需要更多信息,请告诉我。

更新

验证后,当聊天机器人连接到服务时,甚至不会禁用该按钮,因此即使该选项也不可用。回调似乎是实现这一目标的唯一可能方法?

更新->解决方案! 如果有人想知道如何做到这一点,这里有一个工作示例,向您展示了具体方法。这是从 BotFramework 的不同 GitHub 说明页面合并而来的,Steven Kanberg 在下面的评论中提供了这些说明。谢谢!

//This is how you build your store, and load the web chat... StyleOptions is a constant that is up to you to create.

const token = 'ENTER YOUR SECRET HERE';

const store = window.WebChat.createStore({}, ({ dispatch }) => next => action => {
     if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {
          const event = new Event('webchatreadyactivity');
          event.data = action.payload.activity;
          window.dispatchEvent(event);

          // 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 }),
     store,
     styleOptions
}, document.getElementById("ENTER CHAT ELEMENT ID HERE"));

//THEN, simply hook onto the event like this, to send your initial message...
//This event will fire only ONCE, and only once the chat is READY.
window.addEventListener('webchatreadyactivity', ({ data }) => {
//this is yours to build as well...
sendWelcomeMessage(); 
});

标签: javascriptbotframework

解决方案


BotFramework -WebChat repo 有各种示例,展示了不同的功能。例如,此示例显示如何仅在机器人连接后触发事件。这样,通过styleOptions,您可能能够最初关闭sendBox直到机器人连接。

希望有帮助!


推荐阅读