Share via


Criar e enviar caixas de diálogo

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 uma caixa de diálogo modal (conhecida como módulo de tarefa no TeamsJS v1.x) usando um Cartão Adaptável ou uma exibição da Web inserida. Para criar uma caixa de diálogo, você deve executar o processo chamado de solicitação de invocação inicial. Este documento aborda as propriedades de solicitação de invocação inicial, atividade de carga quando uma caixa de diálogo é invocada a partir de chat 1:1, chat em grupo, canal (nova postagem), canal (resposta ao thread) e caixa de comando.

Observação

Se você não estiver preenchendo a caixa de diálogo com parâmetros definidos no manifesto do aplicativo, você deverá criar a caixa de diálogo para usuários com um Cartão Adaptável ou uma exibição Web inserida.

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 Microsoft Entra ID do objeto do usuário que enviou a solicitação.
channelData.tenant.id Microsoft Entra ID do locatário.
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 de atividade de carga quando uma caixa de diálogo é invocada de chat 1:1

As propriedades da atividade de carga quando uma caixa de diálogo é invocada do chat 1:1 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 Microsoft Entra ID do objeto do usuário que enviou a solicitação.
channelData.tenant.id Microsoft Entra ID do locatário.
channelData.source.name O nome de origem de onde a caixa de diálogo é invocada.
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 carga quando uma caixa de diálogo é invocada do chat 1:1 são fornecidas 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 de atividade de carga quando uma caixa de diálogo é invocada de um chat em grupo

As propriedades da atividade de carga quando uma caixa de diálogo é invocada de um chat de 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 Microsoft Entra ID do objeto do usuário que enviou a solicitação.
channelData.tenant.id Microsoft Entra ID do locatário.
channelData.source.name O nome de origem de onde a caixa de diálogo é invocada.
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 carga quando uma caixa de diálogo é invocada de um chat em grupo são dadas no exemplo a seguir:

{
  "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 de atividade de carga quando uma caixa de diálogo é invocada de um chat de reunião

As propriedades da atividade de carga quando uma caixa de diálogo é invocada de um chat de reunião são dadas no exemplo a seguir:

{
   "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 de atividade de carga quando uma caixa de diálogo é invocada de um canal (nova postagem)

As propriedades da atividade de carga quando uma caixa de diálogo é invocada 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 Microsoft Entra ID do objeto do usuário que enviou a solicitação.
channelData.tenant.id Microsoft Entra ID do locatário.
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 a caixa de diálogo é invocada.
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 carga quando uma caixa de diálogo é invocada de um canal (nova postagem) são fornecidas no exemplo a seguir:

{
  "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 carga quando uma caixa de diálogo é invocada de um canal (resposta ao thread)

As propriedades da atividade de carga quando uma caixa de diálogo é invocada de um canal (resposta ao thread) 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 Microsoft Entra ID do objeto do usuário que enviou a solicitação.
channelData.tenant.id Microsoft Entra ID do locatário.
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 a caixa de diálogo é invocada.
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 carga quando uma caixa de diálogo é invocada de um canal (resposta ao thread) são fornecidas no exemplo a seguir:

{
  "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 de atividade de carga quando uma caixa de diálogo é invocada de uma caixa de comando

As propriedades da atividade de carga quando uma caixa de diálogo é invocada de uma caixa de comando 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 Microsoft Entra ID do objeto do usuário que enviou a solicitação.
channelData.tenant.id Microsoft Entra ID do locatário.
channelData.source.name O nome de origem de onde a caixa de diálogo é invocada.
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 carga quando uma caixa de diálogo é invocada de uma caixa de comando são dadas no exemplo a seguir:

{
  "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 da caixa de diálogo.
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 da caixa de diálogo como uma exibição da Web inserida.
fallbackUrl Se um cliente não dá suporte ao recurso de caixa de diálogo, 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 task objeto com o value objeto que contém um Cartão Adaptável.

Exemplo

A seção de código a seguir é um exemplo de fetchTask resposta 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 dialog",
        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 uma caixa de diálogo com uma exibição web inserida

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 sua exibição da Web inserida, consulte a documentação da caixa de diálogo.

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 dialog",
        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, instale o bot na conversa e carregue a caixa de diálogo. O bot é útil para obter contexto adicional para a caixa de diálogo. 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 caixa de diálogo e responder à ação de envio de diálogo. 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