【问题标题】:Greeting message is not showing up until a message is triggered to the bot在向机器人触发消息之前,不会显示问候消息
【发布时间】:2020-08-07 18:49:24
【问题描述】:

我正在尝试发送问候消息并询问用户的姓名。该机器人试图向用户提出一些问题,然后通过重定向链接帮助他。它可以在模拟器或 Microsoft 在线测试工具中完美运行,但是一旦将机器人集成到 ASP.NET 应用程序中,问候消息就不会显示。

我已经搜索并找到了几个有用的链接,但我仍然无法解决问题。

我尝试了两种不同的方法,iframeswindow.WebChat.renderWebChat,但在这两种情况下都会出现问题,直到我向机器人发送消息后才会显示问候消息。

正如其他帖子所讨论的,所有解决方案都以topic结尾,因此聊天机器人集成必须在javascript或Node中实现;并且,需要将自定义事件(作为触发器)发送到聊天机器人。但是,虽然我的机器人已部署在个人 Windows 服务器上,但我不知道如何配置它并设置 directLine 参数。

正如here 发布的那样,可能的解决方案如下代码所示,但我无法配置和设置获取令牌所需的参数。

消息传递端点:https://xxx.yyy.com/api/messages

<!DOCTYPE html>
<html lang="en-US">
  <head>
    <title>Web Chat: Send welcome event</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <script crossorigin="anonymous" src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js"></script>
    <style>
      html,
      body {
        height: 100%;
      }

      body {
        margin: 0;
      }

      #webchat {
        height: 100%;
        width: 100%;
      }
    </style>
  </head>
  <body>
    <div id="webchat"></div>
    <script>
      (async function() {

        //I have no idea how this line of code must be set to achieve the token
        //------------------------------------------------------
        const res = await fetch('https://xxx.yyy.com/directline/token', { method: 'POST' });
        const { token } = await res.json();
        //------------------------------------------------------


        const store = window.WebChat.createStore({}, ({ dispatch }) => next => action => {
          if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {
            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
          },
          document.getElementById('webchat')
        );

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

最后,我要强调的是,Bot 在在线测试工具和模拟器上运行良好,但错误发生在 asp.net 应用程序的集成中。

截图: 左边的照片来自网站应用程序,右边的照片来自测试环境:

编辑 (1): 更新标题,添加屏幕截图。

【问题讨论】:

  • 不清楚你在说什么实际行为。你的标题说有延迟,但在底部你说有一个错误。您能否发布您正在经历的屏幕截图?
  • 感谢您对@KyleDelaney 的评论。我添加了所需的屏幕截图并更新了描述以使其清晰。据我了解,模拟器中聊天机器人的行为有所不同,并且问候消息没有显示,因为它需要触发自定义事件,我想我已经在上面发布的链接中找到了解决方案,但是,我没有知道使用 javascript 集成机器人,但不完全确定参数。
  • 请查看this answer 以了解令牌生成如何影响对话更新的时间。听起来您在调用 Generate Token 时没有包含用户属性。您已在示例代码中包含 xxx.yyy.com。这是您托管的实际网站的占位符吗?该端点是否调用生成令牌?我可以在屏幕截图中看到您能够成功连接到 Direct Line,因此您必须以某种方式获取令牌。
  • xxx.yyy.com 是机器人托管位置的占位符。我已经阅读了您在之前的评论中提到的帖子。我当前的问题是:“xxx.yyy.com/directline/token”没有生成令牌。假设端点是 xxx.yyy.com/api/messages,应该使用哪个 url 来检索令牌?
  • 为什么要尝试通过调用机器人端点来生成 Direct Line 令牌?您还没有回答我关于端点是否调用生成令牌的问题。如果它没有生成令牌,那么您如何连接到对话?您可以在此处阅读有关如何生成令牌的所有信息:docs.microsoft.com/en-us/azure/bot-service/rest-api/…

标签: javascript botframework chatbot web-chat


【解决方案1】:

以下代码修复了令牌生成和发送事件以触发 Web 应用程序内的聊天机器人的问题。

$.ajax({
            url: 'https://directline.botframework.com/v3/directline/tokens/generate',
            method: "POST",
            headers: {
                "Authorization": "Bearer SECRET GOES HERE"
            },
        }).then(function (response) {
            const { token } = JSON.parse(JSON.stringify(response));
            const store = window.WebChat.createStore({}, ({ dispatch }) => next => action => {
                if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {
                    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
                },
                document.getElementById('chatBotFrame')
            );

            document.querySelector('#chatBotFrame > *').focus();
        }).catch(function (err) {
            console.error(err);
        });

【讨论】:

  • 我遇到了同样的问题。它对我有用。谢谢马哈尔
猜你喜欢
  • 2020-04-21
  • 2023-02-08
  • 2018-02-07
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 2018-05-17
相关资源
最近更新 更多