如何为从 WebChat 组件触发的 conversationUpdate 事件更新 channelData?

How can I update channelData for conversationUpdate Event being triggered from WebChat component?

我正在尝试使用 Angular 客户端连接到机器人服务。 我能够连接到 Bot 服务,但是一旦我 post 一条消息 Activity,WebChat 客户端就会向 Bot 发送一个 conversationUpdate 事件,因此我从机器人。 (如果我从客户端将 firstMessage 的 channelData 中的 userToken 发送到 Bot Service,我将不会获得登录卡)。

我正在尝试在 channelData 中发送带有 userToken 的 activity,但是 conversationUpdate 事件在我的消息 activity 之前到达 Bot 服务并且我收到了一张登录卡。

我需要发送自定义 channelData 以及从客户端发送的 conversationUpdate 事件。

使用反向通道机制,我能够为 posting 活动发送自定义 channelData,但是这个 conversationUpdate 事件是从 websocket 内部触发的,我需要拦截这个事件触发器。

代码详情如下:

Index.html

<script src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js"></script>
<script src="https://unpkg.com/simple-update-in/dist/simple-update-in.production.min.js"></script>

app.component.ts


// after response from https://directline.botframework.com/v3/directline/conversations
createDirectLine(response: any) {
        this.directLine =  window.WebChat.createDirectLine({
            token: response.token,
            webSocket: true,
            streamUrl: response.streamUrl,
            conversationId: response.conversationId
          });
}

this.store = window.WebChat.createStore({},
            ({dispatch}) => next => action => {
                    if (action.type === 'DIRECT_LINE/POST_ACTIVITY') {
                     // add custom channelData to every postActivity
                     action = window.simpleUpdateIn(action, ['payload', 'activity', 'channelData', 'UserToken'], function () { return this.userToken; });
                    }
                    if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {
                        // Send event to bot with custom data
                        dispatch({
                          type: 'WEB_CHAT/SEND_EVENT',
                          payload: {
                            activity: {
                                type : 'conversationUpdate',
                                channelData : { 'UserToken : this.userToken}
                                }
                            }
                        })
                    }
                  return next(action);
                });

renderWebChat() {
        window.WebChat.renderWebChat(
            {
                directLine: this.directLine,
                store: this.store
            },
            this.botWindowElement.nativeElement
        );
}

P.S。这不是完整的代码,我只添加了一些片段。

您不应尝试使用网络聊天来直接操纵由 Direct Line 生成的对话更新活动。您可以在创建对话时通过提供用户 ID 来影响这些活动,但其余的都不在您的手中。尝试将令牌嵌入用户 ID 可能不是一个好主意,但您可以将令牌托管在机器人可以使用用户 ID 查找它的地方。

我认为您真正想要做的是向机器人发送一个事件 activity 以指示连接成功,然后使用该事件而不是对话更新。您似乎已经在正确的轨道上,因为您正在尝试响应中间件中的 DIRECT_LINE/CONNECT_FULFILLED 操作。只需尝试按照此处的示例操作:https://github.com/microsoft/BotFramework-WebChat/tree/master/samples/04.api/a.welcome-event