Botbuilder,具有Directline WebControl的多个网站。如何管理

时间:2018-12-09 19:32:13

标签: botframework

我们希望有多个网站来放置聊天机器人,但是我们肯定要使用1个机器人中间件,但在内部我们希望跟踪呼叫的来源。我认为像这样配置js网站的botconnection没什么大不了的:

var bot = {
        id:  'mysite1',
        name: 'mysite1'
    };
    BotChat.App({
        botConnection: botConnection,
        user: user,
        bot: bot
    }, document.getElementById("BotChatGoesHere"));

但是我无法在中间件上的流中的任何地方找到“ mysite1”,似乎机器人服务仍然将其转换为一些向导,所以我明确地将此mysite1添加到pageLoad事件中,当事件发生时,我也立即使用它来启动聊天机器人交互用户加载页面:

(function sendEvent() {
    botConnection
        .postActivity({ type: "event", value: "mysite1", from: { id: localStorage.getItem("guidJD"), name: localStorage.getItem("guidJD") }, name: "userLoadPage" })            
        .subscribe(id => console.log("success"));
})();

它正常工作,但不稳定,有时在实际加载组件并启动对话框后会触发pageload事件,因此在对话框启动时,我不需要原始信息。您有任何解决办法的想法吗?也许我做错了。还是应该在频道中添加新网站?最好我们通过调用api来做到这一点。

1 个答案:

答案 0 :(得分:1)

BotFramework-WebChat实现已被重新设计,并且正在远离BotChat.app()。尽管仍然可以使用,但最佳实践是使用WebChat.renderWebChat方法向机器人发送消息/从机器人接收消息。

要将站点位置发送给漫游器,请将以下内容作为脚本添加到index.html页面。请注意,您不应将您的Direct Line机密存储在浏览器或客户端应用中。仅出于简化目的将其包含在此处。

简而言之,您首先要通过将Direct Line机密传递到generate token API来创建令牌。收到令牌后,它将用于建立直接线路连接。然后,“ window.WebChat.renderWebChat”方法将聊天呈现在页面上。首次加载页面时获得位置值,然后将其传递到活动对象“ channelData.location”下商店的有效负载中。在发生任何“ POST_ACTIVITY”时,活动对象都会传递给机器人。您还可以选择其他一些选项,例如“ DIRECT_LINE / CONNECT”,它将在Direct Line首次建立连接时发布位置。

<script src='https://code.jquery.com/jquery-3.3.1.min.js'></script>
<script src='https://cdn.botframework.com/botframework-webchat/master/webchat.js'></script>
<script src='https://unpkg.com/simple-update-in/dist/simple-update-in.production.min.js'></script>
<script>
  (async function () {
    // To talk to your bot, you should use the token exchanged using your Direct Line secret.
    // You should never put the Direct Line secret in the browser or client app.
    const res = await fetch('https://directline.botframework.com/v3/directline/tokens/generate', {
      method: 'POST',
      headers: {
        'Authorization': 'Bearer ' + secret
      },
      json: true
    });
    const { token } = await res.json();

    cosnt location = window.location.href;

    let store = window.WebChat.createStore(
      {},
      ({ dispatch }) => next => action => {
        if (action.type === 'DIRECT_LINE/POST_ACTIVITY') {
          // simple-update-in is used to update the "action"
          action = window.simpleUpdateIn(action, ['payload', 'activity', 'channelData', 'location'], () => location);
        }
        return next(action);
      }
    );

    window.WebChat.renderWebChat({
      directLine: window.WebChat.createDirectLine({ token }),
      store,
      styleOptions: {
        botAvatarInitials: 'BF',
        userAvatarInitials: 'WC'
      }
    }, document.getElementById('webchat'));

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

在漫游器的活动对象中,我们看到位置值已按我们指定的那样在channelData中传递。

channelData: { clientActivityID: '15469789226730.86rx9n6ssex', location: 'http://localhost:3000/' }

希望有帮助!