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, ledefault
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": "user@microsoft.com", "userPrincipalName": "user@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": "user@microsoft.com", "userPrincipalName": "user@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/user_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": "user@microsoft.com", "userPrincipalName": "user@microsoft.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": "microsoft.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.
- 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
, participantId
et 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 | ID d’objet Microsoft Entra 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 | ID de locataire Microsoft Entra. |
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,from
et non surfrom.aadObjectId
les métadonnées de la demande.from.id
est l’ID utilisateur etfrom.aadObjectId
est l’ID Microsoft Entra 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 estexternalResourceUrl
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 desvalidDomains
apps 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. Une 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, rien n’est rendu sur une notification de réunion. |
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 |
person mot-clé. Décrit la 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 d’état 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. Les réunions planifiées ou périodiques privées et les réunions planifiées ou périodiques par canal prennent en charge l’API avec des autorisations RSC différentes, respectivement.
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 appelsorganizer
de groupe est l’initiateur d’appel. Pour les réunionsorganizer
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 d’API MS 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
, title
id
, 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.value
des é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 | ID d’objet Microsoft Entra de l’utilisateur qui a envoyé la demande. |
conversation.isGroup | Boolean indiquant si la conversation a plus de deux participants. |
conversation.tenantId | ID de locataire Microsoft Entra 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 | ID de locataire Microsoft Entra. |
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 :
Dans le Portail des développeurs , ouvrez votre application bot ou importez une application existante.
Dans la section Abonnements aux événements de réunion , sélectionnez les événements :
- Participation aux participants
- Congé du participant
Sélectionnez Enregistrer.
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 :
//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
- Flux d’authentification Teams pour les onglets
- Applications pour les réunions Teams
- FAQ sur le Kit de développement logiciel (SDK) de Live Share
- Enregistrement de réunion cloud Teams
- Obtenir le rapport de présence pour une réunion en ligne
- Générer une notification en réunion pour une réunion Teams
- Recevoir des notifications pour les mises à jour des appels de réunion Teams
- API Obtenir la présence des participants