API des applications de réunion

L’extensibilité de la réunion fournit des API pour améliorer l’expérience de réunion. Vous pouvez effectuer les opérations suivantes à l’aide des API répertoriées :

  • Créez des applications ou intégrez des applications existantes dans le cycle de vie des réunions.
  • Utilisez des API pour informer votre application de la réunion.
  • Sélectionnez les API requises pour améliorer l’expérience de réunion.

Remarque

Utilisez la bibliothèque de client JavaScript Microsoft Teams (TeamsJS) (version : 1.10 et ultérieures) pour que l’authentification unique (SSO) fonctionne dans le panneau latéral de la réunion.

Le tableau suivant fournit la liste des API disponibles dans la bibliothèque JavaScript microsoft Teams et les kits de développement logiciel (SDK) Microsoft Bot Framework :

Méthode Description Source
Obtenir l’accès avec le contexte utilisateur Obtenez des informations contextuelles pour afficher du contenu pertinent dans un onglet Microsoft Teams. Bibliothèque TeamsJS
Obtenir des Participants Récupérez les informations du participant par ID de réunion et ID de participant. Kit de développement logiciel (SDK) Microsoft Bot Framework
Envoyer une notification en réunion Fournit des signaux de réunion à l’aide de l’API de notification de conversation existante pour la conversation de bot utilisateur et permet au bot de notifier l’action de l’utilisateur qui affiche une notification dans la réunion. Kit de développement logiciel (SDK) Microsoft Bot Framework
Obtenir les détails de la réunion Obtenez les métadonnées statiques d’une réunion. Kit de développement logiciel (SDK) Microsoft Bot Framework
Envoyer des légendes en temps réel Envoyez des sous-titres en temps réel à une réunion en cours. Bibliothèque TeamsJS
Partager le contenu de l’application à l’étape Partagez des parties spécifiques de l’application à la phase de réunion à partir du panneau côté application dans une réunion. Bibliothèque TeamsJS
Recevoir des événements de réunion Teams en temps réel Recevoir des événements de réunion en temps réel, tels que le début et la fin de la réunion ou la participation et le départ des participants. Kit de développement logiciel (SDK) Microsoft Bot Framework
Obtenir l’état audio entrant Permet à une application d’obtenir le paramètre d’état audio entrant pour l’utilisateur de la réunion. Bibliothèque TeamsJS
Activer/désactiver l’audio entrant Permet à une application de basculer le paramètre d’état audio entrant pour l’utilisateur de la réunion de son muet à activer ou vice versa. Bibliothèque TeamsJS

Obtenir l’API de contexte utilisateur

Importante

  • Par défaut, le nouveau client Teams prend en charge le thème clair pour les applications dans les réunions Teams. Lorsque la propriété dans l’API app.theme getContext retourne la valeur, le default client Teams est en thème clair.
  • Les versions antérieures des clients Teams prennent uniquement en charge le thème Sombre et Contrast pour les applications dans les réunions Teams

Pour identifier et récupérer des informations contextuelles pour le contenu de votre onglet, consultez obtenir le contexte de votre onglet Teams. meetingId Est utilisé par un onglet en cours d’exécution dans le contexte de la réunion et ajouté pour la charge utile de réponse.

Exemples

Voici les réponses TeamsJS v2 pour l’API Obtenir le contexte utilisateur en fonction du type de réunion, du type d’utilisateur et du type d’appel :

  • Type de réunion

    Voici une réponse de charge utile JSON pour une réunion de canal pour les utilisateurs du locataire :

    {
        "app": {
        "locale": "en-us",
        "sessionId": "ff47ec00-e6a7-4dc1-a6ae-f44110f50c94",
        "theme": "default",
        "iconPositionVertical": 0,
        "osLocaleInfo": {
          "platform": "windows",
          "regionalFormat": "en-in",
          "shortDate": "dd-MM-yyyy",
          "longDate": "dd MMMM yyyy",
          "shortTime": "HH:mm",
          "longTime": "HH:mm:ss"
        },
        "parentMessageId": "1678109354022",
        "userClickTime": 1678109521159,
        "userFileOpenPreference": "inline",
        "host": {
          "name": "Teams",
          "clientType": "desktop",
          "sessionId": "c3c3c0a0-f7a1-b070-6b89-c8cd1f380042",
          "ringId": "ring1"
        },
        "appLaunchId": "7346ae66-5cac-47f9-8a0d-1228dac474cb"
        },
        "page": {
        "id": "Test",
        "frameContext": "sidePanel",
        "subPageId": "",
            "isFullScreen": false,
            "isMultiWindow": true,
            "sourceOrigin": ""
           },
           "user": {
            "id": "57efa5f3-273c-47e2-a871-4879e5d849cf",
            "displayName": "",
            "isCallingAllowed": undefined,
            "isPSTNCallingAllowed": undefined,
            "licenseType": "Unknown",
            "loginHint": "v-prkamble@microsoft.com",
            "userPrincipalName": "v-prkamble@microsoft.com",
            "tenant": {
             "id": "72f988bf-86f1-41af-91ab-2d7cd011db47",
             "teamsSku": "enterprise"
            }
           },
           "channel": {
            "id": "19:49683807ffce4318ad6d6d7a24dbde45@thread.tacv2",
            "displayName": undefined,
            "relativeUrl": undefined,
            "membershipType": undefined,
            "defaultOneNoteSectionId": undefined,
            "ownerGroupId": undefined,
            "ownerTenantId": undefined
           },
           "chat": {
            "id": "19:49683807ffce4318ad6d6d7a24dbde45@thread.tacv2"
           },
           "meeting": {
            "id": "MCMxOTo0OTY4MzgwN2ZmY2U0MzE4YWQ2ZDZkN2EyNGRiZGU0NUB0aHJlYWQudGFjdjIjMTY3ODEwOTM1NDAyMg=="
           },
           "sharepoint": undefined,
           "team": {
            "internalId": "19:b34aeec3f8e54240a5c283e86bfc4878@thread.tacv2",
            "displayName": undefined,
            "type": undefined,
            "groupId": undefined,
            "templateId": undefined,
            "isArchived": undefined,
            "userRole": 1
           },
           "sharePointSite": {
            "teamSiteUrl": "",
            "teamSiteDomain": "microsoft.sharepoint.com",
            "teamSitePath": "",
            "teamSiteId": "",
            "mySitePath": undefined,
            "mySiteDomain": undefined
           }
          }
    
  • Type d'utilisateur

    Voici une réponse de charge utile JSON dans une réunion privée planifiée pour un utilisateur invité :

      {
            "app": {
             "locale": "en-us",
             "sessionId": "268beeb4-a52d-4ba8-b1c8-8b9f0b9b3492",
             "theme": "default",
             "iconPositionVertical": 23,
             "osLocaleInfo": {
              "platform": "windows",
              "regionalFormat": "en-in",
              "longDate": "dd MMMM yyyy",
              "shortDate": "dd-MM-yyyy",
              "longTime": "HH:mm:ss",
              "shortTime": "HH:mm"
             },
             "parentMessageId": "",
             "userClickTime": 1678023265131,
             "userFileOpenPreference": "inline",
             "host": {
              "name": "Teams",
              "clientType": "desktop",
              "sessionId": "967c980b-1e41-a2cd-eac0-a4bff8f73ce7",
              "ringId": "ring1"
             },
             "appLaunchId": "c35c4496-f28c-4107-8e6c-2dba09fb881a"
            },
            "page": {
             "id": "Test",
             "frameContext": "content",
             "subPageId": "",
             "isFullScreen": false,
             "isMultiWindow": false,
             "sourceOrigin": NULL
            },
            "user": {
             "id": "57efa5f3-273c-47e2-a871-4879e5d849cf",
             "displayName": undefined,
             "isCallingAllowed": undefined,
             "isPSTNCallingAllowed": undefined,
             "licenseType": "Unknown",
             "loginHint": "v-prkamble@microsoft.com",
             "userPrincipalName": "v-prkamble@microsoft.com",
             "tenant": {
              "id": "72f988bf-86f1-41af-91ab-2d7cd011db47",
              "teamsSku": "enterprise"
             }
            },
            "channel": undefined,
            "chat": {
             "id": "19:meeting_YmU5NWM3NGEtZjMyMi00ZDg4LTk4OGUtMjUzMGJkZjRhMDhm@thread.v2"
            },
            "meeting": {
             "id": "MCMxOTptZWV0aW5nX1ltVTVOV00zTkdFdFpqTXlNaTAwWkRnNExUazRPR1V0TWpVek1HSmtaalJoTURobUB0aHJlYWQudjIjMA=="
            },
            "sharepoint": undefined,
            "team": undefined,
            "sharePointSite": {
             "teamSiteUrl": "",
             "teamSiteDomain": "microsoft.sharepoint.com",
             "teamSitePath": "",
             "teamSiteId": undefined,
             "mySitePath": "/personal/v-prkamble_microsoft_com",
             "mySiteDomain": "microsoft-my.sharepoint.com"
            }
      }
    
    
  • Type d’appel

    Voici une réponse de charge utile JSON pour un appel un-à-un pour un utilisateur dans le locataire :

          {
           "app": {
            "locale": "en-us",
            "sessionId": "1b3dc47e-f6ae-4fe2-8ed6-844a505f3186",
            "theme": "dark",
            "iconPositionVertical": null,
            "osLocaleInfo": {
             "platform": "windows",
             "regionalFormat": "en-in",
             "shortDate": "dd-MM-yyyy",
             "longDate": "dd MMMM yyyy",
             "shortTime": "HH:mm",
             "longTime": "HH:mm:ss"
            },
            "parentMessageId": "",
            "userClickTime": 1678088052473,
            "userFileOpenPreference": undefined,
            "host": {
             "name": "Teams",
             "clientType": "desktop",
             "sessionId": "",
             "ringId": "general"
            },
            "appLaunchId": undefined
           },
           "page": {
            "id": "Test",
            "frameContext": "sidePanel",
            "subPageId": "",
            "isFullScreen": undefined,
            "isMultiWindow": true,
            "sourceOrigin": ""
           },
           "user": {
            "id": "e652dd92-dd63-4fcc-b5b2-2005681e8e9f",
            "displayName": undefined,
            "isCallingAllowed": undefined,
            "isPSTNCallingAllowed": undefined,
            "licenseType": "Unknown",
            "loginHint": "admin@M365x94626565.onmicrosoft.com",
            "userPrincipalName": "admin@M365x94626565.onmicrosoft.com",
            "tenant": {
             "id": "aa923623-ae61-49ee-b401-81f414b6ad5a",
             "teamsSku": "unknown"
            }
           },
           "channel": undefined,
           "chat": {
            "id": "19:a74d8489-4455-4670-9581-7b38a8017c58_e652dd92-dd63-4fcc-b5b2-2005681e8e9f@unq.gbl.spaces"
           },
           "meeting": {
            "id": "MCMxOTphNzRkODQ4OS00NDU1LTQ2NzAtOTU4MS03YjM4YTgwMTdjNThfZTY1MmRkOTItZGQ2My00ZmNjLWI1YjItMjAwNTY4MWU4ZTlmQHVucS5nYmwuc3BhY2VzIzA="
           },
           "sharepoint": undefined,
           "team": undefined,
           "sharePointSite": {
            "teamSiteUrl": undefined,
            "teamSiteDomain": "m365x94626565.sharepoint.com",
            "teamSitePath": undefined,
            "teamSiteId": undefined,
            "mySitePath": undefined,
            "mySiteDomain": undefined
           }
          }
    
    

Obtenir l’API du participant

L’API GetParticipant doit disposer d’une inscription et d’un ID de bot pour générer des jetons d’authentification. Pour plus d’informations, consultez l’inscription et l’ID du bot.

Remarque

  • Le type d’utilisateur n’est pas inclus dans l’API getParticipantRole .
  • Ne mettez pas en cache les rôles de participant, car l’organisateur de la réunion peut modifier les rôles à tout moment.
  • Actuellement, l’API GetParticipant est uniquement prise en charge pour les listes de distribution ou les listes de moins de 350 participants.

Paramètres de requête

Conseil

Obtenez les ID de participant et les ID de locataire à partir de l’authentification SSO de l’onglet.

L’API Meeting doit avoir meetingId, participantIdet tenantId en tant que paramètres d’URL. Les paramètres sont disponibles dans le cadre de la bibliothèque de client JavaScript (TeamsJS) microsoft Teams et de l’activité du bot.

Le tableau ci-dessous décrit chaque paramètre de chaîne de requête.

Valeur Type Requis Description
meetingId Chaîne Oui L’identificateur de réunion est disponible via Bot Invoke et la bibliothèque TeamsJS.
participantId Chaîne Oui L’ID du participant est l’ID d’utilisateur. Il est disponible dans Tab SSO, Bot Invoke et la bibliothèque TeamsJS. Il est recommandé d’obtenir un ID de participant à partir de l’authentification unique Tab.
tenantId String Oui L’ID de locataire est requis pour les utilisateurs du locataire. Il est disponible dans Tab SSO, Bot Invoke et la bibliothèque TeamsJS. Il est recommandé d’obtenir un ID de locataire à partir de l’authentification unique Tab.

Exemple

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
  // Gets the details for the given meeting participant. 
  // This only works in Teams meeting scoped conversations.
  TeamsMeetingParticipant participant = await TeamsInfo.GetMeetingParticipantAsync(turnContext, "yourMeetingId", "yourParticipantId", "yourParticipantTenantId").ConfigureAwait(false);
  TeamsChannelAccount member = participant.User;
  MeetingParticipantInfo meetingInfo = participant.Meeting;
  ConversationAccount conversation = participant.Conversation;

  // Sends a message activity to the sender of the incoming activity. 
  await turnContext.SendActivityAsync(MessageFactory.Text($"The participant role is: {meetingInfo.Role}"), cancellationToken);
}
Nom de la propriété Description
user.id ID de l’utilisateur.
user.aadObjectId Microsoft Entra’ID d’objet de l’utilisateur.
user.name Nom de l'utilisateur.
user.givenName Prénom de l’utilisateur.
user.surname Nom de l’utilisateur.
user.email ID de messagerie de l’utilisateur.
user.userPrincipalName UPN de l’utilisateur.
user.tenantId Microsoft Entra l’ID de locataire.
user.userRole Rôle de l’utilisateur. Par exemple, « admin » ou « user ».
meeting.role Rôle du participant dans la réunion. Par exemple, « Organisateur », « Présentateur » ou « Participant ».
meeting.inMeeting Valeur indiquant si le participant est dans la réunion.
conversation.id ID de conversation de réunion.
conversation.isGroup Boolean indiquant si la conversation a plus de deux participants.

Codes de réponse

Le tableau suivant présente les codes de réponse :

Code de réponse Description
403 Les informations sur les participants ne sont pas partagées avec l'application. Si l’application n’est pas installée dans la réunion, elle déclenche la réponse d’erreur 403. Si l’administrateur locataire désactive ou bloque l’application pendant la migration de site en direct, il déclenche la réponse d’erreur 403.
200 Les informations du participant sont récupérées avec succès.
401 L’application répond avec un jeton non valide.
404 La réunion a expiré ou les participants ne sont pas disponibles.

Envoyer une notification en réunion

Tous les utilisateurs d’une réunion reçoivent les notifications envoyées par le biais de la charge utile de notification en réunion. La charge utile de notification en réunion déclenche une notification en réunion et vous permet de fournir des signaux de réunion fournis à l’aide de l’API de notification de conversation existante pour la conversation utilisateur-bot. Vous pouvez envoyer une notification en réunion en fonction de l’action de l’utilisateur. La charge utile est disponible via Bot Services.

Vous pouvez également envoyer une notification ciblée en réunion à un participant spécifique d’une réunion. Pour plus d’informations, consultez Notification ciblée en réunion.

Remarque

  • Lorsqu’une notification en réunion est appelée, le contenu est présenté sous la forme d’un message de conversation.
  • Vous devez appeler la fonction submitTask() pour ignorer automatiquement une fois qu’un utilisateur a fait une action dans la vue web. Il s'agit d'une exigence pour la soumission d'une application. Pour plus d'informations, consultez Module de tâches du SDK Teams.
  • Si vous souhaitez que votre application prenne en charge les utilisateurs anonymes, la charge utile de la demande d’appel initial doit s’appuyer sur les métadonnées de la demande dans from.id l’objet, fromet non sur from.aadObjectId les métadonnées de la demande. from.idest l’ID utilisateur et from.aadObjectId est le Microsoft Entra ID de l’utilisateur. Pour plus d’informations, consultez l’utilisation de modules de tâches dans des onglets et créez et envoyez le module de tâche.

Paramètre de requête

Le tableau suivant inclut le paramètre de requête :

Valeur Type Requis Description
conversationId String Oui L’identificateur de conversation est disponible dans le cadre de Bot Invoke.

Exemples

Bot ID est déclaré dans le manifeste et le bot reçoit un objet de résultat.

Remarque

  • Le completionBotId paramètre est externalResourceUrl facultatif dans l’exemple de charge utile demandée.
  • Les externalResourceUrl paramètres de largeur et de hauteur doivent être en pixels. Pour plus d'informations, consultez Directives de conception Teams.
  • L’URL est la page, qui se charge comme <iframe> dans la notification en réunion. Le domaine doit se trouver dans le tableau des validDomainsapps de votre manifeste d'application.
// Specifies the type of text data in a message attachment.
Activity activity = MessageFactory.Text("This is a meeting signal test");

// Configures the current activity to generate a notification within Teams.
activity.TeamsNotifyUser(true, "https://teams.microsoft.com/l/bubble/APP_ID?url=<url>&height=<height>&width=<width>&title=<title>&completionBotId=BOT_APP_ID");

// Sends a message activity to the sender of the incoming activity. 
await turnContext.SendActivityAsync(activity).ConfigureAwait(false);
Nom de la propriété Description
type Type d’activité.
text Contenu texte du message.
summary Texte récapitulative du message.
channelData.notification.alertInMeeting Boolean indiquant si une notification doit être affichée à l’utilisateur lors d’une réunion.
channelData.notification.externalResourceUrl Valeur de l’URL de ressource externe de la notification.
replyToId ID du message parent ou racine du thread.
APP_ID ID d’application déclaré dans le manifeste.
completionBotId ID d’application de bot.

Codes de réponse

Le tableau suivant inclut les codes de réponse :

Code de réponse Description
201 L’activité avec le signal est envoyée avec succès.
401 L’application répond avec un jeton non valide.
403 L’application ne peut pas envoyer le signal. Le code de réponse 403 peut se produire pour différentes raisons, telles que la désactivation et le blocage de l’application par l’administrateur client lors de la migration de site en direct. Dans ce cas, la charge utile contient un message d’erreur détaillé.
404 La conversation de réunion n’existe pas.

API de notification de réunion ciblée et d’icône d’application

L’API targetedMeetingNotification permet aux applications d’envoyer des notifications ciblées lors d’une réunion et affiche le bading de l’icône d’application à des participants spécifiques d’une réunion. Les applications envoient des notifications ciblées en réunion et des icônes d’application en fonction de l’action de l’utilisateur. L’API est disponible via l’API de bot.

Conditions préalables

Vous devez configurer votre manifeste d’application avec des autorisations RSC sous la propriété pour envoyer des notifications ciblées dans la webApplicationInfo réunion et afficher le bading de l’icône d’application à des participants spécifiques d’une réunion. Utilisez les exemples suivants pour configurer votre manifeste :


Pour le manifeste d’application version 1.12 et ultérieure
"webApplicationInfo": {
    "id": "<<MICROSOFT-APP-ID>>",
    "resource": "https://RscBasedStoreApp"  },
  "authorization": {
    "permissions": {
      "resourceSpecific": [
            {
                "name": "OnlineMeetingNotification.Send.Chat",
                "type": "Application"
            }
        ]    
    }
}


Pour le manifeste d’application version 1.11 et antérieure
"webApplicationInfo": {
    "id": "<<MICROSOFT-APP-ID>>",
    "resource": "https://RscBasedStoreApp",
    "applicationPermissions": [
      "OnlineMeetingNotification.Send.Chat"
    ]
}

Remarque

  • La charge utile de l’API autorise uniquement un dialogue avec une URL.
  • Les formats d’ID utilisateur aadObjectid et UPN ne sont pas pris en charge.

Obtenez le format d’ID utilisateur pris en charge pour la notification ciblée dans la réunion et le badging d’icône d’application :

Exemple

Voici un exemple de charge utile de demande pour la notification ciblée dans la réunion et le badging d’icône d’application :

POST /v1/meetings/{meetingId}/notification
{

  "type": "targetedMeetingNotification",
  "value": {
    "recipients": [ 
"29:1I12M_iy2wTa97T6LbjTh4rJCWrtw2PZ3lxpD3yFv8j2YPnweY2lpCPPAn3RI0PP7rghfHauUz48I1t7ANhj4CA"
     ], 
    "surfaces": [ 
      { 
        "surface": "meetingStage", 
        "contentType": "task", 
        "content": { 
          "value": { 
            "height": "300", 
            "width": "400", 
            "title": "Targeted meeting Notification", 
            "url": "https://somevalidurl.com"           
}
        } 
      } 
    ] 
  },
  "channelData": { // optional if a developer doesn't want to support user attributes.
    "onBehalfOf": [ 
      { 
        "itemid": 0, 
        "mentionType": "person", 
        "mri": "29:1mDOCfGM9825lMHlwP8NjIVMJeQAbN-ojYBT5VzQfPpnst1IFQeYB1QXC8Zupn2RhgfLIW27HmynQk-4bdx_YhA", 
        "displayName": "yunny chung"      } 
    ] 
  }
}
Nom de la propriété Description
meetingId L’ID de réunion est disponible via l’appel de bot et la bibliothèque TeamsJS.
type targetedMeetingNotification
recipients Liste des ID d’utilisateur. Obtenez des ID d’utilisateur pour les participants à la réunion via l’API Obtenir un participant. Obtenez la liste complète de la liste des conversations à l’aide de l’API Obtenir des membres. La liste de destinataires vide ou null retourne 400.
surface Type de surface. Les types de surface pris en charge sont meetingStage et meetingTabIcon.
surfaces Liste des surfaces où les notifications peuvent être affichées.
contentType Type de contenu rendu par la notification de réunion ciblée. La valeur prise en charge est task.
content TaskModuleContinueResponse
content.value.height Facultatif ; hauteur demandée de la notification.
content.value.width Facultatif ; largeur demandée de la notification.
content.value.title Facultatif ; titre de la notification.
content.value.url Facultatif ; URL à afficher dans la notification. Vérifiez que l’URL fait partie du manifeste de validDomains l’application. Si une chaîne vide ou aucune URL n’est fournie, aucune notification de réunion n’est affichée.
ChannelData.OnBehalfOf Facultatif ; il s’agit de prendre en charge les attributs utilisateur.
onBehalfOf.itemid Décrit l’identification de l’élément. Sa valeur doit être 0.
onBehalfOf.mentionType personmot clé. Décrit le mention d’une personne.
onBehalfOf.mri MRI utilisateur affiché en tant qu’expéditeur.
onBehalfOf.displayName Facultatif ; nom du person. Utilisé comme secours si la résolution de noms n’est pas disponible.

Remarque

Si vous fournissez une entrée non valide, l’API retourne le code status 400.

Code de réponse

Le tableau suivant inclut les codes de réponse :

Code de réponse Description
202 La notification est envoyée avec succès.
207 Les notifications sont envoyées uniquement à quelques participants.
400 Échec de la validation de la charge utile de la demande de notification de réunion.
401 Le jeton de bot n’est pas valide.
403 Le bot n’est pas autorisé à envoyer la notification.
404 La conversation de réunion est introuvable ou aucun des participants n’a été trouvé dans la liste.

Obtenir l’API détails de la réunion

L’API détails de réunion permet à votre application d’obtenir les métadonnées statiques d’une réunion. Les métadonnées fournissent des points de données qui ne changent pas dynamiquement. L’API est disponible via Bot Services. Actuellement, les réunions privées planifiées ou périodiques et les réunions planifiées par canal ou périodiques prennent respectivement en charge l’API avec des autorisations RSC différentes.

L’API détails de la réunion doit avoir une inscription de bot et un ID de bot. Il nécessite le Kit de développement logiciel (SDK) bot pour obtenir TurnContext. Pour utiliser l’API détails de réunion, vous devez obtenir une autorisation RSC différente en fonction de l’étendue de toute réunion, telle que la réunion privée ou la réunion de canal.

Remarque

L’API détails de réunion est prise en charge pour les réunions privées planifiées, les réunions de canal planifiées, les réunions instantanées (Se réunir maintenant), les appels en tête-à-tête et les appels de groupe dans les clients de bureau et mobiles Teams.

Conditions préalables

Pour utiliser l’API détails de réunion, vous devez obtenir une autorisation RSC différente en fonction de l’étendue de toute réunion, telle que la réunion privée ou la réunion de canal.


Pour le manifeste d’application version 1.12 et ultérieure

Utilisez l’exemple suivant pour configurer les propriétés et authorization les propriétés de votre manifeste d’application webApplicationInfo pour toute réunion privée :

"webApplicationInfo": {
    "id": "<bot id>",
    "resource": "https://RscPermission",
},
"authorization": {
    "permissions": {
        "resourceSpecific": [
            {
                "name": "OnlineMeeting.ReadBasic.Chat",
                "type": "Application"
            }
        ]
    }
}

Utilisez l’exemple suivant pour configurer les propriétés et authorization le manifeste de webApplicationInfo votre application pour n’importe quelle réunion de canal :

"webApplicationInfo": {
    "id": "<bot id>",
    "resource": "https://RscPermission",
},
"authorization": {
    "permissions": {
        "resourceSpecific": [
            {
                "name": "ChannelMeeting.ReadBasic.Group",
                "type": "Application"
            }
        ]
    }
}


Pour le manifeste d’application version 1.11 et antérieure

Utilisez l’exemple suivant pour configurer la propriété du manifeste de webApplicationInfo votre application pour toute réunion privée :

"webApplicationInfo": {
    "id": "<bot id>",
    "resource": "https://RscPermission",
    "applicationPermissions": [
      "OnlineMeeting.ReadBasic.Chat"
    ]
}

Utilisez l’exemple suivant pour configurer la propriété de votre manifeste d’application webApplicationInfo pour toute réunion de canal :

"webApplicationInfo": {
    "id": "<bot id>",
    "resource": "https://RscPermission",
    "applicationPermissions": [
      "ChannelMeeting.ReadBasic.Group"
    ]
}

Remarque

  • Si l’autorisation ChannelMeeting.ReadBasic.Group est ajoutée au manifeste, le bot reçoit automatiquement les événements de début ou de fin de réunion à partir des réunions de canal créées dans toutes les équipes où le bot est ajouté.
  • Pour un appel organizer en tête-à-tête est l’initiateur de la conversation et pour les appels organizer de groupe est l’initiateur d’appel. Pour les réunions organizer de canal public est la personne qui a créé le billet de canal.

Paramètre de requête

Le tableau suivant répertorie quelques exemples où le paramètre de requête est utilisé.

Valeur Type Requis Description
meetingId Chaîne Oui L’identificateur de réunion est disponible via Bot Invoke et la bibliothèque TeamsJS.

Exemple

// Gets the information for the given meeting id.
MeetingInfo result = await TeamsInfo.GetMeetingInfoAsync(turnContext);

// Sends a message activity to the sender of the incoming activity. 
await turnContext.SendActivityAsync(JsonConvert.SerializeObject(result));
Nom de la propriété Description
details.id ID de la réunion, encodé en tant que chaîne BASE64.
details.msGraphResourceId MsGraphResourceId, utilisé spécifiquement pour les appels ms API Graph.
details.scheduledStartTime Heure de début planifiée de la réunion, au format UTC.
details.scheduledEndTime Heure de fin planifiée de la réunion, au format UTC.
details.joinUrl URL utilisée pour rejoindre la réunion.
details.title Titre de la réunion.
details.type Type de réunion (OneToOneCall, GroupCall, Scheduled, Recurring, MeetNow, ChannelScheduled et ChannelRecurring).
conversation.isGroup Boolean indiquant si la conversation a plus de deux participants.
conversation.conversationType Type de conversation.
conversation.id ID de conversation de réunion.
organizer.id ID d’utilisateur de l’organisateur.
organizer.aadObjectId ID d’objet Microsoft Entra de l’organisateur.
organizer.tenantId ID de locataire Microsoft Entra de l’organisateur.

En cas de type de réunion périodique :

startDate : spécifie la date de début de l’application du modèle. La valeur de startDate doit correspondre à la valeur de date de la propriété start sur la ressource d’événement. La première occurrence de la réunion peut ne pas se produire à cette date si elle ne correspond pas au modèle.

endDate : spécifie la date d’arrêt de l’application du modèle. La dernière occurrence de la réunion peut ne pas se produire à cette date si elle ne correspond pas au modèle.

API Envoyer des légendes en temps réel

L’API d’envoi de sous-titres en temps réel expose un point de terminaison POST pour les sous-titres de traduction en temps réel (CART) d’accès aux communications Teams, les sous-titres de type humain. Le contenu textuel envoyé à ce point de terminaison apparaît aux utilisateurs finaux dans une réunion Teams quand les sous-titres sont activés.

URL CART

Vous pouvez obtenir l’URL CART du point de terminaison POST à partir de la page Options de réunion d’une réunion Teams. Pour plus d’informations, consultez les légendes CART dans une réunion Microsoft Teams. Vous n’avez pas besoin de modifier l’URL CART pour utiliser des légendes CART.

Paramètre de requête

L’URL CART inclut les paramètres de requête suivants :

Valeur Type Requis Description
meetingId Chaîne Oui L’identificateur de réunion est disponible via Bot Invoke et la bibliothèque TeamsJS.
Par exemple, meetingid=%7b%22tId%22%3a%2272f234bf-86f1-41af-91ab-2d7cd0321b47%22%2c%22oId%22%3a%22e071f268-4241-47f8-8cf3-fc6b84437f23%22%2c%22thId%22%3a%2219%3ameeting_NzJiMjNkMGQtYzk3NS00ZDI1LWJjN2QtMDgyODVhZmI3NzJj%40thread.v2%22%2c%22mId%22%3a%220%22%7d
Jeton Chaîne Oui Jeton d’autorisation
Par exemple, token=04751eac

Exemple

https://api.captions.office.microsoft.com/cartcaption?meetingid=%7b%22tId%22%3a%2272f234bf-86f1-41af-91ab-2d7cd0321b47%22%2c%22oId%22%3a%22e071f268-4241-47f8-8cf3-fc6b84437f23%22%2c%22thId%22%3a%2219%3ameeting_NzJiMjNkMGQtYzk3NS00ZDI1LWJjN2QtMDgyODVhZmI3NzJj%40thread.v2%22%2c%22mId%22%3a%220%22%7d&token=gjs44ra

Méthode

Ressource Méthode Description
/cartcaption POST Gérer les légendes pour la réunion, qui a été démarrée

Remarque

Vérifiez que le type de contenu pour toutes les demandes est du texte brut avec encodage UTF-8. Le corps de la requête contient uniquement des légendes.

Exemple

POST /cartcaption?meetingid=04751eac-30e6-47d9-9c3f-0b4ebe8e30d9&token=04751eac&lang=en-us HTTP/1.1
Host: api.captions.office.microsoft.com
Content-Type: text/plain
Content-Length: 22
Hello I’m Cortana, welcome to my meeting. 

Remarque

Chaque requête POST génère une nouvelle ligne de légendes. Pour vous assurer que l’utilisateur final dispose de suffisamment de temps pour lire le contenu, limitez chaque corps de requête POST à 80 à 120 caractères.

Codes d’erreur

Le tableau suivant décrit les codes d'erreur.

Code d'erreur Description
400 Demande incorrecte Le corps de la réponse contient plus d’informations. Par exemple, tous les paramètres requis ne sont pas présentés.
401 Non autorisé Jeton incorrect ou expiré Si vous recevez cette erreur, générez une nouvelle URL CART dans Teams.
404 Réunion introuvable ou non démarrée Si vous recevez cette erreur, veillez à démarrer la réunion et à sélectionner les légendes de début. Une fois les légendes activées dans la réunion, vous pouvez commencer à ajouter des sous-titres à la réunion.
500 Erreur interne au serveur. Pour plus d’informations, contactez le support technique ou fournissez des commentaires.

Recevoir des événements de réunion Teams en temps réel

Vous pouvez recevoir des événements de réunion en temps réel tels que les événements de début et de fin de réunion ou les événements de participation et de départ des participants.

Recevoir des événements de début et de fin de réunion

Remarque

Les événements de début et de fin de réunion sont pris en charge pour les réunions planifiées et les réunions de canal.

L’utilisateur peut recevoir des événements de réunion en temps réel. Dès qu’une application est associée à une réunion, l’heure de début et de fin de la réunion réelle est partagée avec le bot. L’heure de début et de fin réelle d’une réunion est différente de l’heure de début et de fin planifiée. L’API détails de la réunion fournit l’heure de début et de fin planifiée. L’événement fournit l’heure de début et de fin réelle.

Si les ChannelMeeting.ReadBasic.Group autorisations et OnlineMeeting.ReadBasic.Chat sont ajoutées dans le manifeste, le bot commence automatiquement à recevoir les événements de début ou de fin de réunion pour les types de réunion planifiés et de canal.

Conditions préalables

Le manifeste de votre application doit avoir la webApplicationInfo propriété pour recevoir les événements de début et de fin de la réunion. Utilisez les exemples suivants pour configurer votre manifeste :


Pour le manifeste d’application version 1.12 et ultérieure
"webApplicationInfo": {
    "id": "<bot id>",
    "resource": "https://RscPermission",
    },
"authorization": {
    "permissions": {
        "resourceSpecific": [
            {
                "name": "OnlineMeeting.ReadBasic.Chat",
                "type": "Application"
            }
            {
                "name": "ChannelMeeting.ReadBasic.Group",
                "type": "Application"
            }
        ]    
    }
}


Pour le manifeste d’application version 1.11 et antérieure
"webApplicationInfo": {
    "id": "<bot id>",
    "resource": "https://RscPermission",
    "applicationPermissions": [
      "OnlineMeeting.ReadBasic.Chat",
      "ChannelMeeting.ReadBasic.Group"
    ]
}

Exemple d’obtention d’événements de début ou de fin de réunion

Le bot reçoit les événements de début et de fin de réunion par le biais des OnTeamsMeetingStartAsync gestionnaires et OnTeamsMeetingEndAsync . Les informations relatives à l’événement de réunion font partie de l’objet MeetingStartEventDetails , qui inclut les champs de métadonnées tels que , meetingType, titleid, joinUrl, startTime, et EndTime.

Remarque

  • Obtenir l’ID de réunion à partir de turnContext.ChannelData
  • N’utilisez pas l’ID de conversation comme ID de réunion.
  • N’utilisez pas l’ID de réunion à partir de la charge utile turncontext.activity.valuedes événements de réunion.

Les exemples suivants montrent comment capturer les événements de début et de fin de réunion :

Événement de début de réunion

// Invoked when a Teams Meeting Start event activity is received from the connector.
protected override async Task OnTeamsMeetingStartAsync(MeetingStartEventDetails meeting, ITurnContext<IEventActivity> turnContext, CancellationToken cancellationToken)
{
    // Sends a message activity to the sender of the incoming activity. 
    await turnContext.SendActivityAsync(JsonConvert.SerializeObject(meeting));
}

Événement de fin de réunion

// Invoked when a Teams Meeting End event activity is received from the connector.
protected override async Task OnTeamsMeetingEndAsync(MeetingEndEventDetails meeting, ITurnContext<IEventActivity> turnContext, CancellationToken cancellationToken)
{
    // Sends a message activity to the sender of the incoming activity.
    await turnContext.SendActivityAsync(JsonConvert.SerializeObject(meeting));
}

Exemple de charge utile d’événement de début de réunion

Le code suivant fournit un exemple de charge utile d’événement de début de réunion :

{
  "name": " application/vnd.microsoft.meetingStart",
  "type": "event",
  "timestamp": "2023-02-23T19:34:07.478Z",
  "localTimestamp": "2023-02-23T11:34:07.478-8",
  "channelId": "msteams",
  "serviceUrl": "https://smba.trafficmanager.net/teams/",
  "from": {
    "id": "user_id"
  },
  "conversation": {
    "isGroup": true,
    "conversationType": "groupchat",
    "id": "conversation_id"
  },
  "recipient": {
    "id": "28:65f50003-e15d-434a-9e14-0fcfeb3d7817"
  },
  "value": {
    "id": "meeting_id",
    "joinUrl": "join_url",
    "title": "Example meeting",
    "meetingType": "Scheduled",
    "startTime": "2023-02-23T19:34:07.478Z"
  },
  "channelData": {
    "tenant": {
      "id": "tenant_id"
    }
  }
}

Exemple de charge utile d’événement de fin de réunion

Le code suivant fournit un exemple de charge utile d’événement de fin de réunion :

{
  "name": " application/vnd.microsoft.meetingEnd",
  "type": "event",
  "timestamp": "2023-02-23T19:34:07.478Z",
  "localTimestamp": "2023-02-23T11:34:07.478-8",
  "channelId": "msteams",
  "serviceUrl": "https://smba.trafficmanager.net/teams/",
  "from": {
    "id": "user_id"
  },
  "conversation": {
    "isGroup": true,
    "conversationType": "groupchat",
    "id": "conversation_id"
  },
  "recipient": {
    "id": "28:65f50003-e15d-434a-9e14-0fcfeb3d7817"
  },
  "value": {
    "id": "meeting_id",
    "joinUrl": "join_url",
    "title": "Example meeting",
    "meetingType": "Scheduled",
    "EndTime": "2023-02-23T20:30:07.478Z"
  },
  "channelData": {
    "tenant": {
      "id": "tenant_id"
    }
  }
}
Nom de la propriété Description
name Nom de l'utilisateur.
type Type d’activité.
timestamp Date et heure locales du message, exprimées au format ISO-8601.
id ID de l’activité.
channelId Canal à lequel cette activité est associée.
serviceUrl URL du service où les réponses à cette activité doivent être envoyées.
from.id Identification de l'utilisateur qui a envoyé la demande.
from.aadObjectId Microsoft Entra’ID d’objet de l’utilisateur qui a envoyé la demande.
conversation.isGroup Boolean indiquant si la conversation a plus de deux participants.
conversation.tenantId Microsoft Entra’ID de locataire de la conversation ou de la réunion.
conversation.id ID de conversation de réunion.
recipient.id ID de l’utilisateur qui reçoit la demande.
recipient.name Nom de l’utilisateur qui reçoit la demande.
entities.locale entité qui contient des métadonnées sur les paramètres régionaux.
entities.country entité qui contient des métadonnées sur le pays.
entities.type entité qui contient des métadonnées sur le client.
channelData.tenant.id Microsoft Entra l’ID de locataire.
channelData.source Nom source à partir duquel l’événement est déclenché ou appelé.
channelData.meeting.id ID par défaut associé à la réunion.
Valeur. MeetingType Type de réunion.
Valeur. Titre Objet de la réunion.
Valeur. Id ID par défaut associé à la réunion.
Valeur. JoinUrl URL de participation de la réunion.
Valeur. Starttime Heure de début de la réunion au format UTC.
Valeur. Heure de fin Heure de fin de la réunion au format UTC.
locale Paramètres régionaux du message définis par le client.

Recevoir les événements des participants à la réunion

Votre bot peut recevoir des événements de réunion en temps réel, tels que des événements de participation et de départ de participants. Un bot peut recevoir les événements des participants uniquement s’il est abonné à ces événements dans le Portail des développeurs.

Remarque

  • Les événements des participants sont pris en charge uniquement pour les réunions planifiées.
  • Pour qu’un bot reçoive des événements de participants, veillez à ajouter le bot à la réunion avant qu’un participant rejoigne ou quitte la réunion.

Pour vous abonner aux événements des participants, procédez comme suit :

  1. Dans le Portail des développeurs , ouvrez votre application bot ou importez une application existante.

  2. Dans la section Abonnements aux événements de réunion , sélectionnez les événements :

    • Participation aux participants
    • Congé du participant
  3. Sélectionnez Enregistrer.

    Capture d’écran montrant comment le portail des développeurs s’affiche pour les événements des participants.

  4. Vérifiez que l’autorisation OnlineMeetingParticipant.Read.Chat RSC est configurée dans le manifeste de votre application.

    Si votre application ne dispose pas de l’autorisation RSC, ajoutez-la via la section Configurer>les autorisations de votre application dans le Portail des développeurs. Pour plus d’informations, consultez Autorisations RSC.

Les exemples suivants montrent comment capturer les événements de participation et de sortie des participants :

Exemple de référence de code

//Invoked on participant join a meeting
protected override async Task OnTeamsMeetingParticipantsJoinAsync(MeetingParticipantsEventDetails meeting, ITurnContext<IEventActivity> turnContext, CancellationToken cancellationToken)
{
  await turnContext.SendActivityAsync("Member has joined the meeting.");
  return;
}

Voici les exemples de charges utiles d’événement de participation et de sortie de participant :

Voici un exemple de charge utile d’événement de jointure de participant :

{ 

    "type": "event", 
    "name": "application/vnd.microsoft.meetingParticipantJoin",
    "timestamp": "2023-02-23T19:34:07.478Z", 
    "channelId": "msteams", 
    "serviceUrl": "https://smba.trafficmanager.net/amer/", 
    "from": { 
        "id": "29:id_xyz" 
    }, 
    "conversation": { 
        "isGroup": true, 
        "conversationType": "groupchat", 
        "id": "19:meeting_threadId@thread.v2" 
    }, 
    "recipient": { 
        "id": "28:botid" 
    },  
    "value": { 
       "members": [ 
       { 
        "user": { 
            "tenantId": "tenantid", 
            "objectId": "user_object_Id", 
            "id": "29:userId ", 
            "name": "Test User", 
            "aadObjectId": " user_object_Id " 
        },   
        "meeting": { 
            "inMeeting": true, 
            "role": "Organizer" //Attendee, Organizer, Presenter 
        },  
        }], 
    }, 
    "channelData": { 
        "tenant": { 
            "id": "tenantId" 
        }, 
        "meeting": { 
            "id": "encoded_meetingId" 
        } 
    } 
} 

Obtenir l’état audio entrant

L’API getIncomingClientAudioState permet à une application d’obtenir le paramètre d’état audio entrant pour l’utilisateur de la réunion. L’API est disponible via la bibliothèque TeamsJS.

Remarque

  • L’API getIncomingClientAudioState pour mobile est disponible dans la préversion publique pour les développeurs.
  • L’API toggleIncomingClientAudio est disponible dans le nouveau client Teams.
  • Le consentement spécifique à la ressource est disponible pour la version de manifeste 1.12 et les versions ultérieures. Par conséquent, cette API ne fonctionne pas pour le manifeste version 1.11 et les versions antérieures.

Manifeste

"authorization": {
    "permissions": {
      "resourceSpecific": [
        {
          "name": "OnlineMeetingParticipant.ToggleIncomingAudio.Chat",
          "type": "Delegated"
        }
      ]
    }
  }

Exemple

callback = (errcode, result) => {
        if (errcode) {
            // Handle error code
        }
        else {
            // Handle success code
        }
    }
// The getIncomingClientAudioState API shows the current audio state.
microsoftTeams.meeting.getIncomingClientAudioState(this.callback)

Paramètre de requête

Le tableau suivant inclut le paramètre de requête :

Valeur Type Requis Description
callback Chaîne Oui Le rappel contient deux paramètres error et result. L’erreur peut contenir un type SdkError d’erreur ou null lorsque l’extraction audio réussit. Le résultat peut contenir la valeur true ou false lorsque l’extraction audio réussit ou null en cas d’échec de l’extraction audio. L’audio entrant est désactivé si le résultat est true et désactivé si le résultat est false.

Codes de réponse

Le tableau suivant présente les codes de réponse :

Code de réponse Description
500 Erreur interne.
501 L’API n’est pas prise en charge dans le contexte actuel.
1 000 L’application ne dispose pas des autorisations appropriées pour autoriser le partage à mettre en scène.

Activer/désactiver l’audio entrant

L’API toggleIncomingClientAudio permet à une application de basculer le paramètre d’état audio entrant pour l’utilisateur de la réunion du son muet à l’activation ou inversement. L’API est disponible via la bibliothèque TeamsJS.

Remarque

  • L’API toggleIncomingClientAudio pour mobile est disponible dans la préversion publique pour les développeurs.
  • Le consentement spécifique à la ressource est disponible pour la version de manifeste 1.12 et les versions ultérieures. Par conséquent, cette API ne fonctionne pas pour le manifeste version 1.11 et les versions antérieures.

Manifeste

"authorization": {
 "permissions": {
  "resourceSpecific": [
   {
    "name": "OnlineMeetingParticipant.ToggleIncomingAudio.Chat",
    "type": "Delegated"
   }
  ]
 }
}

Exemple

callback = (error, result) => {
        if (error) {
            // Handle error code
        }
        else {
            // Handle success code
        }
    }
// The toggleIncomingClientAudio API allows an app to toggle the incoming audio state.
microsoftTeams.meeting.toggleIncomingClientAudio(this.callback)

Paramètre de requête

Le tableau suivant inclut le paramètre de requête :

Valeur Type Requis Description
callback Chaîne Oui Le rappel contient deux paramètres error et result. L’erreur peut contenir un type SdkError d’erreur ou null lorsque le bouton bascule réussit. Le résultat peut contenir une valeur true ou false, lorsque le bouton bascule réussit ou null en cas d’échec du bouton bascule. L’audio entrant est désactivé si le résultat est true et désactivé si le résultat est false.

Code de réponse

Le tableau suivant présente les codes de réponse :

Code de réponse Description
500 Erreur interne.
501 L’API n’est pas prise en charge dans le contexte actuel.
1 000 L’application ne dispose pas des autorisations appropriées pour autoriser le partage à mettre en scène.

Exemple de code

Exemple de nom Description .NET Node.js Manifeste
Extensibilité des réunions Exemple d’extensibilité de réunion Teams pour le passage de jetons. View View View
Notification en réunion Montre comment implémenter la notification en réunion à l’aide d’un bot. View View View
Panneau latéral de la réunion Exemple d’extensibilité de réunion Teams pour interagir avec le panneau latéral en réunion. View View
Onglet Détails de la réunion Cet exemple d’application montre la fonctionnalité d’extensibilité de réunion Teams dans laquelle l’utilisateur peut créer un sondage et les membres peuvent répondre au sondage dans la réunion. View View View
Exemple d’événements de réunion Cet exemple montre des événements de réunion Teams en temps réel à l’aide d’un bot. View View View
Exemple de recrutement de réunions Cet exemple d’application montre une expérience de réunion pour le scénario de recrutement à l’aide d’applications dans les réunions. View View View

Voir aussi