APIs de aplicativos de reunião

A extensibilidade da reunião fornece APIs para aprimorar a experiência de reunião. Você pode executar o seguinte com a ajuda das APIs listadas:

  • Crie aplicativos ou integre aplicativos existentes no ciclo de vida da reunião.
  • Use APIs para tornar seu aplicativo ciente da reunião.
  • Selecione as APIs necessárias para melhorar a experiência de reunião.

Observação

Use a biblioteca de clientes JavaScript do Microsoft Teams (TeamsJS) (Versão: 1.10 e posterior) para que o SSO (logon único) funcione no painel do lado da reunião.

A tabela a seguir fornece uma lista de APIs disponíveis na biblioteca JavaScript do Microsoft Teams e Microsoft Bot Framework SDKs:

Método Descrição Source
Get contexto do usuário Obtenha informações contextuais para exibir conteúdo relevante em uma guia do Microsoft Teams. Biblioteca do TeamsJS
Obter participante Buscar informações do participante por ID de reunião e ID do participante. SDK do Microsoft Bot Framework
Enviar notificação na reunião Fornece sinais de reunião usando a API de notificação de conversa existente para chat usuário-bot e permite que o bot notifique a ação do usuário que mostra uma notificação em reunião. SDK do Microsoft Bot Framework
Get meeting details Obter metadados estáticos de uma reunião. SDK do Microsoft Bot Framework
Enviar legendas em tempo real Envie legendas em tempo real para uma reunião em andamento. Biblioteca do TeamsJS
Compartilhar Conteúdo do Aplicativo na Janela de Conteúdo Compartilhado Compartilhe partes específicas do aplicativo para o estágio de reunião no painel lateral do aplicativo em uma reunião. Biblioteca do TeamsJS
Receber eventos de reunião do Teams em tempo real Receba eventos de reunião em tempo real, como início e término da reunião ou ingresso e saída do participante. SDK do Microsoft Bot Framework
Obter estado de áudio de entrada Permite que um aplicativo obtenha a configuração de estado de áudio de entrada para o usuário da reunião. Biblioteca do TeamsJS
Alternar áudio de entrada Permite que um aplicativo alterne a configuração de estado de áudio de entrada para o usuário da reunião de mudo para unmute ou vice-versa. Biblioteca do TeamsJS

Obter API de contexto do usuário

Importante

  • Por padrão, o novo cliente do Teams dá suporte a um tema leve para aplicativos em reuniões do Teams. Quando a app.theme propriedade na API getContext retorna o valor, o default cliente do Teams está no tema leve.
  • A versão anterior dos clientes do Teams só dá suporte ao tema Escuro e Contraste para aplicativos em reuniões do Teams

Para identificar e recuperar informações contextuais para o conteúdo da guia, consulte obter contexto para a guia Teams. meetingId é usado por uma guia em execução no contexto da reunião e é adicionado à carga útil de resposta.

Exemplos

A seguir estão as respostas do TeamsJS v2 para Obter a API de contexto do usuário com base no tipo de reunião, tipo de usuário e tipo de chamada:

  • Tipo de reunião

    A seguir está uma resposta de carga JSON para uma reunião de canal para usuários in-locatários:

    {
        "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
           }
          }
    
  • Tipo de usuário

    A seguir está uma resposta de carga JSON em uma reunião privada agendada para um usuário convidado:

      {
            "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"
            }
      }
    
    
  • Tipo de chamada

    A seguir está uma resposta de carga JSON para uma chamada um-a-um para um usuário in-tenant:

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

Obter API de participante

A API GetParticipant deve ter um registro de bot e uma ID para gerar tokens de autenticação. Para obter mais informações, consulte registro e ID do bot.

Observação

  • O tipo de usuário não está incluído na API getParticipantRole .
  • Não armazene em cache as funções de participante, pois o organizador da reunião pode alterar as funções a qualquer momento.
  • Atualmente, a API GetParticipant só tem suporte para listas de distribuições ou listas com menos de 350 participantes.

Parâmetros de consulta

Dica

Obtenha IDs de participantes e IDs de locatários na guia Autenticação SSO.

A API Meeting deve ter meetingId, participantId e tenantId como parâmetros de URL. Os parâmetros estão disponíveis como parte da biblioteca de clientes JavaScript do Microsoft Teams (TeamsJS) e da atividade de bot.

A tabela a seguir inclui os parâmetros de consulta:

Valor Tipo Obrigatório Descrição
meetingId Cadeia de caracteres Sim O identificador de reunião está disponível por meio da biblioteca Bot Invoke e TeamsJS.
participantId Cadeia de caracteres Sim A ID do participante é a ID de usuário. Ele está disponível na biblioteca Tab SSO, Bot Invoke e TeamsJS. É recomendável obter uma ID de participante do SSO da guia.
tenantId Cadeia de caracteres Sim A ID do locatário é necessária para os usuários do locatário. Ele está disponível na biblioteca Tab SSO, Bot Invoke e TeamsJS. É recomendável obter uma ID de locatário do SSO da guia.

Exemplo

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);
}
Nome da propriedade Descrição
user.id ID do usuário.
user.aadObjectId Microsoft Entra ID do objeto do usuário.
user.name Nome do usuário.
user.givenName Primeiro nome do usuário.
user.sobrenome Sobrenome do usuário.
user.email ID de email do usuário.
user.userPrincipalName UPN do usuário.
user.tenantId Microsoft Entra ID do locatário.
user.userRole Função do usuário. Por exemplo, 'administrador' ou 'user'.
meeting.role A função do participante na reunião. Por exemplo, "Organizador" ou "Apresentador" ou "Participante".
meeting.inMeeting O valor que indica se o participante está na reunião.
conversation.id A ID do chat da reunião.
conversation.isGroup Booliano indicando se a conversa tem mais de dois participantes.

Códigos de resposta

A tabela a seguir fornece os códigos de resposta:

Código da resposta Descrição
403 Obter informações do participante não é compartilhado com o aplicativo. Se o aplicativo não estiver instalado na reunião, ele disparará a resposta de erro 403. Se o administrador do locatário desabilitar ou bloquear o aplicativo durante a migração ao vivo do site, ele disparará a resposta de erro 403.
200 As informações do participante são recuperadas com êxito.
401 O aplicativo responde com um token inválido.
404 A reunião expirou ou os participantes não estão disponíveis.

Enviar uma notificação na reunião

Todos os usuários em uma reunião recebem as notificações enviadas por meio da carga de notificação na reunião. A carga de notificação na reunião dispara uma notificação na reunião e permite que você forneça sinais de reunião que são entregues usando a API de notificação de conversa existente para chat de bot do usuário. Você pode enviar uma notificação na reunião com base na ação do usuário. A carga está disponível por meio dos Serviços de Bot.

Você também pode enviar uma notificação de reunião direcionada a um participante específico em uma reunião. Para obter mais informações, consulte Notificação de destino na reunião.

Observação

  • Quando uma notificação na reunião é invocada, o conteúdo é apresentado como uma mensagem de chat.
  • Você deve invocar a função submitTask() para ignorar automaticamente depois que um usuário executar uma ação no modo de exibição da Web. Esse é um requisito para o envio do aplicativo. Para obter mais informações, consulte Módulo de tarefas do SDK do Teams.
  • Se você quiser que seu aplicativo seja compatível com usuários anônimos, o conteúdo da solicitação de invocação inicial deverá depender do objeto from.id para solicitar metadados em from e não nos metadados de solicitação from.aadObjectId. from.idé a ID do usuário e from.aadObjectId é o Microsoft Entra ID do usuário. Para obter mais informações, consulte usando módulos de tarefa em guias e criar e enviar o módulo de tarefa.

Parâmetro de consulta

A tabela a seguir inclui o parâmetro de consulta:

Valor Tipo Obrigatório Descrição
conversationId String Sim O identificador de conversa está disponível como parte do Bot Invoke.

Exemplos

Bot ID é declarado no manifesto e o bot recebe um objeto de resultado.

Observação

  • O parâmetro completionBotId do externalResourceUrl é opcional no exemplo de carga solicitado.
  • Os externalResourceUrl largura e altura devem estar em pixels. Para obter mais informações, consulte diretrizes de design.
  • A URL é a página, que é carregada como <iframe> na notificação na reunião. O domínio deve estar na matriz validDomains no manifesto do aplicativo.
// 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);
Nome da propriedade Descrição
type Tipo de atividade.
text O conteúdo do texto da mensagem.
resumo O texto de resumo da mensagem.
channelData.notification.alertInMeeting Booliano indicando se uma notificação deve ser mostrada ao usuário durante uma reunião.
channelData.notification.externalResourceUrl O valor da URL de recurso externo da notificação.
replyToId A ID da mensagem pai ou raiz do thread.
APP_ID ID do aplicativo declarada em manifesto.
completionBotId ID do aplicativo bot.

Códigos de resposta

A tabela a seguir inclui os códigos de resposta:

Código da resposta Descrição
201 A atividade com sinal foi enviada com êxito.
401 O aplicativo responde com um token inválido.
403 O aplicativo não pode enviar o sinal. O código de resposta 403 pode ocorrer devido a vários motivos, como o administrador de locatários desabilita e bloqueia o aplicativo durante a migração ao vivo do site. Nesse caso, a carga contém uma mensagem de erro detalhada.
404 O chat da reunião não existe.

Notificação de reunião direcionada e a API de falsificação de ícone de aplicativo

A targetedMeetingNotification API permite que os aplicativos enviem notificações direcionadas na reunião e mostra a má configuração do ícone do aplicativo para participantes específicos em uma reunião. Os aplicativos enviam notificações direcionadas na reunião e o ícone do aplicativo com base na ação do usuário. A API está disponível por meio da API do bot.

Pré-requisito

Você deve configurar o manifesto do aplicativo com permissões RSC na webApplicationInfo propriedade para enviar notificações de reunião direcionadas e mostrar a má configuração do ícone do aplicativo para participantes específicos em uma reunião. Use os exemplos a seguir para configurar o manifesto:


Para manifesto de aplicativo versão 1.12 e posterior
"webApplicationInfo": {
    "id": "<<MICROSOFT-APP-ID>>",
    "resource": "https://RscBasedStoreApp"  },
  "authorization": {
    "permissions": {
      "resourceSpecific": [
            {
                "name": "OnlineMeetingNotification.Send.Chat",
                "type": "Application"
            }
        ]    
    }
}


Para manifesto de aplicativo versão 1.11 e anterior
"webApplicationInfo": {
    "id": "<<MICROSOFT-APP-ID>>",
    "resource": "https://RscBasedStoreApp",
    "applicationPermissions": [
      "OnlineMeetingNotification.Send.Chat"
    ]
}

Observação

  • O conteúdo da API permite apenas uma caixa de diálogo com uma URL.
  • Os formatos de ID do usuário aadObjectid e UPN não têm suporte.

Obtenha o formato de ID do usuário com suporte para a notificação na reunião e a má configuração do ícone do aplicativo:

Exemplo

A seguir está um exemplo de carga de solicitação para a notificação de reunião direcionada e a má configuração do ícone do aplicativo:

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"      } 
    ] 
  }
}
Nome da propriedade Descrição
meetingId A ID da reunião está disponível por meio da invocação de bot e da biblioteca do TeamsJS.
type targetedMeetingNotification
recipients Lista de IDs de usuário. Obtenha IDs de usuário para participantes da reunião por meio da API Do participante. Obtenha a lista inteira da lista de chats usando a API Obter membros. A lista de destinatários vazios ou nulos retornará 400.
surface Um tipo de superfície. Os tipos de superfície com suporte são meetingStage e meetingTabIcon.
surfaces Lista de superfícies em que as notificações podem ser renderizadas.
contentType Tipo de conteúdo que a notificação de reunião direcionada renderiza. O valor com suporte é task.
content TaskModuleContinueResponse
content.value.height Opcional; altura solicitada da notificação.
content.value.width Opcional; largura solicitada da notificação.
content.value.title Opcional; título da notificação.
content.value.url Opcional; URL a ser renderizada na notificação. Verifique se a URL faz parte do manifesto do validDomains aplicativo. Se uma cadeia de caracteres vazia ou nenhuma URL for fornecida, nada será renderizado em uma notificação de reunião.
ChannelData.OnBehalfOf Opcional; isso é para dar suporte a atributos de usuário.
onBehalfOf.itemid Descreve a identificação do item. Seu valor deve ser 0.
onBehalfOf.mentionType personpalavra-chave. Descreve o menção de uma pessoa.
onBehalfOf.mri MrI de usuário mostrada como remetente.
onBehalfOf.displayName Opcional; nome do person. Usado como fallback caso a resolução de nomes não esteja disponível.

Observação

Se você fornecer uma entrada inválida, a API retornará o código status 400.

Código da resposta

A tabela a seguir inclui os códigos de resposta:

Código da resposta Descrição
202 A notificação é enviada com êxito.
207 As notificações são enviadas apenas para alguns participantes.
400 Falha na validação da solicitação de notificação de reunião.
401 O token bot é inválido.
403 O bot não tem permissão para enviar a notificação.
404 O chat da reunião não foi encontrado ou nenhum dos participantes foi encontrado na lista.

Obter API de detalhes da reunião

A API de detalhes da reunião permite que seu aplicativo obtenha metadados estáticos de uma reunião. Os metadados fornecem pontos de dados que não são alterados dinamicamente. A API está disponível por meio dos Serviços de Bot. Atualmente, reuniões agendadas ou recorrentes privadas e canal agendadas ou recorrentes dão suporte à API de suporte a reuniões com diferentes permissões de RSC, respectivamente.

A API de detalhes da reunião deve ter um registro de bot e uma ID do bot. Ele requer que o SDK do Bot obtenha TurnContext. Para usar a API de detalhes da reunião, você deve obter permissão RSC diferente com base no escopo de qualquer reunião, como reunião privada ou reunião de canal.

Observação

A API de detalhes da reunião tem suporte para reuniões privadas agendadas, reunião de canal agendada, reuniões instantâneas (Atender agora), chamadas um a um e chamadas em grupo em clientes móveis e área de trabalho do Teams.

Pré-requisito

Para usar a API de detalhes da reunião, você deve obter permissão RSC diferente com base no escopo de qualquer reunião, como reunião privada ou reunião de canal.


Para manifesto de aplicativo versão 1.12 e posterior

Use o exemplo a seguir para configurar as propriedades e authorization do manifesto do webApplicationInfo aplicativo para qualquer reunião privada:

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

Use o exemplo a seguir para configurar as propriedades webApplicationInfo e authorization para qualquer reunião de canal:

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


Para manifesto de aplicativo versão 1.11 e anterior

Use o exemplo a seguir para configurar a propriedade webApplicationInfo do manifesto do aplicativo para qualquer reunião privada:

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

Use o exemplo a seguir para configurar a propriedade webApplicationInfo do manifesto do aplicativo para qualquer reunião de canal:

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

Observação

  • Se a ChannelMeeting.ReadBasic.Group permissão for adicionada ao manifesto, o bot receberá os eventos de início ou término da reunião automaticamente das reuniões de canal criadas em todas as equipes em que o bot é adicionado.
  • Para uma chamada organizer individual, é o iniciador do chat e para chamadas organizer em grupo é o iniciador de chamadas. Para reuniões organizer de canal público é a pessoa que criou a postagem do canal.

Parâmetro de consulta

A tabela a seguir lista o parâmetro de consulta:

Valor Tipo Obrigatório Descrição
meetingId Cadeia de caracteres Sim O identificador de reunião está disponível por meio do Bot Invoke e da biblioteca do TeamsJS.

Exemplo

// 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));
Nome da propriedade Descrição
details.id A ID da reunião, codificada como uma cadeia de caracteres BASE64.
details.msGraphResourceId O MsGraphResourceId, usado especificamente para chamadas de ms API do Graph.
details.scheduledStartTime A hora de início agendada da reunião, em UTC.
details.scheduledEndTime A hora de término agendada da reunião, em UTC.
details.joinUrl A URL usada para ingressar na reunião.
details.title O título da reunião.
details.type O tipo da reunião (OneToOneCall, GroupCall, Scheduled, Recurring, MeetNow, ChannelScheduled e ChannelRecurring).
conversation.isGroup Booliano indicando se a conversa tem mais de dois participantes.
conversation.conversationType O tipo de conversa.
conversation.id A ID do chat da reunião.
organizer.id A ID do usuário do Organizador.
organizer.aadObjectId A ID do objeto Microsoft Entra do Organizador.
organizer.tenantId A ID do locatário Microsoft Entra organizador.

No caso do tipo de reunião recorrente:

startDate: especifica a data para começar a aplicar o padrão. O valor de startDate deve corresponder ao valor de data da propriedade inicial no recurso de evento. A primeira ocorrência da reunião pode não ocorrer nesta data se não se ajustar ao padrão.

endDate: especifica a data para parar de aplicar o padrão. A última ocorrência da reunião pode não ocorrer nesta data se não se ajustar ao padrão.

API de envio de legendas em tempo real

A API enviar legendas em tempo real expõe um ponto de extremidade POST para legendas CART (conversão em tempo real) de acesso de comunicação do Teams, legendas fechadas com tipo humano. O conteúdo de texto enviado para este ponto de extremidade aparece para usuários finais em uma reunião do Teams quando eles têm legendas habilitadas.

URL DO CART

Você pode obter a URL do CART para o ponto de extremidade POST na página Opções de reunião em uma reunião do Teams. Para obter mais informações, consulte legendas CART em uma reunião do Microsoft Teams. Você não precisa modificar a URL do CART para usar legendas CART.

Parâmetro de Consulta

A URL do CART inclui os seguintes parâmetros de consulta:

Valor Tipo Obrigatório Descrição
meetingId Cadeia de caracteres Sim O identificador de reunião está disponível por meio do Bot Invoke e da biblioteca do TeamsJS.
Por exemplo, 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 Cadeia de caracteres Sim Token de autorização.
Por exemplo, token=04751eac

Exemplo

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étodo

Resource Método Descrição
/cartcaption POSTAR Manipular legendas para a reunião, que foi iniciada

Observação

Verifique se o tipo de conteúdo para todas as solicitações é texto sem formatação com codificação UTF-8. O corpo da solicitação contém apenas legendas.

Exemplo

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. 

Observação

Cada solicitação POST gera uma nova linha de legendas. Para garantir que o usuário final tenha tempo suficiente para ler o conteúdo, limite cada corpo da solicitação POST a 80 a 120 caracteres.

Códigos de erro

A tabela a seguir fornece os códigos de erro:

Código de erro Descrição
400 Solicitação incorreta. O corpo da resposta tem mais informações. Por exemplo, não de todos os parâmetros necessários apresentados.
401 Não autorizado. Token inválido ou expirado. Se você receber esse erro, gere uma nova URL do CART no Teams.
404 Reunião não encontrada ou não iniciada. Se você receber esse erro, certifique-se de iniciar a reunião e selecione iniciar legendas. Depois que as legendas forem habilitadas na reunião, você poderá começar a POSTing de legendas na reunião.
500 Erro de servidor interno. Para obter mais informações, contate o suporte ou forneça comentários.

Receber eventos de reunião do Teams em tempo real

Você pode receber eventos de reunião em tempo real, como início e término da reunião ou participação do participante e sair de eventos.

Receber eventos de início e término da reunião

Observação

Há suporte para eventos de início e término de reunião para reuniões agendadas e de canal.

O usuário pode receber eventos de reunião em tempo real. Assim que qualquer aplicativo é associado a uma reunião, a hora real de início e término da reunião é compartilhada com o bot. A hora real de início e término de uma reunião é diferente da hora de início e término agendada. A API de detalhes da reunião fornece o horário de início e término agendados. O evento fornece a hora real de início e término.

Se as ChannelMeeting.ReadBasic.Group permissões e OnlineMeeting.ReadBasic.Chat forem adicionadas no manifesto, o bot começará a receber automaticamente os eventos de início ou término da reunião para os tipos de reunião agendados e de canal.

Pré-requisito

O manifesto do aplicativo deve ter a propriedade webApplicationInfo para receber os eventos de início e término da reunião. Use os exemplos a seguir para configurar o manifesto:


Para manifesto de aplicativo versão 1.12 e posterior
"webApplicationInfo": {
    "id": "<bot id>",
    "resource": "https://RscPermission",
    },
"authorization": {
    "permissions": {
        "resourceSpecific": [
            {
                "name": "OnlineMeeting.ReadBasic.Chat",
                "type": "Application"
            }
            {
                "name": "ChannelMeeting.ReadBasic.Group",
                "type": "Application"
            }
        ]    
    }
}


Para manifesto de aplicativo versão 1.11 e anterior
"webApplicationInfo": {
    "id": "<bot id>",
    "resource": "https://RscPermission",
    "applicationPermissions": [
      "OnlineMeeting.ReadBasic.Chat",
      "ChannelMeeting.ReadBasic.Group"
    ]
}

Exemplo de como obter eventos de início ou término de reunião

O bot recebe os eventos de início e término da reunião por meio dos OnTeamsMeetingStartAsync manipuladores e OnTeamsMeetingEndAsync . As informações relacionadas ao evento de reunião fazem parte do MeetingStartEventDetails objeto, que inclui os campos de metadados como, , titlemeetingType, id, joinUrl, startTimee EndTime.

Observação

  • Obtenha a ID da reunião turnContext.ChannelData.
  • Não use a ID da conversa como ID da reunião.
  • Não use a ID de reunião do conteúdo de eventos de reunião turncontext.activity.value.

Os exemplos a seguir mostram como capturar os eventos de início e término da reunião:

Evento de Início da Reunião

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

Evento de Término da Reunião

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

Exemplo de conteúdo do evento de início da reunião

O código a seguir fornece um exemplo de conteúdo do evento de início da reunião:

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

Exemplo de conteúdo do evento final da reunião

O código a seguir fornece um exemplo de conteúdo de evento final de reunião:

{
  "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"
    }
  }
}
Nome da propriedade Descrição
name Nome do usuário.
type Tipo de atividade.
timestamp Data e hora locais da mensagem, expressas no formato ISO-8601.
id ID da atividade.
channelId Canalizar essa atividade está associado.
Serviceurl URL de serviço para onde as respostas a essa atividade devem ser enviadas.
from.id ID do usuário que enviou a solicitação.
from.aadObjectId Microsoft Entra ID do objeto do usuário que enviou a solicitação.
conversation.isGroup Booliano indicando se a conversa tem mais de dois participantes.
conversation.tenantId Microsoft Entra ID do locatário da conversa ou reunião.
conversation.id A ID do chat da reunião.
recipient.id ID do usuário que recebe a solicitação.
recipient.name Nome do usuário que recebe a solicitação.
entities.locale entidade que contém metadados sobre a localidade.
entities.country entidade que contém metadados sobre o país.
entities.type entidade que contém metadados sobre o cliente.
channelData.tenant.id Microsoft Entra ID do locatário.
channelData.source O nome de origem de onde o evento é disparado ou invocado.
channelData.meeting.id A ID padrão associada à reunião.
Valor. MeetingType O tipo de reunião.
Valor. Título O assunto da reunião.
Valor. Id A ID padrão associada à reunião.
Valor. JoinUrl A URL de junção da reunião.
Valor. Starttime A hora de início da reunião no UTC.
Valor. Endtime A hora de término da reunião em UTC.
locale A localidade da mensagem definida pelo cliente.

Receber eventos participantes da reunião

Seu bot pode receber eventos de reunião em tempo real, como participar e deixar eventos. Um bot só poderá receber os eventos participantes se for inscrito nesses eventos no Portal do Desenvolvedor.

Observação

  • Os eventos participantes têm suporte apenas para reuniões agendadas.
  • Para que um bot receba eventos participantes, verifique se você adiciona o bot à reunião antes de um participante ingressar ou sair da reunião.

Para assinar eventos participantes, siga estas etapas:

  1. No Portal do Desenvolvedor , abra seu aplicativo bot ou importe um aplicativo existente.

  2. Na seção Assinaturas de evento reunião , selecione os eventos:

    • Ingresso do participante
    • Saída do participante
  3. Selecione Salvar

    A captura de tela mostra como o portal do desenvolvedor é exibido para eventos participantes.

  4. Verifique se a OnlineMeetingParticipant.Read.Chat permissão RSC está configurada no manifesto do aplicativo.

    Se seu aplicativo não tiver a permissão RSC, adicione-a por meio da seção Configurar>permissões do seu aplicativo no Portal do Desenvolvedor. Para obter mais informações, consulte permissões RSC.

Os exemplos a seguir mostram como capturar a junção do participante e deixar eventos:

Referência de código de exemplo

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

A seguir estão os exemplos do participante ingressar e deixar cargas de eventos:

Veja a seguir um exemplo do conteúdo do evento de junção do participante:

{ 

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

Obter estado de áudio de entrada

A getIncomingClientAudioState API permite que um aplicativo obtenha a configuração de estado de áudio de entrada para o usuário da reunião. A API está disponível por meio da biblioteca do TeamsJS.

Observação

  • A getIncomingClientAudioState API para dispositivos móveis está disponível na Versão Prévia do Desenvolvedor Público.
  • A toggleIncomingClientAudio API está disponível no novo cliente do Teams.
  • O consentimento específico do recurso está disponível para versões 1.12 e posteriores do manifesto, portanto, essa API não funciona para versões de manifesto versão 1.11 e anteriores.

Manifesto

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

Exemplo

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)

Parâmetro de consulta

A tabela a seguir inclui o parâmetro de consulta:

Valor Tipo Obrigatório Descrição
callback Cadeia de caracteres Sim O retorno de chamada contém dois parâmetros error e result. O erro pode conter um tipo SdkError de erro ou null quando a busca de áudio for bem-sucedida. O resultado pode conter valor verdadeiro ou falso quando a busca de áudio for bem-sucedida ou nula quando a busca de áudio falhar. O áudio de entrada será silenciado se o resultado for verdadeiro e desmutado se o resultado for falso.

Códigos de resposta

A tabela a seguir fornece os códigos de resposta:

Código da resposta Descrição
500 Erro interno.
501 A API não tem suporte no contexto atual.
1.000 O aplicativo não tem permissões adequadas para permitir que o compartilhamento seja estágio.

Alternar áudio de entrada

A toggleIncomingClientAudio API permite que um aplicativo alterne a configuração de estado de áudio de entrada para o usuário da reunião de mudo para unmute ou vice-versa. A API está disponível por meio da biblioteca do TeamsJS.

Observação

  • A toggleIncomingClientAudio API para dispositivos móveis está disponível na Versão Prévia do Desenvolvedor Público.
  • O consentimento específico do recurso está disponível para versões 1.12 e posteriores do manifesto, portanto, essa API não funciona para versões de manifesto versão 1.11 e anteriores.

Manifesto

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

Exemplo

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)

Parâmetro de consulta

A tabela a seguir inclui o parâmetro de consulta:

Valor Tipo Obrigatório Descrição
callback Cadeia de caracteres Sim O retorno de chamada contém dois parâmetros error e result. O erro pode conter um tipo SdkError de erro ou null quando o alternância for bem-sucedido. O resultado pode conter valor verdadeiro ou falso, quando o alternância for bem-sucedido ou nulo quando o alternância falhar. O áudio de entrada será silenciado se o resultado for verdadeiro e desmutado se o resultado for falso.

Código da resposta

A tabela a seguir fornece os códigos de resposta:

Código da resposta Descrição
500 Erro interno.
501 A API não tem suporte no contexto atual.
1.000 O aplicativo não tem permissões adequadas para permitir que o compartilhamento seja estágio.

Exemplo de código

Nome do exemplo Descrição .NET Node.js Manifesto
Extensibilidade de reuniões Exemplo de extensibilidade de reunião do Teams para passar tokens. View View View
Notificação na reunião Demonstra como implementar a notificação em reunião usando o bot. View View View
Painel lateral da reunião Exemplo de extensibilidade de reunião do Teams para interagir com o painel lateral em reunião. View Exibir
Guia Detalhes na Reunião Este aplicativo de exemplo mostra o recurso de extensibilidade de reunião do Teams em que o usuário pode criar uma pesquisa e os membros podem responder à votação na reunião. View View Exibir
Exemplo de eventos de reunião Este exemplo mostra eventos de reunião do Teams em tempo real usando bot. View View View
Exemplo de convite de reunião Este aplicativo de exemplo mostra uma experiência de reunião para o cenário de recrutamento usando Aplicativos em Reuniões. View View Exibir

Confira também