Botframework 如何添加可关闭webchat页面的按钮?

Botframework 如何添加可关闭webchat页面的按钮?,botframework,web-chat,Botframework,Web Chat,我正在使用WebChatV3和BotFrameworkV3。 是否可以向用户发送一个可以关闭webchat页面的按钮?我认为这在Web Chat v3中是不可能的;但是,在Web Chat v4中,您可以使用卡操作中间件更改操作默认行为。然后从机器人你可以发送一张带有按钮的卡片来关闭窗口 网络聊天v4 Bot框架sdkv4节点 注意,Web Chat v3目前处于日落状态,不再受支持,但Web Chat v4与v3机器人程序兼容。有关更多详细信息,请参阅文档 希望这有帮助 根据要求,这里是v3解

我正在使用WebChatV3和BotFrameworkV3。
是否可以向用户发送一个可以关闭webchat页面的按钮?

我认为这在Web Chat v3中是不可能的;但是,在Web Chat v4中,您可以使用卡操作中间件更改操作默认行为。然后从机器人你可以发送一张带有按钮的卡片来关闭窗口

网络聊天v4

Bot框架sdkv4节点

注意,Web Chat v3目前处于日落状态,不再受支持,但Web Chat v4与v3机器人程序兼容。有关更多详细信息,请参阅文档


希望这有帮助

根据要求,这里是v3解决方案。关键元素是.filter和.subscribe。筛选器侦听从bot到页面的传入活动。Subscribe侦听页面上的活动和事件,允许您在将数据发送到bot之前对其进行操作

此示例使用TJ的“imBack”类型英雄卡。或者,如果您不希望bot向用户发布显示所选内容的文本,您可以发送“回发”。在这种情况下,将不显示该值,并要求您在稍微不同的活动属性channelData和value上进行筛选

请注意,为了简单起见,我在这里通过包含这个秘密来实例化DirectLine。在生产中,您需要将您的秘密交换为令牌,以缓解任何安全问题

机器人聊天 博查特{ 边框:1px实心333; 浮动:左; 高度:600px; 位置:相对位置; 宽度:460px; } const params=BotChat.queryParamslocation.search; 常量用户={ id:params['userid']| |'userid', 名称:params['username']| |'username' }; const bot={ id:'机器人', 名称:“机器人” }; 窗口['botchatDebug']=params['debug']&¶ms['debug']='true'; const botConnection=new BotChat.DirectLine{ 秘密:“XXXXXX” }; BotChat.App{ 机器人:机器人, botConnection:botConnection, 用户:用户 },document.getElementById'botchat'; botConnection.activity$ .filterfunction活动{ 如果activity.type=='message'&&activity.text=='close'{ 窗口关闭; } } .订阅功能活动{ //进行函数调用并跟踪从页面到bot的活动/事件 };
希望有帮助

在v3网络聊天中可以做到这一点,如果有人要求,我可以分享……但是,这是一个没有意义的问题,因为试图从脚本调用close.window几乎被所有浏览器都阻止,因为存在安全风险。作为参考,Mozilla声明,如果同一脚本也打开了某个窗口,则该脚本只能关闭该窗口。在v3和v4中,此关闭尝试都将失败。@StevenKanberg使用v3解决方案添加一个答案将该解决方案标记为已接受,以服务于更大的堆栈溢出社区和任何有类似问题的人。如果你觉得我或史蒂文·坎伯格的回答足够了,请接受。如果没有,让我们知道我们还能提供什么帮助!
const cardActionMiddleware = () => next => card => {
  const { cardAction: { value }} = card;
  if (value === 'close') {
    window.close();
  }
  next(card);
}

window.WebChat.renderWebChat({
  cardActionMiddleware,
  directLine
}, document.getElementById('webchat'));
const card = CardFactory.heroCard(
  'Close Window',
  null,
  CardFactory.actions([
    {
      type: 'imBack',
      title: 'close',
      value: 'Close'
    }])
);

await context.sendActivity({ attachments: [card] });