Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Invocar cuadros de diálogo (denominados módulos de tareas en TeamsJS v1.x) desde bots de Microsoft Teams mediante TaskFetchAction botones en tarjetas adaptables. Los diálogos proporcionan una interacción centrada abriendo una ventana emergente para el usuario, lo que los hace ideales para formularios complejos o flujos de trabajo de varios pasos.
Hay dos maneras de invocar diálogos:
- Un nuevo mensaje
task/fetchde invocación: el uso de laAction.Executeacción de tarjeta para tarjetas adaptables contask/fetch, ya sea un cuadro de diálogo basado en HTML o una tarjeta adaptable se captura dinámicamente desde el bot. - Direcciones URL de vínculo profundo: con la sintaxis de vínculo profundo para los diálogos, puede usar la
Action.OpenUrlacción de tarjeta para tarjetas adaptables. Con las direcciones URL de vínculo profundo, ya se sabe que la dirección URL del cuadro de diálogo o el cuerpo de la tarjeta adaptable evitan un recorrido de ida y vuelta del servidor en relación contask/fetch.
Importante
Cada url y fallbackUrl debe implementar el protocolo de encriptación HTTPS.
Nota:
En el cliente v1 de Teams, los cuadros de diálogo se denominaban módulos de tareas. En ocasiones, se pueden usar como sinónimos.
Creación de un iniciador de diálogo
Para invocar un cuadro de diálogo desde un bot, envíe una tarjeta adaptable con TaskFetchAction botones. Cada botón incluye datos que el bot usa para determinar qué contenido de diálogo devolver.
Advertencia
Los servicios en la nube de Microsoft, incluidas las versiones web de los dominios de Teams, Outlook y Microsoft 365, se migran al *.cloud.microsoft dominio. Realice los pasos siguientes tan pronto como sea posible para asegurarse de que la aplicación continúa representándose en los hosts de cliente web de Microsoft 365 admitidos:
Actualice la biblioteca TeamsJS a v.2.19.0 o posterior. Debe llamar
microsoftTeams.app.initialize()a para evitar ver una advertencia en el nuevo dominio. Para obtener más información sobre la versión más reciente de TeamsJS, consulte Biblioteca cliente JavaScript de Microsoft Teams.Si ha definido encabezados de directiva de seguridad de contenido (CSP) para la aplicación, actualice la directiva frame-ancestors para incluir el
*.cloud.microsoftdominio. Para garantizar la compatibilidad con versiones anteriores durante la migración, conserve los valores existentesframe-ancestorsen los encabezados de CSP. Este enfoque garantiza que la aplicación sigue funcionando en aplicaciones host de Microsoft 365 existentes y futuras y minimiza la necesidad de cambios posteriores.
Actualice el dominio siguiente en la frame-ancestors directiva de los encabezados de CSP de la aplicación:
https://*.cloud.microsoft
En los pasos siguientes se proporcionan instrucciones sobre cómo invocar un cuadro de diálogo (denominado módulo de tareas en TeamsJS v1.x) mediante task/fetch:
Esta imagen muestra una tarjeta adaptable con una acción Comprar
Action.Executetarjeta. El valor de latypepropiedad estask/fetchy el resto deldataobjeto puede ser de su elección.El bot recibe una
card.actionactividad. En el SDK de Teams, se controla mediante elOnAdaptiveCardActioncontrolador . Para obtener más información, vea Ejecución de acciones.El bot crea un
ActionResponseobjeto y lo devuelve. Para obtener más información sobre el esquema de las respuestas, consulte la explicación sobre la tarea o el envío. El código siguiente proporciona un ejemplo del cuerpo de la respuesta que contiene un objeto TaskInfo incrustado en un objeto contenedor:{ "task": { "type": "continue", "value": { "title": "Task module title", "height": 500, "width": "medium", "url": "https://contoso.com/msteams/taskmodules/newcustomer", "fallbackUrl": "https://contoso.com/msteams/taskmodules/newcustomer" } } }El
task/fetchevento y su respuesta para los bots es similar a lamicrosoftTeams.tasks.startTask()función de la biblioteca cliente JavaScript de Microsoft Teams (TeamsJS).Microsoft Teams muestra el cuadro de diálogo.
En la sección siguiente se proporcionan detalles sobre el envío del resultado de un cuadro de diálogo.
Enviar el resultado de un cuadro de diálogo
Cuando el usuario termina con el cuadro de diálogo, el resultado se envía de vuelta a la aplicación. El funcionamiento del envío depende del tipo de contenido del cuadro de diálogo:
-
Tarjeta adaptable (TaskInfo.card): cuando el usuario selecciona un
Action.Submitbotón, Teams envía un evento de envío de cuadro de diálogo a la aplicación. El controlador de envío del cuadro de diálogo recibe los datos del formulario de la tarjeta. En C#, use el[TaskSubmit]atributo . En TypeScript, useapp.on('dialog.submit', ...). En Python, use@app.on_dialog_submit. -
Página web (TaskInfo.url): la página web llama
microsoftTeams.tasks.submitTask(formData)a desde la biblioteca cliente de TeamsJS, lo que desencadena el mismo evento de envío de cuadro de diálogo en la aplicación.
Controlar eventos de envío de cuadros de diálogo
Cuando el usuario envía un cuadro de diálogo, el bot recibe un mensaje de task/submit invocación. Tiene varias opciones al responder:
| Tipo de respuesta | Escenario |
|---|---|
| Sin respuesta | La respuesta más sencilla es no responder. El bot no es necesario para responder cuando el usuario termina con el cuadro de diálogo. |
MessageTask |
Teams muestra un mensaje en un cuadro de mensaje emergente en el cuadro de diálogo. |
ContinueTask |
Permite encadenar secuencias de tarjetas adaptables en una experiencia de asistente o de varios pasos. |
En las pestañas siguientes se muestra cómo controlar los eventos de envío de cuadros de diálogo en .NET, TypeScript y Python:
using System.Text.Json;
using Microsoft.Teams.Api.TaskModules;
using Microsoft.Teams.Apps;
using Microsoft.Teams.Apps.Activities.Invokes;
using Microsoft.Teams.Apps.Annotations;
using Microsoft.Teams.Common.Logging;
[TaskSubmit]
public async Task<Microsoft.Teams.Api.TaskModules.Response> OnTaskSubmit([Context] Tasks.SubmitActivity activity, [Context] IContext.Client client, [Context] ILogger log)
{
var data = activity.Value?.Data as JsonElement?;
if (data == null)
{
log.Info("[TASK_SUBMIT] No data found in the activity value");
return new Microsoft.Teams.Api.TaskModules.Response(
new Microsoft.Teams.Api.TaskModules.MessageTask("No data found in the activity value"));
}
var submissionType = data.Value.TryGetProperty("submissiondialogtype", out var submissionTypeObj) && submissionTypeObj.ValueKind == JsonValueKind.String
? submissionTypeObj.ToString()
: null;
string? GetFormValue(string key)
{
if (data.Value.TryGetProperty(key, out var val))
{
if (val is JsonElement element)
return element.GetString();
return val.ToString();
}
return null;
}
switch (submissionType)
{
case "simple_form":
var name = GetFormValue("name") ?? "Unknown";
await client.Send($"Hi {name}, thanks for submitting the form!");
return new Microsoft.Teams.Api.TaskModules.Response(
new Microsoft.Teams.Api.TaskModules.MessageTask("Form was submitted"));
default:
return new Microsoft.Teams.Api.TaskModules.Response(
new Microsoft.Teams.Api.TaskModules.MessageTask("Unknown submission type"));
}
}
Encadenamiento de diálogos de varios pasos
Puede encadenar tarjetas adaptables en un asistente de varios pasos devolviendo una ContinueTask respuesta del controlador de envío. Cada paso devuelve una nueva tarjeta y el paso final devuelve un MessageTask para cerrar el cuadro de diálogo.
using System.Text.Json;
using Microsoft.Teams.Api;
using Microsoft.Teams.Api.TaskModules;
using Microsoft.Teams.Cards;
// Add these cases to your OnTaskSubmit method
case "webpage_dialog_step_1":
var nameStep1 = GetFormValue("name") ?? "Unknown";
var nextStepCardJson = $$"""
{
"type": "AdaptiveCard",
"version": "1.4",
"body": [
{
"type": "TextBlock",
"text": "Email",
"size": "Large",
"weight": "Bolder"
},
{
"type": "Input.Text",
"id": "email",
"label": "Email",
"placeholder": "Enter your email",
"isRequired": true
}
],
"actions": [
{
"type": "Action.Submit",
"title": "Submit",
"data": {"submissiondialogtype": "webpage_dialog_step_2", "name": "{{nameStep1}}"}
}
]
}
""";
var nextStepCard = JsonSerializer.Deserialize<AdaptiveCard>(nextStepCardJson)
?? throw new InvalidOperationException("Failed to deserialize next step card");
var nextStepTaskInfo = new TaskInfo
{
Title = $"Thanks {nameStep1} - Get Email",
Card = new Attachment
{
ContentType = new ContentType("application/vnd.microsoft.card.adaptive"),
Content = nextStepCard
}
};
return new Response(new ContinueTask(nextStepTaskInfo));
case "webpage_dialog_step_2":
var nameStep2 = GetFormValue("name") ?? "Unknown";
var emailStep2 = GetFormValue("email") ?? "No email";
await client.Send($"Hi {nameStep2}, thanks for submitting the form! We got that your email is {emailStep2}");
return new Response(new MessageTask("Multi-step form completed successfully"));
Acciones de tarjeta de Bot Framework vs. Acciones de tarjeta adaptable. Enviar acciones
El esquema de las acciones de tarjeta de Bot Framework es diferente de las acciones de tarjeta Action.Submit adaptable y la manera de invocar diálogos también es diferente. El data objeto de Action.Submit contiene un msteams objeto para que no interfiera con otras propiedades de la tarjeta. La siguiente tabla muestra un ejemplo de cada acción de la tarjeta:
| Acción de la tarjeta de Bot Framework | Acción de tarjeta adaptable. Enviar acción |
|---|---|
{ |
{ |
Ejemplo de código
| Ejemplo de nombre | Descripción | .NET | Node.js | Manifiesto | Python |
|---|---|---|---|---|---|
| Bots de ejemplo de cuadro de diálogo-V4 | Esta aplicación de ejemplo muestra cómo usar diálogos (denominados módulos de tareas en TeamsJS v1.x) mediante Bot Framework v4. | View | View | ND | Ver |