1

我已经使用Bot 框架创建了一个机器人,并且想知道在使用directline时是否有任何方法可以为不同的用户维护不同的会话。
在使用 Skype 频道时,会为个人用户维护用户会话,我想在我的直连客户端中实现相同的功能。
在我的情况下,上一个会话数据被下一个会话数据覆盖。
我正在使用Node.js构建机器人。

4

2 回答 2

1

您需要为每个用户开始一个新的对话。

假设您像我一样将您的工作基于Direct Line (WebSockets)示例(它使用 Swagger-JS v2)。

如果您使用您的秘密生成一个令牌并将该令牌附加到将开始对话的客户端,如下所示:

// Obtain a token using the Direct Line secret
return rp({
    url: 'https://directline.botframework.com/v3/directline/tokens/generate',
    method: 'POST',
    headers: {
        'Authorization': 'Bearer ' + directLineSecret
    },
    json: true
}).then(function (response) {
    // Then, replace the client's auth secret with the new token
    var token = response.token;
    client.clientAuthorizations.add('AuthorizationBotConnector', new Swagger.ApiKeyAuthorization('Authorization', 'Bearer ' + token, 'header'));
    return client;
});

此客户端将只能开始一次对话。这就是为什么你有覆盖对话问题。

为了让客户端启动多个会话。您需要将您的秘密放在客户端授权标头中,如下所示:

.then(function (client) {
    // No need to obtain a token using the Direct Line secret
    // Use the Direct Line secret directly
    client.clientAuthorizations.add('AuthorizationBotConnector', new Swagger.ApiKeyAuthorization('Authorization', 'Bearer ' + directLineSecret, 'header'));
    return client;
})

使用此方法,每次您使用此方法开始新对话时:

client.Conversations.Conversations_StartConversation();

将为每个对话生成一个令牌,您可以为每个用户进行对话。当然,您需要在应用的用户 ID 和 Direct Line 的对话 ID 之间添加映射。

于 2017-09-16T21:47:28.197 回答
0

假设您已经知道用户是谁并且拥有 userId,这需要用户手动或通过 OAuth 提供。您需要这样做,因为在构建会话数据时,它被用作行条目的键的一部分。每个条目的 id 是 userId + ':' + conversationId。您可以通过 userId 查询您的会话以检索会话 ID。然后你可以在 session 对象中设置 conversationId。

于 2017-09-13T21:23:19.003 回答