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 1Option 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