Crear y enviar el módulo de tareas

Importante

Los ejemplos de código de esta sección se basan en las versiones 4.6 y 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 el módulo de tareas mediante una tarjeta adaptable o una vista web insertada. Para crear un módulo de tareas, debe realizar el proceso denominado solicitud de invocación inicial. En este documento se trata la solicitud de invocación inicial, las propiedades de actividad de carga cuando se invoca un módulo de tareas desde el chat 1:1, el chat de grupo, el canal (nueva publicación), el canal (responder al subproceso) y el cuadro de comandos.

Nota:

Si no va a rellenar el módulo de tareas con parámetros definidos en el manifiesto de la aplicación, debe crear el módulo de tareas para los usuarios con una tarjeta adaptable o una vista web insertada.

La solicitud de invocación inicial

En el proceso de la solicitud de invocación inicial, el servicio recibe un objeto Activity de tipo composeExtension/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 Id de objeto Azure Active Directory identificador del usuario que envió la solicitud.
channelData.tenant.id Identificador del inquilino de Azure Active Directory
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 módulo de tareas desde el chat 1:1

Las propiedades de actividad de carga cuando se invoca un módulo de tareas desde el chat 1:1 se muestran 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 Id de objeto Azure Active Directory identificador del usuario que envió la solicitud.
channelData.tenant.id Identificador del inquilino de Azure Active Directory
channelData.source.name Nombre de origen desde el que se invoca el módulo de tareas.
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 actividad de carga cuando se invoca un módulo de tareas 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 módulo de tareas desde un chat de grupo

Las propiedades de actividad de carga cuando se invoca un módulo de tareas desde un chat grupal 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 Id de objeto Azure Active Directory identificador del usuario que envió la solicitud.
channelData.tenant.id Identificador del inquilino de Azure Active Directory
channelData.source.name Nombre de origen desde el que se invoca el módulo de tareas.
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 actividad de carga cuando se invoca un módulo de tareas desde un chat grupal 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 módulo de tareas desde un chat de reunión

Las propiedades de la actividad de carga cuando se invoca un módulo de tareas 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 módulo de tareas desde un canal (nueva publicación)

Las propiedades de la actividad de carga cuando se invoca un módulo de tareas 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 Id de objeto Azure Active Directory identificador del usuario que envió la solicitud.
channelData.tenant.id Identificador del inquilino de Azure Active Directory
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 módulo de tareas.
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 módulo de tareas 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 módulo de tareas desde un canal (respuesta al subproceso)

Las propiedades de actividad de carga cuando se invoca un módulo de tareas 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 Id de objeto Azure Active Directory identificador del usuario que envió la solicitud.
channelData.tenant.id Identificador del inquilino de Azure Active Directory
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 módulo de tareas.
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 módulo de tareas 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 módulo de tareas desde un cuadro de comandos

Las propiedades de la actividad de carga cuando se invoca un módulo de tareas 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 Id de objeto Azure Active Directory identificador del usuario que envió la solicitud.
channelData.tenant.id Identificador del inquilino de Azure Active Directory
channelData.source.name Nombre de origen desde el que se invoca el módulo de tareas.
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 módulo de tareas 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 módulo de tareas.
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 se usa uno).
url Dirección URL que se va a abrir dentro del módulo de tareas como una vista web incrustada.
fallbackUrl Si un cliente no admite la función del módulo de tareas, 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 objeto task con el objeto value que contiene una tarjeta adaptable.

Ejemplo

La siguiente sección de código es un ejemplo para respuesta fetchTask 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 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;
}

Creación de un módulo de tareas con una vista web insertada

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 insertada, consulte la documentación del módulo de tareas.

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

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 módulo de tareas. El bot es útil para obtener contexto adicional para el módulo de tareas. 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 composeExtension/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 = composeExtension/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
Acción de extensión de mensaje de Teams Describe cómo definir comandos de acción, crear módulo de tareas y responder a la acción de envío del módulo de tareas. View View View
Búsqueda de extensión de mensaje de Teams Describe cómo definir comandos de búsqueda y responder a búsquedas. View View View

Paso siguiente

Consulte también