Criar e enviar módulos de tarefa

Importante

Os exemplos de código nesta seção são baseados em versões v4.6 e posteriores do SDK do Bot Framework. Se você estiver procurando documentação para versões anteriores, consulte a seção Extensões de Mensagem – v3 SDK na pasta Recursos da documentação.

Você pode criar o módulo de tarefa usando um Cartão Adaptável ou um modo de exibição da Web incorporado. Para criar um módulo de tarefa, você deve executar o processo chamado de solicitação de invocação inicial. Este documento aborda a solicitação de invocação inicial, as propriedades da atividade de conteúdo quando um módulo de tarefa é invocado de um chat individual, chat em grupo, canal (nova postagem), canal (responder à conversa) e caixa de comandos.

Observação

Se você não estiver preenchendo o módulo de tarefa com parâmetros definidos no manifesto do aplicativo, deverá criar o módulo de tarefa para usuários com um Cartão Adaptável ou um modo de exibição da Web incorporado.

A solicitação de invocação inicial

No processo da solicitação de invocação inicial, seu serviço recebe um objeto Activity do tipo composeExtensions/fetchTask e você deve responder com um objeto task contendo um Cartão Adaptável ou uma URL para o modo de exibição da Web incorporado. Junto com as propriedades de atividade de bot padrão, o conteúdo de invocação inicial contém os seguintes metadados de solicitação:

Nome da propriedade Objetivo
type Tipo de solicitação. Deve ser invoke.
name Tipo de comando que é emitido para o serviço. Deve ser composeExtension/fetchTask.
from.id ID do usuário que enviou a solicitação.
from.name Nome do usuário que enviou a solicitação.
from.aadObjectId ID de objeto do Azure Active Directory do usuário que enviou a solicitação.
channelData.tenant.id Locatário do Azure Active Directory.
channelData.channel.id ID do canal (se a solicitação foi feita em um canal).
channelData.team.id ID da equipe (se a solicitação foi feita em um canal).
value.commandId Contém a ID do comando que foi invocado.
value.commandContext O contexto que disparou o evento. Deve ser compose.
value.context.theme O tema do cliente do usuário, útil para a formatação do modo exibição da Web incorporado. Deve ser default, contrast ou dark

Exemplo

O código para a solicitação de invocação inicial é fornecido no exemplo a seguir:

{
  "type": "invoke",
  "id": "f:bc319b1d-571a-194d-9ffb-11d7ab37c9ff",
  "from": {
    "id": "29:1aBjVi5MwCFfhPIV03E5uDdfpBFXp_2Yz-sjrvVg12oavg96cqpE_DiMhOpmN9zHeZpYbJcuUEKuSDy2AYWPz1A",
    "name": "Olo Brockhouse",
    "aadObjectId": "b130c271-d2eb-45f9-83ab-9eb3fe3788bc"
  }
  "channelData": {
    "tenant": {
      "id": "0d9b645f-597b-41f0-a2a3-ef103fbd91bb"
    },
    "source": {
      "name": "compose"
    }
  },
  "value": {
    "commandId": "Test",
    "commandContext": "compose",
    "requestId": "fe50f49e5c74440bb2ebf07f49e9553c",
    "context": {
      "theme": "default"
    }
  },
  "name": "composeExtension/fetchTask"

Propriedades da atividade de conteúdo quando um módulo de tarefa é invocado do chat individual

As propriedades da atividade de conteúdo quando um módulo de tarefa é invocado do chat individual são listadas da seguinte maneira:

Nome da propriedade Objetivo
type Tipo de solicitação. Deve ser invoke.
name Tipo de comando que é emitido para o serviço. Deve ser composeExtension/fetchTask.
from.id ID do usuário que enviou a solicitação.
from.name Nome do usuário que enviou a solicitação.
from.aadObjectId ID de objeto do Azure Active Directory do usuário que enviou a solicitação.
channelData.tenant.id Locatário do Azure Active Directory.
channelData.source.name O nome de origem de onde o módulo de tarefa é invocado.
ChannelData.legacy. replyToId Obtém ou define a ID da mensagem à qual esta mensagem é uma resposta.
value.commandId Contém a ID do comando que foi invocado.
value.commandContext O contexto que disparou o evento. Deve ser compose.
value.context.theme O tema do cliente do usuário, útil para a formatação do modo exibição da Web incorporado. Deve ser default, contrast ou dark

Exemplo

As propriedades da atividade de conteúdo quando um módulo de tarefa é invocado do chat individual são fornecidas no seguinte exemplo:

{
  "type": "invoke",
  "id": "f:bc319b1d-571a-194d-9ffb-11d7ab37c9ff",
  "from": {
    "id": "29:1aBjVi5MwCFfhPIV03E5uDdfpBFXp_2Yz-sjrvVg12oavg96cqpE_DiMhOpmN9zHeZpYbJcuUEKuSDy2AYWPz1A",
    "name": "Olo Brockhouse",
    "aadObjectId": "b130c271-d2eb-45f9-83ab-9eb3fe3788bc"
  }
  "channelData": {
    "tenant": {
      "id": "0d9b645f-597b-41f0-a2a3-ef103fbd91bb"
    },
    "source": {
      "name": "compose"
    }
  },
  "value": {
    "commandId": "Test",
    "commandContext": "compose",
    "requestId": "fe50f49e5c74440bb2ebf07f49e9553c",
    "context": {
      "theme": "default"
    }
  },
  "name": "composeExtension/fetchTask"
}

Propriedades da atividade de conteúdo quando um módulo de tarefa é invocado de um chat em grupo

As propriedades da atividade de conteúdo quando um módulo de tarefa é invocado do chat em grupo são listadas da seguinte maneira:

Nome da propriedade Objetivo
type Tipo de solicitação. Deve ser invoke.
name Tipo de comando que é emitido para o serviço. Deve ser composeExtension/fetchTask.
from.id ID do usuário que enviou a solicitação.
from.name Nome do usuário que enviou a solicitação.
from.aadObjectId ID de objeto do Azure Active Directory do usuário que enviou a solicitação.
channelData.tenant.id Locatário do Azure Active Directory.
channelData.source.name O nome de origem de onde o módulo de tarefa é invocado.
ChannelData.legacy. replyToId Obtém ou define a ID da mensagem à qual esta mensagem é uma resposta.
value.commandId Contém a ID do comando que foi invocado.
value.commandContext O contexto que disparou o evento. Deve ser compose.
value.context.theme O tema do cliente do usuário, útil para a formatação do modo exibição da Web incorporado. Deve ser default, contrast ou dark

Exemplo

As propriedades da atividade de conteúdo quando um módulo de tarefa é invocado de um chat em grupo são fornecidas no seguinte exemplo:

{
  "type": "invoke",
  "id": "f:bf72031f-a17e-f99c-48dc-5c0714950d87",
  "from": {
    "id": "29:1aBjVi5MwCFfhPIV03E5uDdfpBFXp_2Yz-sjrvVg12oavg96cqpE_DiMhOpmN9zHeZpYbJcuUEKuSDy2AYWPz1A",
    "name": "Olo Brockhouse",
    "aadObjectId": "b130c271-d2eb-45f9-83ab-9eb3fe3788bc"
  },
  "conversation": {
    "isGroup": true,
    "conversationType": "groupChat",
    "id": "19:d77be72390a1416e9644261e9064fa00@thread.skype",
    "tenantId": "0d9b645f-597b-41f0-a2a3-ef103fbd91bb"
  },
  "channelData": {
    "tenant": {
      "id": "0d9b645f-597b-41f0-a2a3-ef103fbd91bb"
    },
    "source": {
      "name": "compose"
    }
  },
  "value": {
    "commandId": "Test",
    "commandContext": "compose",
    "requestId": "213167a1e3b6428b93e186ea5407c759",
    "context": {
      "theme": "default"
    }
  },
  "name": "composeExtension/fetchTask"
}

Propriedades da atividade de conteúdo quando um módulo de tarefa é invocado de um chat de reunião

As propriedades da atividade de conteúdo quando um módulo de tarefa é invocado do chat de reunião são fornecidas no seguinte exemplo:

{
   "type": "invoke",
   "id": "f:4d271f11-4eed-622f-e820-6d82bf91692f",
   "channelId": "msteams",
   "from": {
      "id": "29:1yLsdbTM1UjxqqD8cjduNUCI1jm8xZaH3lx9u5JQ04t2bknuTCkP45TXdfROTOWk1LzN1AqTgFZUEqHIVGn_qUA",
      "name": "MOD Administrator",
      "aadObjectId": "ef16aa89-5b26-4a2c-aebb-761b551577c0"
   },
   "conversation": {
      "tenantId": "c9f9aafd-64ac-4f38-8e05-12feba3fb090",
      "id": "19:meeting_NTk4ZDY4ZmYtOWEzZS00OTRkLThhY2EtZmUzZmUzMDQyM2M0@thread.v2",
      "name": "Test meeting"
   },   
   "channelData": {
      "tenant": {
         "id": "c9f9aafd-64ac-4f38-8e05-12feba3fb090"
      },
      "source": {
         "name": "compose"
      },
      "meeting": {
         "id": "MCMxOTptZWV0aW5nX05UazRaRFk0Wm1ZdE9XRXpaUzAwT1RSa0xUaGhZMkV0Wm1VelptVXpNRFF5TTJNMEB0aHJlYWQudjIjMA=="
      }
   },
   "value": {
      "commandId": "Test",
      "commandContext": "compose",
      "requestId": "c46a6b53573f42b5bc801716e5ccc960",
      "context": {
         "theme": "default"
      }
   },
   "name": "composeExtension/fetchTask",
}

Propriedades da atividade de conteúdo quando um módulo de tarefa é invocado de um canal (nova postagem)

As propriedades da atividade de conteúdo quando um módulo de tarefa é invocado de um canal (nova postagem) são listadas da seguinte maneira:

Nome da propriedade Objetivo
type Tipo de solicitação. Deve ser invoke.
name Tipo de comando que é emitido para o serviço. Deve ser composeExtension/fetchTask.
from.id ID do usuário que enviou a solicitação.
from.name Nome do usuário que enviou a solicitação.
from.aadObjectId ID de objeto do Azure Active Directory do usuário que enviou a solicitação.
channelData.tenant.id Locatário do Azure Active Directory.
channelData.channel.id ID do canal (se a solicitação foi feita em um canal).
channelData.team.id ID da equipe (se a solicitação foi feita em um canal).
channelData.source.name O nome de origem de onde o módulo de tarefa é invocado.
ChannelData.legacy. replyToId Obtém ou define a ID da mensagem à qual esta mensagem é uma resposta.
value.commandId Contém a ID do comando que foi invocado.
value.commandContext O contexto que disparou o evento. Deve ser compose.
value.context.theme O tema do cliente do usuário, útil para a formatação do modo exibição da Web incorporado. Deve ser default, contrast ou dark

Exemplo

As propriedades da atividade de conteúdo quando um módulo de tarefa é invocado de um canal (nova postagem) são fornecidas no seguinte exemplo:

{
  "type": "invoke",
  "id": "f:a5fbb109-c989-c449-ee83-71ac99919d4b",
  "from": {
    "id": "29:1aBjVi5MwCFfhPIV03E5uDdfpBFXp_2Yz-sjrvVg12oavg96cqpE_DiMhOpmN9zHeZpYbJcuUEKuSDy2AYWPz1A",
    "name": "Olo Brockhouse",
    "aadObjectId": "b130c271-d2eb-45f9-83ab-9eb3fe3788bc"
  },
  "conversation": {
    "isGroup": true,
    "conversationType": "channel",
    "id": "19:6decf54d86d945e4b3924b63a9161a78@thread.skype",
    "name": "parsable",
    "tenantId": "0d9b645f-597b-41f0-a2a3-ef103fbd91bb"
  },
  "channelData": {
    "channel": {
      "id": "19:6decf54d86d945e4b3924b63a9161a78@thread.skype"
    },
    "team": {
      "id": "19:acca514e83cb497e960e0b014d405336@thread.skype"
    },
    "tenant": {
      "id": "0d9b645f-597b-41f0-a2a3-ef103fbd91bb"
    },
    "source": {
      "name": "compose"
    }
  },
  "value": {
    "commandId": "Test",
    "commandContext": "compose",
    "requestId": "5336640edc7748b28ce2df43f5b45963",
    "context": {
      "theme": "default"
    }
  },
  "name": "composeExtension/fetchTask"
}

Propriedades da atividade de conteúdo quando um módulo de tarefa é invocado de um canal (responder à conversa)

As propriedades da atividade de conteúdo quando um módulo de tarefa é invocado de um canal (responder à conversa) são listadas da seguinte maneira:

Nome da propriedade Objetivo
type Tipo de solicitação. Deve ser invoke.
name Tipo de comando que é emitido para o serviço. Deve ser composeExtension/fetchTask.
from.id ID do usuário que enviou a solicitação.
from.name Nome do usuário que enviou a solicitação.
from.aadObjectId ID de objeto do Azure Active Directory do usuário que enviou a solicitação.
channelData.tenant.id Locatário do Azure Active Directory.
channelData.channel.id ID do canal (se a solicitação foi feita em um canal).
channelData.team.id ID da equipe (se a solicitação foi feita em um canal).
channelData.source.name O nome de origem de onde o módulo de tarefa é invocado.
ChannelData.legacy. replyToId Obtém ou define a ID da mensagem à qual esta mensagem é uma resposta.
value.commandId Contém a ID do comando que foi invocado.
value.commandContext O contexto que disparou o evento. Deve ser compose.
value.context.theme O tema do cliente do usuário, útil para a formatação do modo exibição da Web incorporado. Deve ser default, contrast ou dark

Exemplo

As propriedades da atividade de conteúdo quando um módulo de tarefa é invocado de um canal (responder à conversa) são fornecidas no seguinte exemplo:

{
  "type": "invoke",
  "id": "f:19ccc884-c792-35ef-2f40-d0ff43dcca71",
  "from": {
    "id": "29:1aBjVi5MwCFfhPIV03E5uDdfpBFXp_2Yz-sjrvVg12oavg96cqpE_DiMhOpmN9zHeZpYbJcuUEKuSDy2AYWPz1A",
    "name": "Olo Brockhouse",
    "aadObjectId": "b130c271-d2eb-45f9-83ab-9eb3fe3788bc"
  },
  "conversation": {
    "isGroup": true,
    "conversationType": "channel",
    "id": "19:6decf54d86d945e4b3924b63a9161a78@thread.skype;messageid=1611060744833",
    "name": "parsable",
    "tenantId": "0d9b645f-597b-41f0-a2a3-ef103fbd91bb"
  },
  "channelData": {
    "channel": {
      "id": "19:6decf54d86d945e4b3924b63a9161a78@thread.skype"
    },
    "team": {
      "id": "19:acca514e83cb497e960e0b014d405336@thread.skype"
    },
    "tenant": {
      "id": "0d9b645f-597b-41f0-a2a3-ef103fbd91bb"
    },
    "source": {
      "name": "compose"
    }
  },
  "value": {
    "commandId": "TEst",
    "commandContext": "message",
    "requestId": "7f7d22efe5414818becebcec649a7912",
    "messagePayload": {
      "linkToMessage": "https://teams.microsoft.com/l/message/19:6decf54d86d945e4b3924b63a9161a78@thread.skype/1611060744833",
      "id": "1611060744833",
      "replyToId": null,
      "createdDateTime": "2021-01-19T12:52:24.833Z",
      "lastModifiedDateTime": null,
      "deleted": false,
      "summary": null,
      "importance": "normal",
      "locale": "en-us",
      "body": {
        "contentType": "html",
        "content": "<div><div><at id=\"0\">Testing outgoing Webhook-Nikitha</at> - Hi</div>\n</div>"
      },
      "from": {
        "device": null,
        "conversation": null,
        "user": {
          "userIdentityType": "aadUser",
          "id": "b130c271-d2eb-45f9-83ab-9eb3fe3788bc",
          "displayName": "Olo Brockhouse"
        },
        "application": null
      },
      "reactions": [],
      "mentions": [
        {
          "id": 0,
          "mentionText": "Testing outgoing Webhook-Nikitha",
          "mentioned": {
            "device": null,
            "conversation": null,
            "user": null,
            "application": {
              "applicationIdentityType": "webhook",
              "id": "b8c1c68c-e290-4bdd-81c3-266f310751dc",
              "displayName": "Testing outgoing Webhook-Nikitha"
            }
          }
        }
      ],
      "attachments": []
    },
    "context": {
      "theme": "default"
    }
  },
  "name": "composeExtension/fetchTask"
}

Propriedades da atividade de conteúdo quando um módulo de tarefa é invocado de uma caixa de comandos

As propriedades da atividade de conteúdo quando um módulo de tarefa é invocado da caixa de comandos são listadas da seguinte maneira:

Nome da propriedade Objetivo
type Tipo de solicitação. Deve ser invoke.
name Tipo de comando que é emitido para o serviço. Deve ser composeExtension/fetchTask.
from.id ID do usuário que enviou a solicitação.
from.name Nome do usuário que enviou a solicitação.
from.aadObjectId ID de objeto do Azure Active Directory do usuário que enviou a solicitação.
channelData.tenant.id Locatário do Azure Active Directory.
channelData.source.name O nome de origem de onde o módulo de tarefa é invocado.
value.commandId Contém a ID do comando que foi invocado.
value.commandContext O contexto que disparou o evento. Deve ser compose.
value.context.theme O tema do cliente do usuário, útil para a formatação do modo exibição da Web incorporado. Deve ser default, contrast ou dark

Exemplo

As propriedades da atividade de conteúdo quando um módulo de tarefa é invocado de uma caixa de comandos são fornecidas no seguinte exemplo:

{
  "type": "invoke",
  "id": "f:172560f1-95f9-3189-edb2-b7612cd1a3cd",
    "id": "29:1aBjVi5MwCFfhPIV03E5uDdfpBFXp_2Yz-sjrvVg12oavg96cqpE_DiMhOpmN9zHeZpYbJcuUEKuSDy2AYWPz1A",
    "name": "Olo Brockhouse",
    "aadObjectId": "b130c271-d2eb-45f9-83ab-9eb3fe3788bc"
  },
  "conversation": {
    "isGroup": true,
    "conversationType": "channel",
    "id": "19:6decf54d86d945e4b3924b63a9161a78@thread.skype",
    "name": "parsable",
    "tenantId": "0d9b645f-597b-41f0-a2a3-ef103fbd91bb"
  },
  "channelData": {
    "channel": {
      "id": "19:6decf54d86d945e4b3924b63a9161a78@thread.skype"
    },
    "team": {
      "id": "19:acca514e83cb497e960e0b014d405336@thread.skype"
    },
    "tenant": {
      "id": "0d9b645f-597b-41f0-a2a3-ef103fbd91bb"
    },
    "source": {
      "name": "compose"
    }
  },
  "value": {
    "commandId": "TEst",
    "commandContext": "compose",
    "requestId": "d2ce690cdc2b4920a538e75882610a30",
    "context": {
      "theme": "default"
    }
  },
  "name": "composeExtension/fetchTask"
}

Exemplo

A seção de código a seguir é um exemplo de solicitação fetchTask:

protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionFetchTaskAsync(ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken)
{
  //handle fetch task
}

Solicitação de invocação inicial de uma mensagem

Quando o bot é invocado de uma mensagem, o value objeto na solicitação de invocação inicial deve conter os detalhes da mensagem da qual sua extensão de mensagem é invocada. As matrizes reactions e mentions são opcionais e não estão presentes se não houver reações ou menções na mensagem original. A seção a seguir é um exemplo do objeto value:

protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionFetchTaskAsync(ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken)
{
  var messageText = action.MessagePayload.Body.Content;
  var fromId = action.MessagePayload.From.User.Id;

  //finish handling the fetchTask
}

Responder à fetchTask

Responda à solicitação de invocação com um objeto task que contém um objeto taskInfo com o Cartão Adaptável ou a URL da Web, ou uma mensagem de cadeia de caracteres simples.

Nome da propriedade Objetivo
type Pode ser continue apresentar um formulário ou message para um pop-up simples.
value Um objeto taskInfo para um formulário ou um string para uma mensagem.

O esquema para o objeto taskInfo é:

Nome da propriedade Objetivo
title O título do módulo de tarefa.
height Ele deve ser um número inteiro (em pixels) ou small, medium, large.
width Ele deve ser um número inteiro (em pixels) ou small, medium, large.
card O cartão adaptável que define o formulário (se estiver usando um).
url A URL a ser aberta dentro do módulo de tarefa como um modo de exibição da Web incorporado.
fallbackUrl Se um cliente não tiver suporte para o recurso de módulo da tarefa, essa URL será aberta em uma guia do navegador.

Responder à fetchTask com um Cartão Adaptável

Ao usar um cartão adaptável, você deve responder com um objeto task com o objeto value que contém um Cartão Adaptável.

Exemplo

A seção de código a seguir é um exemplo para a resposta fetchTask com um cartão adaptável:

Este exemplo usa o pacote AdaptiveCards NuGet além do SDK do Bot Framework.

protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionFetchTaskAsync(ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken)
{
  string placeholder = "Not invoked from message";

  if (action.MessagePayload != null)
  {
      var messageText = action.MessagePayload.Body.Content;
      var fromId = action.MessagePayload.From.User.Id;
      placeholder = "Invoked from message";
  }

  var response = new MessagingExtensionActionResponse()
  {
    Task = new TaskModuleContinueResponse()
    {
      Value = new TaskModuleTaskInfo()
      {
        Height = "small",
        Width = "small",
        Title = "Example task module",
        Card = new Attachment()
        {
          ContentType = AdaptiveCard.ContentType,
          Content = new AdaptiveCard("1.0")
          {
            Body = new List<AdaptiveElement>()
            {
              new AdaptiveTextInput() { Id = "FormField1", Placeholder = placeholder},
              new AdaptiveTextInput() { Id = "FormField2", Placeholder = "FormField2"},
              new AdaptiveTextInput() { Id = "FormField3", Placeholder = "FormField3"},
            },
            Actions = new List<AdaptiveAction>()
            {
              new AdaptiveSubmitAction()
              {
                Type = AdaptiveSubmitAction.TypeName,
                Title = "Submit",
              },
            },
          },
        },
      },
    },
  };
  return response;
}

Criar um módulo de tarefa com um modo de exibição da Web incorporado

Ao usar um modo de exibição da Web incorporado, você deve responder com um objeto task com o objeto value que contém a URL para o formulário da Web que você deseja carregar. Os domínios de qualquer URL que você deseja carregar devem ser incluídos na matriz validDomains no manifesto do aplicativo. Para obter mais informações sobre como criar seu modo de exibição da Web incorporado, confira a documentação do módulo de tarefas.

protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionFetchTaskAsync(ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken)
{
  string placeholder = "Not invoked from message";

  if (action.MessagePayload != null)
  {
      var messageText = action.MessagePayload.Body.Content;
      var fromId = action.MessagePayload.From.User.Id;
      placeholder = "Invoked from message";
  }

  var response = new MessagingExtensionActionResponse()
  {
    Task = new TaskModuleContinueResponse()
    {
      Value = new TaskModuleTaskInfo()
      {
        Height = "small",
        Width = "small",
        Title = "Example task module",
        Url = "https://contoso.com/msteams/taskmodules/newcustomer",
        },
      },
    },
  };
  return response;
}

Solicitação para instalar o bot de conversação

Se o aplicativo contiver um bot de conversação, instale o bot na conversa e carregue o módulo de tarefa. O bot é útil para obter contexto adicional para o módulo de tarefa. Um exemplo para esse cenário é buscar a lista de participantes para preencher um controle do seletor de pessoas ou a lista de canais em uma equipe.

Quando a extensão de mensagem receber a invocação composeExtensions/fetchTask, verifique se o bot está instalado no contexto atual para facilitar o fluxo. Por exemplo, verifique o fluxo com uma chamada get roster. Se o bot não estiver instalado, retorne um Cartão Adaptável com uma ação que solicita que o usuário instale o bot. O usuário deve ter permissão para instalar os aplicativos nesse local para verificação. Se a instalação do aplicativo não for bem-sucedida, o usuário receberá uma mensagem para entrar em contato com o administrador.

Exemplo

A seção de código a seguir é um exemplo de resposta:

{
  "type": "AdaptiveCard",
  "body": [
    {
      "type": "TextBlock",
      "text": "Looks like you haven't used Disco in this team/chat"
    }
  ],
  "actions": [
    {
      "type": "Action.Submit",
      "title": "Continue",
      "data": {
        "msteams": {
          "justInTimeInstall": true
        }
      }
    }
  ],
  "version": "1.0"
}

Após a instalação do bot de conversação, ele recebe outra mensagem de invocação com name = composeExtensions/submitAction e value.data.msteams.justInTimeInstall = true.

Exemplo

A seção de código a seguir é um exemplo da resposta da tarefa à invocação:

{
  "value": {
    "commandId": "giveKudos",
    "commandContext": "compose",
    "context": {
      "theme": "default"
    },
    "data": {
      "msteams": {
        "justInTimeInstall": true
      }
    }
  },
  "conversation": {
    "id": "19:7705841b240044b297123ad7f9c99217@thread.skype"
  },
  "name": "composeExtension/submitAction",
  "imdisplayname": "Bob Smith"
}

A resposta da tarefa à invocação deve ser semelhante à do bot instalado.

Exemplo

A seção de código a seguir é um exemplo de instalação just-in-time do aplicativo com Cartão Adaptável:

private static Attachment GetAdaptiveCardAttachmentFromFile(string fileName)
  {
      //Read the card json and create attachment.
         string[] paths = { ".", "Resources", fileName };
         var adaptiveCardJson = File.ReadAllText(Path.Combine(paths));
         var adaptiveCardAttachment = new Attachment()
            {
                ContentType = "application/vnd.microsoft.card.adaptive",
                Content = JsonConvert.DeserializeObject(adaptiveCardJson),
            };
            return adaptiveCardAttachment;
        }

Exemplo de código

Nome do exemplo Descrição .NET Node.js Python Manifesto
Ação de extensão de mensagem do Teams Este exemplo mostra como definir comandos de ação, criar módulo de tarefa e responder à ação de envio do módulo de tarefa. View View View View
Visualização da ação de extensão de mensagem Este exemplo mostra como usar a visualização de ação em Extensões de Mensagens usando o Bot Framework v4. View View NA View
Pesquisa de extensão de mensagem do Teams Este exemplo mostra como criar uma extensão de mensagem baseada em pesquisa. Ele pesquisa pacotes de cutucadas e exibe os resultados na extensão de mensagens baseada em pesquisa. View View View View

Próxima etapa

Confira também