【问题标题】:Create custom Web Chat for Microsoft Bot Framework为 Microsoft Bot Framework 创建自定义 Web 聊天
【发布时间】:2022-08-19 07:21:21
【问题描述】:

是否有关于如何创建自己的网络聊天的指南(我不想使用/自定义正在响应的那个)。我想使用 Blazor 或 Angular 从头开始​​制作它,但我还没有找到一个很好的指南来说明如何做到这一点。

  • 接受/投票支持更大的 Stack Overflow 社区和任何有类似问题的人。如果您觉得我的回答足够,请“接受”并点赞。如果没有,请告诉我我还能如何提供帮助!

标签: botframework


【解决方案1】:

没有我知道的指南。

这也取决于你的意思。如果您想要构建可以实现网络聊天之类的工具,那么我建议您安装不同的工具以在引用它们各自的 SDK 时使用。

无论如何,您都需要有一种方法来捕获传入消息以及发回消息。这意味着您将需要使用 BotFramework-WebChat 所依赖的 BotFramework-DirectLineJS SDK。然后,您需要考虑如何处理不同的activity types 和可能由机器人或用户发送的消息。比如如何处理:

  • 消息:
    • 简单的短信
    • 带有附件的消息:卡片、自适应卡片、图像、音频/语音等。
  • 事件
  • 对话更新,包括成员已添加
  • 痕迹
  • 打字

对于听力和视力受损的人等,还有许多其他需要考虑的事项。

这是我前段时间创建的自定义聊天。它绝对是基本的,并不漂亮。在其中,我调用我运行的本地令牌服务器以获取有效的 Directline 令牌。

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="icon" href="favicon.ico" type="image/x-icon" />
  <title>Custom Chat Using Direct Line</title>
  <script crossorigin="anonymous" src="https://unpkg.com/@babel/standalone@7.8.7/babel.min.js"></script>
  <script crossorigin="anonymous" integrity="sha384-7aeOL7r9BM1QyTIsoLYJYNsRLfVnQCtLmwgXlxteDNhJf0xUGj9PKP8F5w2Fx92/"
    src="https://unpkg.com/botframework-directlinejs@0.11.6/dist/directline.js"></script>
</head>

<body>
  <h2>Custom Chat Using Direct Line</h2>
  <div class="input-container">
    <input type="text" class="input-box" name="input-box" value="Hi">
    <button type="button" class="input-button">Send</button>
  </div>
  <div class="response-container">
  </div>
  <script type="text/babel" data-presets="es2015,react,stage-3">
    ( async function () {
      const { ConnectionStatus, DirectLine } = window.DirectLine;

      const renderStatus = {
        DISPLAY_ACTIVITIES: 'display',
        HIDE_ACTIVITIES: 'hide',
        RESET_VIEW: 'reset',
        MAINTAIN_VIEW: 'maintain'
      }

      let previousWatermark = 0;
      let currentWatermark = 0;
      let displayStatus = renderStatus.DISPLAY_ACTIVITIES;
      let viewStatus = renderStatus.MAINTAIN_VIEW;
      let responseHistory;

      // Custom 'token' server retrieves a Direct Line token
      // Server stores the Direct Line secret exchanging it for a token when requested
      const res = await fetch( 'http://localhost:3500/directline/conversations', { method: 'POST' } );
      const { token } = await res.json();

      var directLine = new DirectLine( {
        token: token
      } )
      
      // Function posts activity to Direct Line, when called
      const postActivity = ( dl, text ) => {
        dl.postActivity(
          {
            from: { id: 'abc123', name: 'JohnDoe' }, // required (from.name is optional)
            type: 'message',
            text: `${ text }`
          }
        )
          // As all message activities are logged below, there is no need to log the posted activity
          .subscribe(
            id => id,
            error => console.log( "Error posting activity", error )
          );
      }

      // Posts user message on button click
      const inputButton = document.querySelector( '.input-button' );
      const inputBox = document.querySelector( '.input-box' );

      inputButton.addEventListener( 'click', ( e ) => {
        e.preventDefault();
        const text = inputBox.value;
        postActivity( directLine, text );
      } );

      inputBox.onkeyup = ( e ) => {
        const keyCode = e ? ( e.which ? e.which : e.keyCode ) : event.keyCode;
        if ( keyCode === 13 ) {
          const text = inputBox.value;
          postActivity( directLine, text );
        }
      };

      // Updates UI with all response activity
      let responseContainer = document.querySelector( '.response-container' );

      const subscribeToActivities = (dl) => {
        dl.activity$
          .filter( activity => {
            return activity.type === 'message';
          } )
          .subscribe(
            activity => {
              const text = activity.text;

              if (!activity.attachments) {
                const id = activity.from.id;
                currentWatermark = Number(dl.watermark);
                
                if ( viewStatus === renderStatus.RESET_VIEW && currentWatermark <= previousWatermark && responseHistory.length > 0) {
                  displayStatus = renderStatus.HIDE_ACTIVITIES;
                  viewStatus = renderStatus.MAINTAIN_VIEW;
                } 
    
                else if ( displayStatus === renderStatus.DISPLAY_ACTIVITIES && currentWatermark >= previousWatermark ) {
    
                  switch ( id ) {
                    case 'botberg':
                      responseContainer.innerHTML += `<ul class="chat-list"><li>From Bot: ${ text } </li></ul>`;
                      displayStatus = renderStatus.HIDE_ACTIVITIES;
                      viewStatus = renderStatus.MAINTAIN_VIEW;
                      break;
                  }
                }
                else if ( displayStatus === renderStatus.HIDE_ACTIVITIES && currentWatermark >= previousWatermark ) {
                  switch ( id ) {
                    case 'botberg':
                      break;
                    default:
                      responseContainer.innerHTML += `<ul class="chat-list"><li>From User: ${ text } </li></ul>`;
                      displayStatus = renderStatus.DISPLAY_ACTIVITIES;
                      viewStatus = renderStatus.MAINTAIN_VIEW;
                  }
                }
              }
              else {
                responseContainer.innerHTML += `<ul class="chat-list"><li>From Bot: Client received unsuppported attachment type </li></ul>`;
              }
            }
          );
      }

      subscribeToActivities(directLine);

      directLine.connectionStatus$
        .subscribe( async connectionStatus => {
          switch ( connectionStatus ) {
            case ConnectionStatus.Uninitialized:
              console.log( 'CONNECTION_STATUS => UNINITIALIZED ', directLine );
              break;
            case ConnectionStatus.Connecting:
              console.log( 'CONNECTION_STATUS => CONNECTING ', directLine );
              break;
            case ConnectionStatus.Online:
              console.log( 'CONNECTION_STATUS => ONLINE ', directLine );
              break;
            case ConnectionStatus.ExpiredToken:
              console.log( 'CONNECTION_STATUS => EXPIRED TOKEN ', directLine );
              break;
            case ConnectionStatus.FailedToConnect:
              console.log( 'CONNECTION_STATUS => FAILED TO CONNECT ', directLine );
              break;
            case ConnectionStatus.Ended:
              console.log( 'CONNECTION_STATUS => ENDED ', directLine );
              break;
          }
        } );
    } )()

  </script>
</body>

</html>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2017-11-18
    • 1970-01-01
    • 2019-05-05
    • 2016-09-05
    • 1970-01-01
    • 2017-04-25
    相关资源
    最近更新 更多