我们希望有多个网站来放置聊天机器人,但是我们肯定要使用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来做到这一点。
答案 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/' }
希望有帮助!