Partilhar via


Criar e enviar caixas de diálogo

Importante

Os exemplos de código nesta secção baseiam-se na v4.6 e versões posteriores do SDK do Bot Framework. Se estiver à procura de documentação para versões anteriores, veja a secção Extensões de Mensagens – SDK v3 na pasta Recursos da documentação.

Pode criar uma caixa de diálogo modal (referida como módulo de tarefas no TeamsJS v1.x) com um Cartão Ajustável ou uma vista Web incorporada. Para criar uma caixa de diálogo, tem de executar o processo denominado pedido de invocação inicial. Este documento abrange o pedido de invocação inicial, as propriedades da atividade payload quando uma caixa de diálogo é invocada a partir de um chat de 1:1, chat de grupo, canal (nova publicação), canal (responder a thread) e caixa de comando.

Observação

Se não estiver a preencher a caixa de diálogo com parâmetros definidos no manifesto da aplicação, tem de criar a caixa de diálogo para os utilizadores com um Cartão Ajustável ou uma vista Web incorporada.

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 Microsoft Entra do utilizador que enviou o pedido.
channelData.tenant.id ID do inquilino do Microsoft Entra.
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 payload quando uma caixa de diálogo é invocada a partir do chat 1:1

As propriedades da atividade payload quando uma caixa de diálogo é invocada a partir do chat 1:1 são listadas da seguinte forma:

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 Microsoft Entra do utilizador que enviou o pedido.
channelData.tenant.id ID do inquilino do Microsoft Entra.
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 payload quando uma caixa de diálogo é invocada a partir do chat 1:1 são dadas 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 payload quando uma caixa de diálogo é invocada a partir de uma conversa de grupo

As propriedades da atividade payload quando uma caixa de diálogo é invocada a partir de uma conversa de grupo são listadas da seguinte forma:

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 Microsoft Entra do utilizador que enviou o pedido.
channelData.tenant.id ID do inquilino do Microsoft Entra.
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 payload quando uma caixa de diálogo é invocada a partir de uma conversa de grupo são dadas no exemplo seguinte:

{
  "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 payload quando uma caixa de diálogo é invocada a partir de uma conversa de reunião

As propriedades da atividade payload quando uma caixa de diálogo é invocada a partir de uma conversa de reunião são dadas no exemplo seguinte:

{
   "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 payload quando uma caixa de diálogo é invocada a partir de um canal (nova mensagem)

As propriedades da atividade payload quando uma caixa de diálogo é invocada a partir de um canal (nova mensagem) são listadas da seguinte forma:

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 Microsoft Entra do utilizador que enviou o pedido.
channelData.tenant.id ID do inquilino do Microsoft Entra.
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 payload quando uma caixa de diálogo é invocada a partir de um canal (nova mensagem) são fornecidas no exemplo seguinte:

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

As propriedades da atividade payload quando uma caixa de diálogo é invocada a partir de um canal (responder ao thread) são listadas da seguinte forma:

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 Microsoft Entra do utilizador que enviou o pedido.
channelData.tenant.id ID do inquilino do Microsoft Entra.
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 payload quando uma caixa de diálogo é invocada a partir de um canal (responder a thread) são fornecidas no exemplo seguinte:

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

As propriedades da atividade payload quando uma caixa de diálogo é invocada a partir de uma caixa de comando são listadas da seguinte forma:

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 Microsoft Entra do utilizador que enviou o pedido.
channelData.tenant.id ID do inquilino do Microsoft Entra.
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 payload quando uma caixa de diálogo é invocada a partir de uma caixa de comando são fornecidas no exemplo seguinte:

{
  "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 a partir de uma mensagem, o value objeto no pedido de invocação inicial tem de conter os detalhes da mensagem a partir da qual a 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 para 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 Ajustável que define o formulário (se estiver a utilizar um).
url O URL a abrir dentro da caixa de diálogo como uma vista Web incorporada.
fallbackUrl Se um cliente não suportar a funcionalidade de caixa de diálogo, este URL é aberto num separador do browser.

Responder à fetchTask com um Cartão Adaptável

Ao utilizar um Cartão Ajustável, tem de responder com um task objeto com o value objeto que contém um Cartão Ajustável.

Exemplo

A secção de código seguinte é um exemplo de fetchTask resposta com um Cartão Ajustá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 vista Web incorporada

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 a sua vista Web incorporada, veja 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 a aplicação contiver um bot de conversação, instale o bot na conversação e, em seguida, 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 submissão da caixa de diálogo. View View View View
Pré-visualização da ação da extensão de mensagem Este exemplo mostra como utilizar a pré-visualização de ações em Extensões de Mensagens com 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. Procura pacotes de deslocamento e apresenta os resultados na extensão de mensagens baseada em pesquisa. View View View View

Próxima etapa

Confira também