Crear y enviar diálogos

Importante

Los ejemplos de código de esta sección se basan en la versión 4.6 y versiones posteriores del SDK de Bot Framework. Si busca documentación para versiones anteriores, consulte la sección Extensiones de mensaje - SDK v3 en la carpeta Recursos de la documentación.

Puede crear un cuadro de diálogo modal (denominado módulo de tareas en TeamsJS v1.x) mediante una tarjeta adaptable o una vista web incrustada. Para crear un cuadro de diálogo, debe realizar el proceso denominado solicitud de invocación inicial. Este documento trata la solicitud de invocación inicial, las propiedades de la actividad de carga cuando se invoca un cuadro de diálogo desde el chat 1:1, el chat de grupo, el canal (nueva publicación), el canal (respuesta al subproceso) y el cuadro de comandos.

Nota:

Si no rellena el cuadro de diálogo con parámetros definidos en el manifiesto de la aplicación, debe crear el cuadro de diálogo para los usuarios con una tarjeta adaptable o una vista web incrustada.

La solicitud de invocación inicial

En el proceso de la solicitud de invocación inicial, el servicio recibe un objeto Activity de tipo composeExtensions/fetchTask y debe responder con un objeto task que contenga una tarjeta adaptable o una dirección URL a la vista web incrustada. Junto con las propiedades de actividad del bot estándar, la carga de invocación inicial contiene los siguientes metadatos de solicitud:

Nombre de propiedad Objetivo
type Tipo de solicitud. Debe ser invoke.
name Tipo de comando que se emite para el servicio. Debe ser composeExtension/fetchTask.
from.id Id. del usuario que envió la solicitud.
from.name Nombre del usuario que envió la solicitud.
from.aadObjectId Microsoft Entra identificador de objeto del usuario que envió la solicitud.
channelData.tenant.id Microsoft Entra identificador de inquilino.
channelData.channel.id Id. de canal (si la solicitud se realizó en un canal).
channelData.team.id Id. de equipo (si la solicitud se realizó en un canal).
value.commandId Contiene el identificador del comando que se invocó.
value.commandContext Contexto que desencadenó el evento. Debe ser compose.
value.context.theme El tema de cliente del usuario, útil para el formato de vista web incrustada. Debe ser default, contrast o dark.

Ejemplo

El código para la solicitud de invocación inicial se proporciona en el ejemplo siguiente:

{
  "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"

Propiedades de actividad de carga cuando se invoca un cuadro de diálogo desde el chat 1:1

Las propiedades de la actividad de carga cuando se invoca un cuadro de diálogo desde el chat 1:1 se enumeran de la siguiente manera:

Nombre de propiedad Objetivo
type Tipo de solicitud. Debe ser invoke.
name Tipo de comando que se emite para el servicio. Debe ser composeExtension/fetchTask.
from.id Id. del usuario que envió la solicitud.
from.name Nombre del usuario que envió la solicitud.
from.aadObjectId Microsoft Entra identificador de objeto del usuario que envió la solicitud.
channelData.tenant.id Microsoft Entra identificador de inquilino.
channelData.source.name Nombre de origen desde el que se invoca el cuadro de diálogo.
ChannelData.legacy. replyToId Obtiene o establece el identificador del mensaje para el que este mensaje es una respuesta.
value.commandId Contiene el identificador del comando que se invocó.
value.commandContext Contexto que desencadenó el evento. Debe ser compose.
value.context.theme El tema de cliente del usuario, útil para el formato de vista web incrustada. Debe ser default, contrast o dark.

Ejemplo

Las propiedades de la actividad de carga cuando se invoca un cuadro de diálogo desde el chat 1:1 se proporcionan en el ejemplo siguiente:

{
  "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"
}

Propiedades de actividad de carga cuando se invoca un cuadro de diálogo desde un chat de grupo

Las propiedades de la actividad de carga cuando se invoca un cuadro de diálogo desde un chat de grupo se enumeran de la siguiente manera:

Nombre de propiedad Objetivo
type Tipo de solicitud. Debe ser invoke.
name Tipo de comando que se emite para el servicio. Debe ser composeExtension/fetchTask.
from.id Id. del usuario que envió la solicitud.
from.name Nombre del usuario que envió la solicitud.
from.aadObjectId Microsoft Entra identificador de objeto del usuario que envió la solicitud.
channelData.tenant.id Microsoft Entra identificador de inquilino.
channelData.source.name Nombre de origen desde el que se invoca el cuadro de diálogo.
ChannelData.legacy. replyToId Obtiene o establece el identificador del mensaje para el que este mensaje es una respuesta.
value.commandId Contiene el identificador del comando que se invocó.
value.commandContext Contexto que desencadenó el evento. Debe ser compose.
value.context.theme El tema de cliente del usuario, útil para el formato de vista web incrustada. Debe ser default, contrast o dark.

Ejemplo

Las propiedades de la actividad de carga cuando se invoca un cuadro de diálogo desde un chat de grupo se proporcionan en el ejemplo siguiente:

{
  "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"
}

Propiedades de actividad de carga cuando se invoca un cuadro de diálogo desde un chat de reunión

Las propiedades de la actividad de carga cuando se invoca un cuadro de diálogo desde un chat de reunión se proporcionan en el ejemplo siguiente:

{
   "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",
}

Propiedades de actividad de carga cuando se invoca un cuadro de diálogo desde un canal (nueva publicación)

Las propiedades de la actividad de carga cuando se invoca un cuadro de diálogo desde un canal (nueva publicación) se enumeran de la siguiente manera:

Nombre de propiedad Objetivo
type Tipo de solicitud. Debe ser invoke.
name Tipo de comando que se emite para el servicio. Debe ser composeExtension/fetchTask.
from.id Id. del usuario que envió la solicitud.
from.name Nombre del usuario que envió la solicitud.
from.aadObjectId Microsoft Entra identificador de objeto del usuario que envió la solicitud.
channelData.tenant.id Microsoft Entra identificador de inquilino.
channelData.channel.id Id. de canal (si la solicitud se realizó en un canal).
channelData.team.id Id. de equipo (si la solicitud se realizó en un canal).
channelData.source.name Nombre de origen desde el que se invoca el cuadro de diálogo.
ChannelData.legacy. replyToId Obtiene o establece el identificador del mensaje para el que este mensaje es una respuesta.
value.commandId Contiene el identificador del comando que se invocó.
value.commandContext Contexto que desencadenó el evento. Debe ser compose.
value.context.theme El tema de cliente del usuario, útil para el formato de vista web incrustada. Debe ser default, contrasto dark.

Ejemplo

Las propiedades de la actividad de carga cuando se invoca un cuadro de diálogo desde un canal (nueva publicación) se proporcionan en el ejemplo siguiente:

{
  "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"
}

Propiedades de actividad de carga cuando se invoca un cuadro de diálogo desde un canal (respuesta al subproceso)

Las propiedades de actividad de carga cuando se invoca un cuadro de diálogo desde un canal (respuesta al subproceso) se enumeran de la siguiente manera:

Nombre de propiedad Objetivo
type Tipo de solicitud. Debe ser invoke.
name Tipo de comando que se emite para el servicio. Debe ser composeExtension/fetchTask.
from.id Id. del usuario que envió la solicitud.
from.name Nombre del usuario que envió la solicitud.
from.aadObjectId Microsoft Entra identificador de objeto del usuario que envió la solicitud.
channelData.tenant.id Microsoft Entra identificador de inquilino.
channelData.channel.id Id. de canal (si la solicitud se realizó en un canal).
channelData.team.id Id. de equipo (si la solicitud se realizó en un canal).
channelData.source.name Nombre de origen desde el que se invoca el cuadro de diálogo.
ChannelData.legacy. replyToId Obtiene o establece el identificador del mensaje para el que este mensaje es una respuesta.
value.commandId Contiene el identificador del comando que se invocó.
value.commandContext Contexto que desencadenó el evento. Debe ser compose.
value.context.theme El tema de cliente del usuario, útil para el formato de vista web incrustada. Debe ser default, contrast o dark.

Ejemplo

Las propiedades de la actividad de carga cuando se invoca un cuadro de diálogo desde un canal (respuesta al subproceso) se proporcionan en el ejemplo siguiente:

{
  "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"
}

Propiedades de actividad de carga cuando se invoca un cuadro de diálogo desde un cuadro de comando

Las propiedades de la actividad de carga cuando se invoca un cuadro de diálogo desde un cuadro de comando se enumeran de la siguiente manera:

Nombre de propiedad Objetivo
type Tipo de solicitud. Debe ser invoke.
name Tipo de comando que se emite para el servicio. Debe ser composeExtension/fetchTask.
from.id Id. del usuario que envió la solicitud.
from.name Nombre del usuario que envió la solicitud.
from.aadObjectId Microsoft Entra identificador de objeto del usuario que envió la solicitud.
channelData.tenant.id Microsoft Entra identificador de inquilino.
channelData.source.name Nombre de origen desde el que se invoca el cuadro de diálogo.
value.commandId Contiene el identificador del comando que se invocó.
value.commandContext Contexto que desencadenó el evento. Debe ser compose.
value.context.theme El tema de cliente del usuario, útil para el formato de vista web incrustada. Debe ser default, contrasto dark.

Ejemplo

Las propiedades de la actividad de carga cuando se invoca un cuadro de diálogo desde un cuadro de comando se proporcionan en el ejemplo siguiente:

{
  "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"
}

Ejemplo

La siguiente sección de código es un ejemplo de solicitud fetchTask:

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

Solicitud de invocación inicial de un mensaje

Cuando se invoca el bot desde un mensaje, el value objeto de la solicitud de invocación inicial debe contener los detalles del mensaje desde el que se invoca la extensión de mensaje. Las matrices reactions y mentions son opcionales y no están presentes si no hay reacciones ni menciones en el mensaje original. La sección siguiente es un ejemplo del 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 a fetchTask

Responda a la solicitud de invocación con un objeto task que contenga un objeto taskInfo con la tarjeta adaptable o la dirección URL web, o un mensaje de cadena simple.

Nombre de propiedad Objetivo
type Puede ser continue para presentar un formulario o message para un elemento emergente simple.
value Un objeto taskInfo para un formulario o un string para un mensaje.

El esquema del objeto taskInfo es:

Nombre de propiedad Objetivo
title Título del cuadro de diálogo.
height Debe ser un entero (en píxeles) o small, medium, large.
width Debe ser un entero (en píxeles) o small, medium, large.
card Tarjeta adaptable que define el formulario (si usa uno).
url Dirección URL que se va a abrir dentro del cuadro de diálogo como una vista web incrustada.
fallbackUrl Si un cliente no admite la característica de diálogo, esta dirección URL se abre en una pestaña del explorador.

Responder a fetchTask con una tarjeta adaptable

Al usar una tarjeta adaptable, debe responder con un task objeto con el value objeto que contiene una tarjeta adaptable.

Ejemplo

La siguiente sección de código es un ejemplo de fetchTask respuesta con una tarjeta adaptable:

En este ejemplo se usa el paquete NuGet AdaptiveCards además del SDK de 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;
}

Creación de un cuadro de diálogo con una vista web incrustada

Al usar una vista web incrustada, debe responder con un objeto task con el objeto value que contiene la dirección URL del formulario web que desea cargar. Los dominios de cualquier dirección URL que quiera cargar deben incluirse en la matriz validDomains del manifiesto de la aplicación. Para obtener más información sobre cómo compilar la vista web incrustada, consulte la documentación del cuadro 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;
}

Solicitud para instalar el bot conversacional

Si la aplicación contiene un bot conversacional, instale el bot en la conversación y, a continuación, cargue el cuadro de diálogo. El bot es útil para obtener contexto adicional para el cuadro de diálogo. Un ejemplo de este escenario es capturar la lista para rellenar un control selector de personas o la lista de canales de un equipo.

Cuando la extensión de mensaje recibe la invocación de composeExtensions/fetchTask, compruebe si el bot está instalado en el contexto actual para facilitar el flujo. Por ejemplo, compruebe el flujo con una llamada de obtención de lista de participantes. Si el bot no está instalado, devuelva una tarjeta adaptable con una acción que solicite al usuario que instale el bot. El usuario debe tener permiso para instalar las aplicaciones en esa ubicación para la comprobación. Si la instalación de la aplicación no se realiza correctamente, el usuario recibe un mensaje para ponerse en contacto con el administrador.

Ejemplo

La siguiente sección de código es un ejemplo de la respuesta:

{
  "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"
}

Después de la instalación del bot conversacional, recibe otro mensaje de invocación con name = composeExtensions/submitAction, y value.data.msteams.justInTimeInstall = true.

Ejemplo

La siguiente sección de código es un ejemplo de la respuesta de la tarea a la invocación:

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

La respuesta de la tarea a la invocación debe ser similar a la del bot instalado.

Ejemplo

La siguiente sección de código es un ejemplo de instalación cuando es necesario de la aplicación con tarjeta adaptable:

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;
        }

Ejemplo de código

Ejemplo de nombre Descripción .NET Node.js Python Manifiesto
Acción de extensión de mensaje de Teams En este ejemplo se muestra cómo definir comandos de acción, crear cuadros de diálogo y responder a la acción de envío del cuadro de diálogo. View View View View
Vista previa de la acción de extensión de mensaje En este ejemplo se muestra cómo usar la versión preliminar de la acción en Extensiones de mensajería mediante Bot Framework v4. View View ND View
Búsqueda de extensión de mensaje de Teams En este ejemplo se muestra cómo crear una extensión de mensaje basada en Búsqueda. Busca paquetes nudget y muestra los resultados en la extensión de mensajería basada en búsquedas. View View View View

Paso siguiente

Vea también