Initier des actions à l’aide des extensions de messagerieInitiate actions with messaging extensions

Important

Les Articles de cette section sont basés sur le kit de développement logiciel (SDK) de l’infrastructure de robots v3.The articles in this section are based on the v3 Bot Framework SDK. Si vous recherchez de la documentation actuelle (version 4,6 ou version ultérieure du kit de développement logiciel (SDK)), consultez la section interactions orientées tâches avec les extensions de messagerie .If you're looking for current documentation (version 4.6 or later version of the SDK) see the Task-oriented interactions with Messaging Extensions section.

Les extensions de messagerie basées sur les actions permettent à vos utilisateurs de déclencher des actions dans des services externes dans Teams.Action-based messaging extensions allow your users to trigger actions in external services while inside of Teams.

Exemple de carte d’extension de messagerie

Les sections suivantes décrivent la procédure à suivre.The following sections describe how to do this.

Ajouter une extension de messagerie à votre applicationAdd a messaging extension to your app

Une extension de messagerie est un service hébergé sur le Cloud qui écoute les demandes des utilisateurs et répond avec des données structurées, telles qu’une carte.A messaging extension is a cloud-hosted service that listens to user requests and responds with structured data, such as a card. Vous intégrez votre service à Microsoft teams via Activity les objets de l’infrastructure bot.You integrate your service with Microsoft Teams via Bot Framework Activity objects. Nos extensions .NET et node. js pour le kit de développement logiciel (SDK) du générateur de robots peuvent vous aider à ajouter la fonctionnalité d’extension de messagerie à votre application.Our .NET and Node.js extensions for the Bot Builder SDK can help you add messaging extension functionality to your app.

Diagramme du flux de messages pour les extensions de messagerie

Inscription dans l’infrastructure de robotRegister in the Bot Framework

Si vous ne l’avez pas déjà fait, vous devez tout d’abord inscrire un bot auprès de Microsoft bot Framework.If you haven’t done so already, you must first register a bot with the Microsoft Bot Framework. L’ID de l’application Microsoft et les points de terminaison de rappel de votre robot, tels qu’ils sont définis, seront utilisés dans votre extension de messagerie pour recevoir et répondre aux demandes des utilisateurs.The Microsoft app ID and callback endpoints for your bot, as defined there, will be used in your messaging extension to receive and respond to user requests. N’oubliez pas d’activer le canal Microsoft teams pour votre robot.Remember to enable the Microsoft Teams channel for your bot.

Enregistrer l’ID de votre application bot et le mot de passe de l’application, vous devez fournir l’ID de l’application dans le manifeste de votre application.Record your bot app ID and app password, you will need to supply the app ID in your app manifest.

Mettre à jour le manifeste de votre applicationUpdate your app manifest

Comme avec les robots et les onglets, vous mettez à jour le manifeste de votre application pour inclure les propriétés d’extension de messagerie.As with bots and tabs, you update the manifest of your app to include the messaging extension properties. Ces propriétés déterminent la façon dont votre extension de messagerie apparaît et se comporte dans le client Microsoft Teams.These properties govern how your messaging extension appears and behaves in the Microsoft Teams client. Les extensions de messagerie sont prises en charge à partir de la version 1.0 du manifeste.Messaging extensions are supported beginning with v1.0 of the manifest.

Déclarer votre extension de messagerieDeclare your messaging extension

Pour ajouter une extension de messagerie, incluez une nouvelle structure JSON de niveau supérieur dans votre manifeste composeExtensions avec la propriété.To add a messaging extension, include a new top-level JSON structure in your manifest with the composeExtensions property. Actuellement, vous êtes limité à la création d’une extension de messagerie unique pour votre application.Currently, you are limited to creating a single messaging extension for your app.

Notes

Le manifeste fait référence aux extensions de composeExtensionsmessagerie en tant que.The manifest refers to messaging extensions as composeExtensions. Cela permet de conserver une compatibilité descendante.This is to maintain backward compatibility.

La définition d’extension est un objet de la structure suivante :The extension definition is an object that has the following structure:

Nom de la propriétéProperty name ObjectifPurpose Obligatoire ?Required?
botId ID d’application Microsoft unique pour le bot enregistré avec l’infrastructure bot.The unique Microsoft app ID for the bot as registered with the Bot Framework. Il doit en principe être identique à l’ID de votre application globale de teams.This should typically be the same as the ID for your overall Teams app. OuiYes
scopes Tableau déclarant si cette extension peut être ajoutée à personal ou team des étendues (ou les deux).Array declaring whether this extension can be added to personal or team scopes (or both). OuiYes
canUpdateConfiguration Active l’élément de menu paramètres .Enables Settings menu item. NonNo
commands Tableau de commandes pris en charge par cette extension de messagerie.Array of commands that this messaging extension supports. Vous êtes limité à 10 commandes.You are limited to 10 commands. OuiYes

Définir des commandesDefine commands

Votre extension de messagerie doit déclarer une commande, qui apparaît lorsque l’utilisateur sélectionne votre application dans le bouton autres options () de la zone de composition.Your messaging extension should declare one command, which appears when the user selects your app from the More options () button in the compose box.

Capture d’écran de la liste des extensions de messagerie dans teams

Dans le manifeste de l’application, votre élément de commande est un objet de la structure suivante :In the app manifest, your command item is an object with the following structure:

Nom de la propriétéProperty name ObjectifPurpose Obligatoire ?Required? Version de manifeste minimaleMinimum manifest version
id ID unique que vous affectez à cette commande.Unique ID that you assign to this command. La demande de l’utilisateur contiendra cet ID.The user request will include this ID. OuiYes 1.01.0
title Nom de la commande.Command name. Cette valeur apparaît dans l’interface utilisateur.This value appears in the UI. OuiYes 1.01.0
description Texte d’aide indiquant la signification de cette commande.Help text indicating what this command does. Cette valeur apparaît dans l’interface utilisateur.This value appears in the UI. OuiYes 1.01.0
type Définir le type de commande.Set the type of command. Les valeurs possibles sont query et action.Possible values include query and action. Si elle n’est pas présente, la valeur par défaut est définie surqueryIf not present the default value is set to query NonNo 1.41.4
initialRun Paramètre facultatif, utilisé avec query les commandes.Optional parameter, used with query commands. Si la valeur est définie sur true, cette commande doit être exécutée dès que l’utilisateur choisit cette commande dans l’interface utilisateur.If set to true, indicates this command should be executed as soon as the user chooses this command in the UI. NonNo 1.01.0
fetchTask Paramètre facultatif, utilisé avec action les commandes.Optional parameter, used with action commands. Affectez à cet argument la valeur true pour extraire la carte adaptative ou l’URL Web à afficher dans le module de tâches.Set to true to fetch the adaptive card or web url to display within the task module. Elle est utilisée lorsque les entrées de la action commande sont dynamiques par opposition à un ensemble statique de paramètres.This is used when the inputs to the action command is dynamic as opposed to a static set of parameters. Notez que si la liste de paramètres statiques de la commande est définie sur true , elle est ignorée.Note that the if set to true the static parameter list for the command is ignored NonNo 1.41.4
parameters Liste statique des paramètres de la commande.Static list of parameters for the command. OuiYes 1.01.0
parameter.name Le nom du paramètre.The name of the parameter. Cette adresse est envoyée à votre service dans la demande de l’utilisateur.This is sent to your service in the user request. OuiYes 1.01.0
parameter.description Décrit ce paramètre ou un exemple de la valeur qui doit être fournie.Describes this parameter’s purposes or example of the value that should be provided. Cette valeur apparaît dans l’interface utilisateur.This value appears in the UI. OuiYes 1.01.0
parameter.title Titre de paramètre court convivial ou étiquette.Short user-friendly parameter title or label. OuiYes 1.01.0
parameter.inputType Défini sur le type d’entrée requis.Set to the type of input required. Les valeurs possibles textsont textarea, number, date, time, toggleet.Possible values include text, textarea, number, date, time, toggle. La valeur par défaut est définie surtextDefault is set to text NonNo 1.41.4
context Tableau facultatif de valeurs qui définit le contexte dans lequel l’action de message est disponible.Optional array of values that defines the context the message action is available in. Les valeurs possibles messagesont compose, ou commandBox.Possible values are message, compose, or commandBox. La valeur par défaut est ["compose", "commandBox"].Default is ["compose", "commandBox"]. NonNo 1,51.5

Extensions de message de type d’actionAction type message extensions

Pour initier des actions à partir d’une extension de messagerie, définissez le type paramètre sur action .To initiate actions from a messaging extension set the type parameter to action. Voici un exemple de manifeste avec une recherche et une commande Create.Below is an example of a manifest with a search and a create command. Une extension de messagerie unique peut comporter jusqu’à 10 commandes différentes.A single messaging extension can have up to 10 different commands. Il peut s’agir de plusieurs commandes de recherche et de commandes basées sur une action.This can include both multiple search and multiple action-based commands.

Exemple de manifeste d’application completComplete app manifest example

{
  "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.7/MicrosoftTeams.schema.json",
  "manifestVersion": "1.5",
  "version": "1.0",
  "id": "57a3c29f-1fc5-4d97-a142-35bb662b7b23",
  "packageName": "com.microsoft.teams.samples.Todo",
  "developer": {
    "name": "John Developer",
    "websiteUrl": "http://todobotservice.azurewebsites.net/",
    "privacyUrl": "http://todobotservice.azurewebsites.net/privacy",
    "termsOfUseUrl": "http://todobotservice.azurewebsites.net/termsofuse"
  },
  "name": {
    "short": "To Do",
    "full": "To Do"
  },
  "description": {
    "short": "Find or create a new task in To Do",
    "full": "Find or create a new task in To Do"
  },
  "icons": {
    "outline": "todo-outline.jpg",
    "color": "todo-color.jpg"
  },
  "accentColor": "#ff6a00",
  "composeExtensions": [
    {
      "botId": "57a3c29f-1fc5-4d97-a142-35bb662b7b23",
      "canUpdateConfiguration": true,
      "commands": [
        {
          "id": "searchCmd",
          "description": "Search you Todo's",
          "title": "Search",
          "initialRun": true,
          "context": ["commandBox", "compose"],
          "parameters": [
            {
              "name": "searchKeyword",
              "description": "Enter your search keywords",
              "title": "Keywords"
            }
          ]
        },
        {
          "id": "addTodo",
          "description": "Create a To Do item",
          "title": "Create To Do",
          "type": "action",
          "context": ["commandBox", "message", "compose"],
          "parameters": [
            {
              "name": "Name",
              "description": "To Do Title",
              "title": "Title",
              "inputType": "text"
            },
            {
              "name": "Description",
              "description": "Description of the task",
              "title": "Description",
              "inputType": "textarea"
            },
            {
              "name": "Date",
              "description": "Due date for the task",
              "title": "Date",
              "inputType": "date"
            }
          ]
        },
        {
          "id": "reassignTodo",
          "description": "Reassign a todo item",
          "title": "Reassign a todo item",
          "type": "action",
          "fetchTask": true,
          "parameters": [
            {
              "name": "Name",
              "title": "Title"
            }
          ]
        }
      ]
    }
  ],
  "permissions": [
    "identity",
    "messageTeamMembers"
  ],
  "validDomains": [
    "todobotservice.azurewebsites.net",
    "*.todobotservice.azurewebsites.net"
  ]
}

Initier des actions à partir de messagesInitiate actions from messages

En plus d’initier des actions à partir de la zone de message de composition, vous pouvez également utiliser votre extension de messagerie pour initier une action à partir d’un message.In addition to initiating actions from the compose message area, you can also use your messaging extension to initiate an action from a message. Cela vous permettra d’envoyer le contenu du message à votre bot à des fins de traitement et, si vous le souhaitez, de répondre à ce message avec une réponse en utilisant la méthode décrite dans réponse à envoyer.This will allow you to send the contents of the message to your bot for processing, and optionally reply to that message with a response using the method described in Responding to submit. La réponse est insérée en tant que réponse au message que vos utilisateurs peuvent modifier avant de les envoyer.The response will be inserted as a reply to the message that your users can edit before submitting. Vos utilisateurs peuvent accéder à votre extension de messagerie à partir du menu de dépassement de capacité ... , puis en sélectionnant Take action comme dans l’image ci-dessous.Your users can access your messaging extension from the overflow ... menu and then selecting Take action as in the image below.

Exemple d’initiation d’une action à partir d’un message

Pour permettre à votre extension de messagerie de fonctionner à partir d’un message, vous devez ajouter le context paramètre à l’objet de votre extension de messagerie commands dans votre manifeste de l’application, comme dans l’exemple ci-dessous.To enable your messaging extension to work from a message you'll need to add the context parameter to your messaging extension's commands object in your app manifest as in the example below. Les chaînes valides pour le context tableau sont "message" , "commandBox" et "compose" .Valid strings for the context array are "message", "commandBox", and "compose". La valeur par défaut est ["compose", "commandBox"].The default value is ["compose", "commandBox"]. Pour plus d’informations sur le paramètre, reportez-vous à la section define Commands context .See the define commands section for complete details on the context parameter.

"composeExtensions": [
  {
    "botId": "57a3c29f-1fc5-4d97-a142-35bb662b7b23",
    "canUpdateConfiguration": true,
    "commands": [
      {
        "id": "reassignTodo",
        "description": "Reassign a todo item",
        "title": "Create To Do",
        "type": "Action",
        "context": ["message"],
        "fetchTask": true
    }]
    ...

Vous trouverez ci-dessous un exemple de l' value objet contenant les détails du message qui seront envoyés dans le cadre de l’envoi de la composeExtension demande à votre bot.Below is an example of the value object containing the message details that will be sent as part of the composeExtension request be sent to your bot.

{
  "name": "composeExtension/submitAction",
  "type": "invoke",
...
  "value": {
    "commandId": "setReminder",
    "commandContext": "message",
    "messagePayload": {
      "id": "1111111111",
      "replyToId": null,
      "createdDateTime": "2019-02-25T21:29:36.065Z",
      "lastModifiedDateTime": null,
      "deleted": false,
      "subject": "Message subject",
      "summary": null,
      "importance": "normal",
      "locale": "en-us",
      "body": {
        "contentType": "html",
        "content": "this is the message"
    },
      "from": {
        "device": null,
        "conversation": null,
        "user": {
          "userIdentityType": "aadUser",
          "id": "wxyz12ab8-ab12-cd34-ef56-098abc123876",
          "displayName": "Jamie Smythe"
        },
        "application": null
      },
      "reactions": [
        {
          "reactionType": "like",
          "createdDateTime": "2019-02-25T22:40:40.806Z",
          "user": {
            "device": null,
            "conversation": null,
            "user": {
              "userIdentityType": "aadUser",
              "id": "qrst12346-ab12-cd34-ef56-098abc123876",
              "displayName": "Jim Brown"
            },
            "application": null
          }
        }
      ],
      "mentions": [
        {
          "id": 0,
          "mentionText": "Sarah",
          "mentioned": {
            "device": null,
            "conversation": null,
            "user": {
              "userIdentityType": "aadUser",
              "id": "ab12345678-ab12-cd34-ef56-098abc123876",
              "displayName": "Sarah"
            },
            "application": null
          }
        }
      ]
    }
  ...

Test via téléchargementTest via uploading

Vous pouvez tester votre extension de messagerie en téléchargeant votre application.You can test your messaging extension by uploading your app. Pour plus d’informations, consultez la rubrique téléchargement de votre application dans une équipe .See Uploading your app in a team for details.

Pour ouvrir votre extension de messagerie, accédez à l’une de vos conversations ou de vos canaux.To open your messaging extension, navigate to any of your chats or channels. Sélectionnez le bouton autres options () dans la zone de composition, puis choisissez votre extension de messagerie.Choose the More options () button in the compose box, and choose your messaging extension.

Collecte d’entrées auprès des utilisateursCollecting input from users

Il existe trois façons de collecter des informations auprès d’un utilisateur final dans Teams.There are three ways to collect information from an end user in Teams.

Liste de paramètres statiquesStatic parameter list

Dans cette méthode, tout ce que vous avez à faire est de définir une liste statique de paramètres dans le manifeste, comme indiqué ci-dessus dans la commande « créer une tâche ».In this method, all you need to do is define a static list of parameters in the manifest as shown above in the "Create To Do" command. Pour utiliser cette méthode, vérifiez que fetchTask la valeur est définie sur false et que vous définissez vos paramètres dans le manifeste.To use this method ensure fetchTask is set to false and that you define your parameters in the manifest.

Lorsqu’un utilisateur choisit une commande avec des paramètres statiques, teams génère un formulaire dans un module de tâches avec les paramètres définis dans le manifeste.When a user chooses a command with static parameters, Teams will generate a form in a Task Module with the parameters defined in the manifest. Lors de l’envoi d’un composeExtension/submitAction est envoyé au bot.On hitting Submit a composeExtension/submitAction is sent to the bot. Pour plus d’informations sur le jeu de réponses attendu, reportez-vous à la rubrique réponse à envoyer .See the topic Responding to submit for more information on the expected set of responses.

Entrée dynamique à l’aide d’une carte adaptativeDynamic input using an adaptive card

Dans cette méthode, votre service peut définir une carte adaptative personnalisée pour collecter l’entrée de l’utilisateur final.In this method, your service can define a custom adaptive card to collect the end user input. Pour cette approche, définissez le fetchTask paramètre sur true dans le manifeste.For this approach, set the fetchTask parameter to true in the manifest. Notez que si vous avez défini fetchTask sur true un paramètre statique défini pour la commande sera ignoré.Note that if you set fetchTask to true any static parameters defined for the command will be ignored.

Dans cette méthode, votre service reçoit un composeExtension/fetchTask événement et doit répondre avec une réponse de module de tâchebasée sur une carte adaptative.In this method your service will receive a composeExtension/fetchTask event and needs to respond with an adaptive card based task module response. Vous trouverez ci-dessous un exemple de réponse avec une carte adaptative :Below is an sample response with an adaptive card:

{
    "task": {
        "type": "continue",
        "value": {
            "card": {
                "contentType": "application/vnd.microsoft.card.adaptive",
                "content": {
                    "body": [
                        {
                            "type": "TextBlock",
                            "text": "Please enter the following information:"
                        },
                        {
                            "type": "TextBlock",
                            "text": "Name"
                        },
                        {
                            "type": "Input.Text",
                            "spacing": "None",
                            "title": "New Input.Toggle",
                            "placeholder": "Placeholder text"
                        },
                        {
                            "type": "TextBlock",
                            "text": "Date of birth"
                        },
                        {
                            "type": "Input.Date",
                            "spacing": "None",
                            "title": "New Input.Toggle"
                        }
                    ],
                    "type": "AdaptiveCard",
                    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
                    "version": "1.0"
                }
            }
        }
    }
}

Le bot peut également répondre avec une réponse auth/config si l’utilisateur doit authentifier ou configurer l’extension avant d’obtenir l’entrée de l’utilisateur.The bot can also respond with an auth/config response if the user needs to authenticate or configure the extension before getting the user input.

Entrée dynamique à l’aide d’une vue WebDynamic input using a web view

Dans cette méthode, votre service peut afficher un <iframe> widget basé pour afficher une interface utilisateur personnalisée et collecter les données entrées par l’utilisateur.In this method your service can show an <iframe> based widget to show any custom UI and collect user input. Pour cette approche, définissez le fetchTask paramètre sur true dans le manifeste.For this approach, set the fetchTask parameter to true in the manifest.

Tout comme dans le flux de carte adaptative votre service enverra un fetchTask événement et doit répondre par une réponse de module de tâchebasée sur une URL.Just like in the adaptive card flow your service will be send a fetchTask event and needs to respond with a URL based task module response. Vous trouverez ci-dessous un exemple de réponse avec une carte adaptative :Below is an sample response with an Adaptive card:

{
    "task": {
        "value": {
            "url": "http://mywebapp.com/input"
        },
        "type": "continue"
    }
}

Demande d’installation de votre bot de conversationRequest to install your conversational bot

Si votre application contient également un bot de conversation, il peut s’avérer nécessaire de vous assurer que votre bot est installé dans la conversation avant de charger votre module de tâches.If your app also contains a conversational bot, it may be necessary to ensure that your bot is installed in the conversation before loading your task module. Cela peut être utile dans les situations où vous devez obtenir un contexte supplémentaire pour le module de tâches.This can be useful in situations where you need to get additional context for you task module. Par exemple, il se peut que vous deviez extraire la liste pour remplir un contrôle sélecteur de personnes ou la liste des canaux d’une équipe.For example, you may need to fetch the roster to populate a people picker control, or the list of channels in a team.

Pour faciliter ce flux, lorsque votre extension de messagerie reçoit d’abord le composeExtension/fetchTask contrôle d’appel pour déterminer si votre bot est installé dans le contexte actuel (vous pouvez effectuer cette étape en tentant l’appel Get de la liste, par exemple).To facilitate this flow, when your messaging extension first receives the composeExtension/fetchTask invoke check to see if your bot is installed in the current context (you could accomplish this by attempting the get roster call, for example). Si votre bot n’est pas installé, vous devez renvoyer une carte adaptative avec une action qui demande à l’utilisateur d’installer votre robot, comme dans l’exemple ci-dessous.If your bot is not installed, you return an Adaptive Card with an action that requests the user to install your bot See the example below. Notez que l’utilisateur doit avoir l’autorisation d’installer des applications à cet emplacement ; s’ils ne peuvent pas se présenter, un message leur demande de contacter leur administrateur.Note that this requires the user to have permission to install apps in that location; if they cannot they will be presented with a message asking them to contact their administrator.

Voici un exemple de réponse :Here's an example of the response:

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

Une fois l’installation terminée, votre bot reçoit un autre message d’appel avec name = composeExtension/submitAction , et value.data.msteams.justInTimeInstall = true .Once the user completes the installation, your bot will receive another invoke message with name = composeExtension/submitAction, and value.data.msteams.justInTimeInstall = true.

Voici un exemple de l’appel :Here's an example of the invoke:

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

Vous devez répondre à cet appel à l’aide de la même réponse de tâche que si le robot était déjà installé.You should respond to this invoke with the same task response you would have responded with if the bot was already installed.

Réponse à l’envoiResponding to submit

Une fois qu’un utilisateur a terminé de saisir son entrée, le robot reçoit un composeExtension/submitAction événement avec l’ID de commande et les valeurs de paramètre définies.Once a user completes entering their input your bot will receive a composeExtension/submitAction event with the command id and parameter values set.

Voici les différentes réponses attendues vers un submitAction .These are the different expected responses to a submitAction.

Réponse du module de tâcheTask Module response

Elle est utilisée lorsque votre extension doit regrouper les boîtes de dialogue pour obtenir plus d’informations.This is used when your extension needs to chain dialogs together to get more information. La réponse est exactement la même que celle fetchTask mentionnée précédemment.The response is exactly the same as fetchTask mentioned earlier.

Réponse d’authentification/configuration de l’extension de compositionCompose extension auth/config response

Cette valeur est utilisée lorsque votre extension doit être authentifiée ou configurée pour continuer.This is used when your extension needs to either authenticate or configure in order to continue. Pour plus d’informations, consultez la section authentification dans la section recherche.See authentication section in the search section for more details.

Réponse aux résultats de l’extension de compositionCompose extension result response

Cette commande permet d’insérer une carte dans la zone de composition à la suite de la commande.This used to insert a card into the compose box as a result of a the command. Il s’agit de la même réponse que celle utilisée dans la commande de recherche, mais il est limité à une carte ou à un résultat dans la matrice.It's the same response that's used in the search command, but it's limited to one card or one result in the array.

{
  "composeExtension": {
    "type": "result",
    "attachmentLayout": "list",
    "preview": {
          "contentType": "application/vnd.microsoft.card.thumbnail",
          "content": {
            "title": "85069: Create a cool app",
            "images": [
              {
                "url": "https://placekitten.com/200/200"
              }
            ]
          }
        },
    "attachments": [
      {  
        "contentType": "application/vnd.microsoft.teams.card.o365connector",
        "content": {
          "sections": [
            {
              "activityTitle": "[85069]: Create a cool app",
              "activityImage": "https://placekitten.com/200/200"
            },
            {
              "title": "Details",
              "facts": [
                {
                  "name": "Assigned to:",
                  "value": "[Larry Brown](mailto:larryb@example.com)"
                },
                {
                  "name": "State:",
                  "value": "Active"
                }
              ]
            }
          ]
        }
      }
    ]
  }
}

Répondre avec un message de carte adaptative envoyé à partir d’un botRespond with an adaptive card message sent from a bot

Vous pouvez également répondre à l’action d’envoi en insérant un message avec une carte adaptative dans le canal avec un bot.You can also respond to the submit action by inserting a message with an Adaptive Card into the channel with a bot. Votre utilisateur pourra prévisualiser le message avant de l’envoyer et éventuellement modifier/interagir avec.Your user will be able to preview the message before submitting it, and potentially edit/interact with it as well. Cela peut être très utile dans les scénarios où vous devez recueillir des informations auprès de vos utilisateurs avant de créer une réponse de carte adaptative.This can be very useful in scenarios where you need to gather information from your users before creating an adaptive card response. Le scénario suivant montre comment vous pouvez utiliser ce flux pour configurer un sondage sans inclure les étapes de configuration dans le message du canal.The following scenario shows how you can use this flow to configure a poll without including the configuration steps in the channel message.

  1. L’utilisateur clique sur l’extension de messagerie pour déclencher le module de tâches.The user clicks the messaging extension to trigger the task module.
  2. L’utilisateur utilise le module tâches pour configurer le sondage.The user uses the task module to configure the poll.
  3. Après avoir soumis le module de tâches de configuration, l’application utilise les informations fournies dans le module de tâches pour concevoir une carte adaptative et l’envoie en botMessagePreview réponse au client.After submitting the configuration task module the app uses the information provided in the task module to craft an adaptive card and sends it as a botMessagePreview response to the client.
  4. L’utilisateur peut alors prévisualiser le message de la carte adaptative avant de l’insérer dans le canal.The user can then preview the adaptive card message before the bot will inserts it into the channel. Si le bot n’est pas déjà membre du canal, le fait de cliquer sur Send ajoutera le bot.If the bot is not already a member of the channel, clicking Send will add the bot.
  5. L’interaction avec la carte adaptative modifiera le message avant de l’envoyer.Interacting with the adaptive card will change the message before sending it.
  6. Une fois que l’utilisateur clique sur Send le bot, le message est publié vers le canal.Once the user clicks Send the bot will post the message to the channel.

Pour activer ce flux, votre module de tâches doit répondre comme dans l’exemple ci-dessous, qui présente l’aperçu du message à l’utilisateur.To enable this flow your task module should respond as in the example below, which will present the preview message to the user.

Notes

Le activityPreview doit contenir une message activité avec exactement 1 pièce jointe de carte adaptative.The activityPreview must contain a message activity with exactly 1 adaptive card attachment.

{
  "composeExtension": {
    "type": "botMessagePreview",
    "activityPreview": {
      "type": "message",
      "attachments":  [
        {
          "contentType": "application/vnd.microsoft.card.adaptive",
          "content": << Card Payload >>
        }
      ]
    }
  }
}

Votre extension de message doit maintenant répondre à deux nouveaux types d’interactions value.botMessagePreviewAction = "send" et value.botMessagePreviewAction = "edit" .Your message extension will now need to respond to two new types of interactions, value.botMessagePreviewAction = "send" and value.botMessagePreviewAction = "edit". Vous trouverez ci-dessous un exemple de l' value objet que vous devrez traiter :Below is an example of the value object you will need to process:

{
  "name": "composeExtension/submitAction",
  "type": "invoke",
  "conversation": { "id": "19:c366b75791784100b6e8b515fd55b063@thread.skype" },
  "imdisplayname": "Pranav Smith",
  ...
  "value": {
    "botMessagePreviewAction": "send" | "edit",
    "botActivityPreview": [
      {
        "type": "message/card",
        "attachments": [
          {
            "content":
              {
                "type": "AdaptiveCard",
                "body": [{<<card payload>>}]
              },
            "contentType" : "application/vnd.microsoft.card.adaptive"
          }
        ],
        "context": { "theme": "default" }
      }
    ],
  }
}

Lors de la réponse à la edit demande, vous devez répondre avec une task réponse dont les valeurs sont remplies avec les informations que l’utilisateur a déjà envoyées.When responding to the edit request you should respond with a task response with the values populated with the information the user has already submitted. Lors de la réponse à la send demande, vous devez envoyer un message au canal contenant la carte adaptative finalisée.When responding to the send request you should send a message to the channel containing the finalized adaptive card.

teamChatConnector.onComposeExtensionSubmitAction((
    event: builder.IEvent,
    request: teamBuilder.IComposeExtensionActionCommandRequest,
    callback: (err: Error, result: any, statusCode: number) => void) => {
        let invokeValue = (<any> event).value;

        if (invokeValue.botMessagePreviewAction ) {
            let attachment = invokeValue.botActivityPreview[0].attachments[0];

            if (invokeValue.botMessagePreviewAction === 'send') {
                let msg = new builder.Message()
                    .address(event.address)
                    .addAttachment(attachment);
                teamChatConnector.send([msg.toMessage()],
                    (error) => {
                        if(error){
                            //TODO: Handle error and callback
                        }
                        else {
                            callback(null, null, 200);
                        }
                    }
                );
            }

            else if (invokeValue.botMessagePreviewAction === 'edit') {
              // Create the card and populate with user-inputted information
              let card = { ... }

              let taskResponse = {
                task: {
                  type: "continue",
                  value: {
                    title: "Card Preview",
                    card: {
                      contentType: 'application/vnd.microsoft.card.adaptive',
                      content: card
                    }
                  }
                }
              }
              callback(null, taskResponse, 200);
            }

        else {
            let attachment = {
                  //create adaptive card
                };
            let activity = new builder.Message().addAttachment(attachment).toMessage();
            let response = teamBuilder.ComposeExtensionResponse.messagePreview()
                .preview(activity)
                .toResponse();
            callback(null, response, 200);
        }
    });

Voir aussi exemples de robots d’infrastructure.See also Bot Framework samples.