如何让新版botframework webchat记住用户ID

如何让新版botframework webchat记住用户ID,botframework,web-chat,Botframework,Web Chat,webchat的旧开箱即用版本,用于在通过同一浏览器访问时跨会话记住用户。我猜这是通过使用饼干?新版本(“双子座”)没有做到这一点。每次我关闭浏览器窗口并从同一浏览器再次打开时,都会发送一个新的ID,因此我无法再访问保存的userState信息。为了恢复格式,我通过directline切换到botframework webchat,并遇到了同样的问题。userID有一个显式的输入,我不知道如何为特定的用户保持一致 我不是一个web开发人员,目前没有必要使其成为一个健壮的实现。我只是想让这项工作的

webchat的旧开箱即用版本,用于在通过同一浏览器访问时跨会话记住用户。我猜这是通过使用饼干?新版本(“双子座”)没有做到这一点。每次我关闭浏览器窗口并从同一浏览器再次打开时,都会发送一个新的ID,因此我无法再访问保存的userState信息。为了恢复格式,我通过directline切换到botframework webchat,并遇到了同样的问题。userID有一个显式的输入,我不知道如何为特定的用户保持一致

我不是一个web开发人员,目前没有必要使其成为一个健壮的实现。我只是想让这项工作的方式一样,前开箱即用的网络帽工作。有谁能解释一下以前的版本是如何工作的,和/或我如何使directline版本具有相同的功能

编辑:根据Steven对下面答案的评论,我尝试实现get/set Cookie,但不起作用。下面是我试过的代码。我可以通过控制台看到我正在进入if语句,并且正在生成userID,但是它没有被保存(我在应用程序>存储>Cookies中没有看到它,所以不仅仅是get不工作)。请告知

函数setCookie(名称、值、天数){
var=”;
如果(天){
变量日期=新日期();
date.setTime(date.getTime()+(天*24*60*60*1000));
expires=“;expires=“+date.toutString();
}
document.cookie=name+“=”+(值| |“”)+expires+“path=/”;
}
函数getCookie(名称){
变量nameEQ=name+“=”;
var ca=document.cookie.split(“;”);
对于(变量i=0;i
请查看我发布的前半部分。它讨论了如何在用户刷新或暂时离开时保持浏览器会话

简言之,它依赖于使用
sessionStorage()
来存储
令牌
conversationId

虽然不让会话连续重新启动非常有用,但在测试过程中,必须关闭并重新打开或硬刷新并删除会话存储以获得一个干净的状态也会很烦人

如果它不影响您的页面或您的需求,请在页面上放置一个按钮,并将其链接到以下代码位。这是一个非常有用的简单技巧

const reloadBtn=document.getElementById('reloadBtn');
重载btn.onclick=()=>{
位置。重新加载(true);
};
window.onbeforeunload=函数(){
window.sessionStorage.removietem('conversationId');
window.sessionStorage.removietem('token');
};

希望有帮助

请查看我发布的前半部分。它讨论了如何在用户刷新或暂时离开时保持浏览器会话

简言之,它依赖于使用
sessionStorage()
来存储
令牌
conversationId

虽然不让会话连续重新启动非常有用,但在测试过程中,必须关闭并重新打开或硬刷新并删除会话存储以获得一个干净的状态也会很烦人

如果它不影响您的页面或您的需求,请在页面上放置一个按钮,并将其链接到以下代码位。这是一个非常有用的简单技巧

const reloadBtn=document.getElementById('reloadBtn');
重载btn.onclick=()=>{
位置。重新加载(true);
};
window.onbeforeunload=函数(){
window.sessionStorage.removietem('conversationId');
window.sessionStorage.removietem('token');
};

希望有帮助

最终我发现处理这个问题的方法是通过令牌启动聊天会话。当您在令牌请求的主体中提供
user
属性时,它将正确启动会话并调出正确的用户状态(如果用户以前与bot进行过对话)。关于通过令牌启动webchat的文档有点简单。我是这样做的

首先,您需要在bot中创建一个端点来生成令牌(我正在从浏览器传入userId,稍后您就会看到)

server.post('/directline/token',异步(req,res)=>{
试一试{
var body={User:{Id:req.body.userId};
const response=等待请求({
网址:'https://directline.botframework.com/v3/directline/tokens/generate',
方法:“POST”,
标题:{授权:`Bearer${process.env.DIRECTLINE_SECRET}}`,
json:body,
拒绝:错误
});
const token=response.token;
res.setHeader('Content-Type','text/plain');
书面记录(200);
res.write(令牌);
res.end();
}捕捉(错误){
控制台日志(err);
res.setHeader('Content-Type','text/plain');
书面记录(500);
res.write('从直连线路检索令牌的调用失败');
res.end();
}
})
你可以