如何使用 DirectLine 设置 [Activity.From.Id] 、 [member.Id] 或 [activity.Recipient.Id]?
How to Set [Activity.From.Id] , [member.Id] or [activity.Recipient.Id] using DirectLine?
我正在使用 MS directline 将自定义频道与基于 botframework 的聊天机器人集成。
我正在使用以下函数生成令牌并开始对话,但其中 none 允许设置 Context.Activity.From.Id
、MembersAdded.FirstOrDefault().Id
或 Activity.Recipient.Id
GenerateTokenForNewConversationAsync()
StartConversationAsync()
我知道我们可以在通过直线发送第一条用户消息时控制 ID,但我想在用户发送消息之前控制上述任何 ID。我想设置一个特定的 ID 并能够在类型为 ActivityTypes.ConversationUpdate
的 BOT 事件 OnTurnAsync
和 Activity
上捕获它。我应该怎么做?
关于我的评论,我决定只提供如何使用这两个包执行您想要的操作。再一次,如果切换起来不太麻烦,我强烈推荐使用 Microsoft.Bot.Connector
(newer and more frequently updated) over Microsoft.Bot.Connector.DirectLine
(较旧,2.5 年未更新,并且 已弃用 until/unless 我们将其开源 更新: 这实际上并没有被弃用。我们目前正在努力将其开源,但这是一个低优先级的任务)。
推荐:Microsoft.Bot.Connector
使用 To 和 From 一体化创建对话。
var userAccount = new ChannelAccount(toId,toName);
var botAccount = new ChannelAccount(fromId, fromName);
var connector = new ConnectorClient(new Uri(serviceUrl));
IMessageActivity message = Activity.CreateMessageActivity();
if (!string.IsNullOrEmpty(conversationId) && !string.IsNullOrEmpty(channelId))
{
message.ChannelId = channelId;
}
else
{
conversationId = (await connector.Conversations.CreateDirectConversationAsync( botAccount, userAccount)).Id;
}
message.From = botAccount;
message.Recipient = userAccount;
message.Conversation = new ConversationAccount(id: conversationId);
message.Text = "Hello, this is a notification";
message.Locale = "en-Us";
await connector.Conversations.SendToConversationAsync((Activity)message);
Credit
不推荐:Microsoft.Bot.Connector.DirectLine
这是一种变通的解决方法,但基本上,您创建对话然后发送 ConversationUpdate
activity.
//server side, retrieve token from secret
string directLineSecret = ConfigurationManager.AppSettings["DirectLineSecret"];
HttpClient httpClient = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post,$"https://directline.botframework.com/v3/directline/tokens/generate");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", directLineSecret);
var fromUser = $"dl_{Guid.NewGuid()}";
request.Content = new StringContent(
JsonConvert.SerializeObject(
new { User = new { Id = fromUser } }),
Encoding.UTF8,
"application/json");
var response = await httpClient.SendAsync(request);
DirectLineToken dlToken = null;
if (response.IsSuccessStatusCode)
{
var body = await response.Content.ReadAsStringAsync();
dlToken = JsonConvert.DeserializeObject<DirectLineToken>(body);
}
string token = dlToken.token;
//create DirectLineClient from token, client side
DirectLineClient client = new DirectLineClient(token);
var conversation = await client.Conversations.StartConversationAsync();
new System.Threading.Thread(async () => await ReadBotMessagesAsync(client, conversation.ConversationId)).Start();
//send conversationUpdate
var user = new ChannelAccount(fromUser);
await client.Conversations.PostActivityAsync(conversation.ConversationId,
new Activity
{
From = user,
Text = string.Empty,
Type = ActivityTypes.ConversationUpdate,
MembersAdded = new[] { user }
}
);
TimeSpan delayTime = TimeSpan.FromSeconds(dlToken.expires_in) - TimeSpan.FromMinutes(5);
Task.Factory.StartNew(async () =>
{
while (!_getTokenAsyncCancellation.IsCancellationRequested)
{
var t = await client.Tokens.RefreshTokenAsync().ConfigureAwait(false);
await Task.Delay(delayTime, _getTokenAsyncCancellation.Token).ConfigureAwait(false);
}
}).ConfigureAwait(false);
我正在使用 MS directline 将自定义频道与基于 botframework 的聊天机器人集成。
我正在使用以下函数生成令牌并开始对话,但其中 none 允许设置 Context.Activity.From.Id
、MembersAdded.FirstOrDefault().Id
或 Activity.Recipient.Id
GenerateTokenForNewConversationAsync()
StartConversationAsync()
我知道我们可以在通过直线发送第一条用户消息时控制 ID,但我想在用户发送消息之前控制上述任何 ID。我想设置一个特定的 ID 并能够在类型为 ActivityTypes.ConversationUpdate
的 BOT 事件 OnTurnAsync
和 Activity
上捕获它。我应该怎么做?
关于我的评论,我决定只提供如何使用这两个包执行您想要的操作。再一次,如果切换起来不太麻烦,我强烈推荐使用 Microsoft.Bot.Connector
(newer and more frequently updated) over Microsoft.Bot.Connector.DirectLine
(较旧,2.5 年未更新,并且 已弃用 until/unless 我们将其开源 更新: 这实际上并没有被弃用。我们目前正在努力将其开源,但这是一个低优先级的任务)。
推荐:Microsoft.Bot.Connector
使用 To 和 From 一体化创建对话。
var userAccount = new ChannelAccount(toId,toName);
var botAccount = new ChannelAccount(fromId, fromName);
var connector = new ConnectorClient(new Uri(serviceUrl));
IMessageActivity message = Activity.CreateMessageActivity();
if (!string.IsNullOrEmpty(conversationId) && !string.IsNullOrEmpty(channelId))
{
message.ChannelId = channelId;
}
else
{
conversationId = (await connector.Conversations.CreateDirectConversationAsync( botAccount, userAccount)).Id;
}
message.From = botAccount;
message.Recipient = userAccount;
message.Conversation = new ConversationAccount(id: conversationId);
message.Text = "Hello, this is a notification";
message.Locale = "en-Us";
await connector.Conversations.SendToConversationAsync((Activity)message);
Credit
不推荐:Microsoft.Bot.Connector.DirectLine
这是一种变通的解决方法,但基本上,您创建对话然后发送 ConversationUpdate
activity.
//server side, retrieve token from secret
string directLineSecret = ConfigurationManager.AppSettings["DirectLineSecret"];
HttpClient httpClient = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post,$"https://directline.botframework.com/v3/directline/tokens/generate");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", directLineSecret);
var fromUser = $"dl_{Guid.NewGuid()}";
request.Content = new StringContent(
JsonConvert.SerializeObject(
new { User = new { Id = fromUser } }),
Encoding.UTF8,
"application/json");
var response = await httpClient.SendAsync(request);
DirectLineToken dlToken = null;
if (response.IsSuccessStatusCode)
{
var body = await response.Content.ReadAsStringAsync();
dlToken = JsonConvert.DeserializeObject<DirectLineToken>(body);
}
string token = dlToken.token;
//create DirectLineClient from token, client side
DirectLineClient client = new DirectLineClient(token);
var conversation = await client.Conversations.StartConversationAsync();
new System.Threading.Thread(async () => await ReadBotMessagesAsync(client, conversation.ConversationId)).Start();
//send conversationUpdate
var user = new ChannelAccount(fromUser);
await client.Conversations.PostActivityAsync(conversation.ConversationId,
new Activity
{
From = user,
Text = string.Empty,
Type = ActivityTypes.ConversationUpdate,
MembersAdded = new[] { user }
}
);
TimeSpan delayTime = TimeSpan.FromSeconds(dlToken.expires_in) - TimeSpan.FromMinutes(5);
Task.Factory.StartNew(async () =>
{
while (!_getTokenAsyncCancellation.IsCancellationRequested)
{
var t = await client.Tokens.RefreshTokenAsync().ConfigureAwait(false);
await Task.Delay(delayTime, _getTokenAsyncCancellation.Token).ConfigureAwait(false);
}
}).ConfigureAwait(false);