Ms Teams - 自适应卡片操作并根据用户输入继续对话
Ms Teams - Adaptive Cards Actions and Continue Conversations based on user Input
我想通过 MS Teams Bot 向用户发送带有一些选项的自适应卡片。
在我知道用户选择了什么选项后,我想得到一个具体的回复。
我目前遇到的问题是:
- 我不知道用户选择了什么选项。
- 我不知道如何根据
用户的选择。
这是我目前尝试过的方法。
自适应卡json
{
"type": "AdaptiveCard",
"version": "1.0",
"body": [
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "stretch",
"items": [
{
"type": "ActionSet",
"actions": [
{
"id": "action 1",
"type": "Action.Submit",
"title": "Action.Submit"
}
]
}
]
}
]
},
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "stretch",
"items": [
{
"type": "ActionSet",
"actions": [
{
"id": "action 2",
"type": "Action.Submit",
"title": "Submit action 2"
}
]
}
]
}
]
},
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "stretch",
"items": [
{
"type": "ActionSet",
"actions": [
{
"id": "action 3",
"type": "Action.Submit",
"title": "Submit action3"
}
]
}
]
}
]
}
],
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json"
}
消息发送
public async Task<string> SendAdaptiveCardToAccountEmailAsync(AdaptiveCardRequest adaptiveCard)
{
var teamsConversations = await GetTeamsConversationsByEmail(adaptiveCard.AccountEmail);
var cardJson = File.ReadAllText(Path.Combine(".", "Resources", $"{adaptiveCard.Type}.json"));
var card = AdaptiveCard.FromJson(cardJson).Card;
var columnOne = (card.Body[0] as AdaptiveColumnSet).Columns[0].Items[0] as AdaptiveActionSet;
columnOne.Actions[0].Title = adaptiveCard.Options[0];
columnOne.Actions[0].Id = "Option 1";
var columnTwo = (card.Body[1] as AdaptiveColumnSet).Columns[0].Items[0] as AdaptiveActionSet;
columnTwo.Actions[0].Title = adaptiveCard.Options[1];
columnTwo.Actions[0].Id = "Option 2";
var columnThree = (card.Body[2] as AdaptiveColumnSet).Columns[0].Items[0] as AdaptiveActionSet;
columnThree.Actions[0].Title = adaptiveCard.Options[2];
columnThree.Actions[0].Id = "Option 3";
var attachment = new Attachment()
{
Content = card,
ContentType = "application/vnd.microsoft.card.adaptive"
};
var connector = new ConnectorClient(new Uri(teamsConversations.ServiceUrl),
_microsoftAppId,
_microsoftAppPassword);
AppCredentials.TrustServiceUrl(teamsConversations.ServiceUrl);
var activity = Activity.CreateMessageActivity();
activity.From = new ChannelAccount(_teamsBotId, _teamsBotName);
activity.Recipient =
new ChannelAccount(
teamsConversations.AccountId,
teamsConversations.AccountName);
activity.Conversation = new ConversationAccount(false,
"personal",
teamsConversations.ConversationId)
{
Id =
teamsConversations.ConversationId
};
activity.Attachments.Add(attachment);
connector.Conversations.SendToConversationAsync(activity as Activity).Wait();
return "ok";
}
用户选择
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext,
CancellationToken cancellationToken)
{
turnContext.Activity.RemoveRecipientMention();
var text = turnContext.Activity.Text.Trim().ToLower();
var replyText = $"You choose: {text}";
await turnContext.SendActivityAsync(MessageFactory.Text(replyText, replyText), cancellationToken);
}
在 visual studio 中使用 watch
我试图在 turnContext.Activity
中找到 action 1
或 Option 1
等,但没有成功。
有什么例子、建议、解决方案吗?
谢谢
您可以将您的自适应卡片行动施放为 AdaptiveSubmitAction
,它有一个 Data
属性。 属性 只是对象类型,所以你可以附加任何你喜欢的东西,比如自定义 class(例如 MyActionObject
,属性 比如 ActionType
或其他任何内容。这是一个示例:
public class MyActionObject {
public string ActionType {get; set; }
}
然后设置您的 AdaptiveAction 的数据以匹配它,例如:
`((AdaptiveSubmitAction)columnThree.Actions).Data = new MyActionObject() { ActionType = 'Action3' };
稍后,当您的机器人收到用户的 Activity 时,您可以查找此值,例如:
dynamic value = turnContext.Activity.Value as dynamic;
var data = value?.data?.data;
if (data?.ActionType == "Action3") // do something
我想通过 MS Teams Bot 向用户发送带有一些选项的自适应卡片。 在我知道用户选择了什么选项后,我想得到一个具体的回复。
我目前遇到的问题是:
- 我不知道用户选择了什么选项。
- 我不知道如何根据 用户的选择。
这是我目前尝试过的方法。
自适应卡json
{
"type": "AdaptiveCard",
"version": "1.0",
"body": [
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "stretch",
"items": [
{
"type": "ActionSet",
"actions": [
{
"id": "action 1",
"type": "Action.Submit",
"title": "Action.Submit"
}
]
}
]
}
]
},
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "stretch",
"items": [
{
"type": "ActionSet",
"actions": [
{
"id": "action 2",
"type": "Action.Submit",
"title": "Submit action 2"
}
]
}
]
}
]
},
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "stretch",
"items": [
{
"type": "ActionSet",
"actions": [
{
"id": "action 3",
"type": "Action.Submit",
"title": "Submit action3"
}
]
}
]
}
]
}
],
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json"
}
消息发送
public async Task<string> SendAdaptiveCardToAccountEmailAsync(AdaptiveCardRequest adaptiveCard)
{
var teamsConversations = await GetTeamsConversationsByEmail(adaptiveCard.AccountEmail);
var cardJson = File.ReadAllText(Path.Combine(".", "Resources", $"{adaptiveCard.Type}.json"));
var card = AdaptiveCard.FromJson(cardJson).Card;
var columnOne = (card.Body[0] as AdaptiveColumnSet).Columns[0].Items[0] as AdaptiveActionSet;
columnOne.Actions[0].Title = adaptiveCard.Options[0];
columnOne.Actions[0].Id = "Option 1";
var columnTwo = (card.Body[1] as AdaptiveColumnSet).Columns[0].Items[0] as AdaptiveActionSet;
columnTwo.Actions[0].Title = adaptiveCard.Options[1];
columnTwo.Actions[0].Id = "Option 2";
var columnThree = (card.Body[2] as AdaptiveColumnSet).Columns[0].Items[0] as AdaptiveActionSet;
columnThree.Actions[0].Title = adaptiveCard.Options[2];
columnThree.Actions[0].Id = "Option 3";
var attachment = new Attachment()
{
Content = card,
ContentType = "application/vnd.microsoft.card.adaptive"
};
var connector = new ConnectorClient(new Uri(teamsConversations.ServiceUrl),
_microsoftAppId,
_microsoftAppPassword);
AppCredentials.TrustServiceUrl(teamsConversations.ServiceUrl);
var activity = Activity.CreateMessageActivity();
activity.From = new ChannelAccount(_teamsBotId, _teamsBotName);
activity.Recipient =
new ChannelAccount(
teamsConversations.AccountId,
teamsConversations.AccountName);
activity.Conversation = new ConversationAccount(false,
"personal",
teamsConversations.ConversationId)
{
Id =
teamsConversations.ConversationId
};
activity.Attachments.Add(attachment);
connector.Conversations.SendToConversationAsync(activity as Activity).Wait();
return "ok";
}
用户选择
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext,
CancellationToken cancellationToken)
{
turnContext.Activity.RemoveRecipientMention();
var text = turnContext.Activity.Text.Trim().ToLower();
var replyText = $"You choose: {text}";
await turnContext.SendActivityAsync(MessageFactory.Text(replyText, replyText), cancellationToken);
}
在 visual studio 中使用 watch
我试图在 turnContext.Activity
中找到 action 1
或 Option 1
等,但没有成功。
有什么例子、建议、解决方案吗?
谢谢
您可以将您的自适应卡片行动施放为 AdaptiveSubmitAction
,它有一个 Data
属性。 属性 只是对象类型,所以你可以附加任何你喜欢的东西,比如自定义 class(例如 MyActionObject
,属性 比如 ActionType
或其他任何内容。这是一个示例:
public class MyActionObject {
public string ActionType {get; set; }
}
然后设置您的 AdaptiveAction 的数据以匹配它,例如: `((AdaptiveSubmitAction)columnThree.Actions).Data = new MyActionObject() { ActionType = 'Action3' };
稍后,当您的机器人收到用户的 Activity 时,您可以查找此值,例如:
dynamic value = turnContext.Activity.Value as dynamic;
var data = value?.data?.data;
if (data?.ActionType == "Action3") // do something