Neste tutorial, mostramos como usar a API REST do Google Meet com a API Events do Google Workspace e o Google Cloud Pub/Sub para observar e reagir a eventos da reunião. O aplicativo de amostra registra o início e o término de uma conferência, o momento em que os participantes entram ou saem e quando os artefatos gerados na reunião estão disponíveis.
Para saber mais sobre como trabalhar com eventos, consulte Inscrever-se em eventos do Google Meet na documentação da API Events do Google Workspace.
Pré-requisitos
Se você precisar ativar algum destes pré-requisitos para sua organização, peça ao administrador do Google Workspace para ativá-lo:
- Uma conta do Google Workspace com acesso ao Google Meet.
- Acesso para criar um projeto do Google Cloud.
- Python 3 instalado.
- A gcloud CLI instalada.
Prepare o ambiente
Nesta seção, mostramos como criar e configurar o ambiente local e o projeto do Google Cloud para este tutorial.
Criar um diretório de trabalho e um ambiente virtual do Python
Para criar e ativar um novo ambiente virtual, execute os seguintes comandos no seu terminal.
Linux/macOS
mkdir meet-tutorial
cd meet-tutorial
python3 -mvenv env
source env/bin/activate
Windows (prompt de comando)
mkdir meet-tutorial
cd meet-tutorial
python3 -mvenv env
env/bin/activate.bat
Windows (PowerShell)
mkdir meet-tutorial
cd meet-tutorial
python3 -mvenv env
env/bin/activate.ps1
Criar um projeto do Google Cloud
Console do Google Cloud
- No console do Google Cloud, acesse Menu > IAM e administrador > Criar um projeto.
-
No campo Nome do projeto, digite um nome descritivo para o projeto.
Opcional: para mudar o ID do projeto, clique em Editar. O ID do projeto não pode ser alterado após a criação dele. Portanto, escolha um ID que atenda às suas necessidades durante a vida útil do projeto.
- No campo Local, clique em Procurar para exibir possíveis locais para seu projeto. Em seguida, clique em Selecionar.
- Clique em Criar. O console do Google Cloud navega até a página "Painel", e seu projeto é criado em alguns minutos.
CLI da gcloud
Em um dos seguintes ambientes de desenvolvimento, acesse a CLI do Google Cloud ("gcloud"):
-
Cloud Shell: para usar um terminal on-line com a CLI gcloud
já configurada, ative o Cloud Shell.
Ative o Cloud Shell -
Shell local: para usar um ambiente de desenvolvimento local,
instale e
initialize
a CLI gcloud.
Para criar um projeto do Cloud, use o comando "gcloud projects create":gcloud projects create PROJECT_ID
Ativar o faturamento para o projeto do Google Cloud
Console do Google Cloud
- No console do Google Cloud, acesse Faturamento. Clique em Menu > Faturamento > Meus projetos.
- Em Selecionar uma organização, escolha a organização associada ao seu projeto do Google Cloud.
- Na linha do projeto, abra o menu Ações ( ), clique em Alterar faturamento e escolha a conta do Cloud Billing.
- Clique em Definir conta.
CLI da gcloud
- Para listar as contas de faturamento disponíveis, execute:
gcloud billing accounts list
- Vincule uma conta de faturamento a um projeto do Google Cloud:
gcloud billing projects link PROJECT_ID --billing-account=BILLING_ACCOUNT_ID
Substitua:
PROJECT_ID
é o ID do projeto do Cloud em que você quer ativar o faturamento.BILLING_ACCOUNT_ID
é o ID da conta de faturamento que será vinculada ao projeto do Google Cloud.
Configurar a autenticação e a autorização
A autenticação e a autorização permitem que o app acesse os recursos da API REST do Meet. A autorização do usuário é necessária para chamar a API REST do Meet. Nesta seção, explicamos como configurar as credenciais do usuário e solicitar autorização.
Configurar a tela de permissão OAuth e escolher escopos
As etapas a seguir sugerem informações de marcador de posição para configurar a tela de permissão OAuth do app. Antes de publicar o app externamente, atualize essas informações.
- No console do Google Cloud, acesse Menu > APIs e serviços > Tela de permissão OAuth.
- Em Tipo de usuário, selecione Interno e clique em Criar.
- Em Nome do app, insira
Meet REST API Tutorial
. - Preencha o formulário de registro do app e clique em Salvar e continuar.
- Clique em Adicionar ou remover escopos. Um painel é exibido com uma lista de escopos para cada API ativada no projeto do Google Cloud.
- Em Adicionar escopos manualmente, cole os seguintes escopos:
https://www.googleapis.com/auth/meetings.space.created
- Clique em Adicionar à tabela.
- Clique em Atualizar.
- Depois de selecionar os escopos exigidos pelo app, clique em Save and Continue.
- Se você tiver selecionado Externo como tipo de usuário, adicione usuários de teste:
- Em Usuários de teste, clique em Adicionar usuários.
- Insira seu endereço de e-mail e outros usuários de teste autorizados e clique em Salvar e continuar.
- Analise o resumo de registro do seu app. Para fazer mudanças, clique em Editar. Se o registro do app estiver correto, clique em Voltar para o painel.
Criar um ID de cliente
O ID do cliente funciona como credenciais para o aplicativo durante os fluxos do OAuth 2.0. Como o app é executado localmente, crie um ID do cliente de área de trabalho.
- No console do Google Cloud, acesse Menu > APIs e serviços > Credenciais.
- Clique em Criar credenciais > ID do cliente OAuth.
- Clique em Tipo de aplicativo > App para computador.
- No campo Nome, digite um nome para a credencial. Ele só aparece no console do Google Cloud.
- Clique em Criar. A tela cliente OAuth criado é exibida, mostrando seu novo ID e chave secreta do cliente.
- Clique em OK. A credencial recém-criada aparece em IDs do cliente OAuth 2.0.
Instalar as bibliotecas de autenticação do Google
Instale as bibliotecas de autenticação do Google:
pip install google-auth google-auth-oauthlib
Executar autorização
A API REST do Meet requer credenciais de usuário na forma de um token de acesso OAuth 2.0. Nesta seção, você implementa o fluxo do OAuth 2.0 para solicitar um token de acesso e um token de atualização para o usuário.
No seu diretório de trabalho, crie o arquivo
main.py
e adicione o seguinte conteúdo:import os import json from google.auth.transport import requests from google.oauth2.credentials import Credentials from google_auth_oauthlib.flow import InstalledAppFlow def authorize() -> Credentials: """Ensure valid credentials for calling the Meet REST API.""" CLIENT_SECRET_FILE = "./client_secret.json" credentials = None if os.path.exists('token.json'): credentials = Credentials.from_authorized_user_file('token.json') if credentials is None: flow = InstalledAppFlow.from_client_secrets_file( CLIENT_SECRET_FILE, scopes=[ 'https://www.googleapis.com/auth/meetings.space.created', ]) flow.run_local_server(port=0) credentials = flow.credentials if credentials and credentials.expired: credentials.refresh(requests.Request()) if credentials is not None: with open("token.json", "w") as f: f.write(credentials.to_json()) return credentials USER_CREDENTIALS = authorize()
Para executar o código, o ID do cliente e a chave secreta criada anteriormente são necessários. Copie o arquivo da chave secreta do cliente salvo no diretório de trabalho do projeto e renomeie-o como
client_secret.json
.Se você quiser testar como a autorização funciona, execute o comando a seguir. O app solicita autorização e cria um arquivo
token.json
no diretório de trabalho do projeto após a aprovação da solicitação.python3 main.py
Adicionar a API REST do Meet
Agora que o código de autorização está concluído, é hora de ativar e chamar a API REST do Meet.
Ativar as APIs
Embora esta seção se concentre na API REST do Meet, este tutorial também usa o Google Cloud Pub/Sub e a API de eventos do Google Workspace.
Console do Google Cloud
No console do Google Cloud, ative a API REST do Google Meet, a API Events do Google Workspace e o Google Cloud Pub/Sub.
Confirme se você está ativando as APIs no projeto correto do Cloud e clique em Próxima.
Confirme se você ativou as APIs corretas e clique em Ativar.
CLI da gcloud
Se necessário, defina o projeto atual do Cloud para aquele que você criou com o comando
gcloud config set project
:gcloud config set project PROJECT_ID
Substitua PROJECT_ID pelo ID do projeto do projeto do Cloud que você criou.
Ative a API REST do Google Meet, a API de eventos do Google Workspace e o Google Cloud Pub/Sub com o comando
gcloud services enable
:gcloud services enable meet.googleapis.com workspaceevents.googleapis.com pubsub.googleapis.com
Instalar a biblioteca de cliente da API REST do Meet
Siga estas etapas para instalar a biblioteca de cliente da API REST do Meet:
Execute o comando:
pip install google-apps-meet
Edite o arquivo
main.py
para importar o cliente:from google.apps import meet_v2 as meet
Criar um espaço
Agora que a API REST do Meet está disponível, defina uma função para criar um espaço para reuniões em que você pode se inscrever.
Edite main.py
e adicione:
def create_space() -> meet.Space:
"""Create a meeting space."""
client = meet.SpacesServiceClient(credentials=USER_CREDENTIALS)
request = meet.CreateSpaceRequest()
return client.create_space(request=request)
Inscrever-se em eventos
Para receber eventos sobre um espaço para reuniões, crie uma assinatura usando a API Google Workspace Events. Você também precisa criar e se inscrever em um tópico do Google Cloud Pub/Sub que serve como o endpoint de notificação em que seu app recebe os eventos.
Configurar o Google Cloud Pub/Sub
Para criar e assinar um tópico do Pub/Sub:
Console do Google Cloud
- No console do Google Cloud, acesse Menu > Pub/Sub.
Verifique se o projeto do Cloud para seu app está selecionado.
- Clique em
- Digite
workspace-events
como o nome do tópico. - Deixe a opção Adicionar uma assinatura padrão selecionada.
- Clique em Criar. O nome completo do tópico está formatado como
projects/{project}/topics/{topic}
. Anote esse nome para usar em etapas posteriores.
Criar tópico e faça o
seguinte:
- Digite
- Conceda acesso para publicar mensagens do Pub/Sub no seu tópico:
- No painel lateral, abra a guia Permissões.
- Clique em Adicionar principal.
- Em Novos principais, digite
meet-api-event-push@system.gserviceaccount.com
. - Em Atribuir funções, selecione
Pub/Sub Publisher
. - Clique em Salvar.
A atualização das permissões do seu tópico pode levar alguns minutos.
CLI da gcloud
- No projeto do Cloud, crie um tópico executando o seguinte comando:
gcloud pubsub topics create workspace-events
A saída exibe o nome completo do tópico, formatado como
projects/{project}/topics/{topic}
. Anote esse nome para usar em etapas posteriores. - Conceder acesso para publicar mensagens no seu tópico:
gcloud pubsub topics add-iam-policy-binding workspace-events --member='serviceAccount:meet-api-event-push@system.gserviceaccount.com' --role='roles/pubsub.publisher'
A atualização das permissões do seu tópico pode levar alguns minutos.
- Crie uma assinatura do Pub/Sub para o tópico:
gcloud pubsub subscriptions create workspace-events-sub --topic=TOPIC_NAME
Substitua:
TOPIC_NAME
: o nome do tópico que você criou na etapa anterior.
Anote o nome do tópico e verifique se o valor de {project}
é o
ID do projeto do Cloud do seu app. Você vai usar o nome do tópico para criar a
assinatura do Google Workspace mais tarde.
Crie uma conta de serviço
Console do Google Cloud
- No console do Google Cloud, acesse Menu > IAM e administrador > Contas de serviço.
- Clique em Criar conta de serviço.
- Preencha os detalhes da conta de serviço e clique em Criar e continuar.
- Opcional: atribua papéis à sua conta de serviço para conceder acesso aos recursos do seu projeto do Google Cloud. Confira mais detalhes em Como conceder, alterar e revogar acesso a recursos.
- Clique em Continuar.
- Opcional: insira usuários ou grupos que podem gerenciar e realizar ações com essa conta de serviço. Para mais detalhes, consulte Como gerenciar a representação de uma conta de serviço.
- Clique em Concluído. Anote o endereço de e-mail da conta de serviço.
CLI da gcloud
- Crie a conta de serviço:
gcloud iam service-accounts create meet-event-listener \ --display-name="meet-event-listener"
- Opcional: atribua papéis à sua conta de serviço para conceder acesso aos recursos do seu projeto do Google Cloud. Confira mais detalhes em Como conceder, alterar e revogar acesso a recursos.
Usar a conta de serviço
Depois de criar a conta de serviço, conceda a si mesmo acesso para personificar a conta de serviço.
Console do Google Cloud
- Na coluna Ações da conta de serviço recém-criada, clique em > Gerenciar permissões.
- Clique em Adicionar chave > Conceder acesso.
- Digite seu endereço de e-mail em Adicionar participantes.
- Selecione Contas de serviço > Criador de token de conta de serviço como o papel.
- Clique em Salvar.
CLI da gcloud
- Para adicionar a permissão, execute
gcloud iam service-accounts add-iam-policy-binding
usando o endereço de e-mail da conta de serviço e do usuário.gcloud iam service-accounts add-iam-policy-binding \ SERVICE_ACCOUNT_EMAIL \ --member="user:YOUR_EMAIL \ --role="roles/iam.serviceAccountTokenCreator"
- Faça login com
gcloud
para definir as credenciais padrão do aplicativo para a conta de serviço. Quando a autorização for solicitada, faça login com a mesma conta usada nas etapas anteriores.gcloud auth application-default login --impersonate-service-account=SERVICE_ACCOUNT_EMAIL
Instalar a biblioteca de cliente do Pub/Sub
Use
pip
para instalar a biblioteca de cliente para o Pub/Sub:pip install google-cloud-pubsub
Em seguida, edite
main.py
para importar o cliente:from google.cloud import pubsub_v1
Criar a assinatura do Google Workspace
Adicione o código a seguir ao main.py
para definir um método de inscrição em
eventos do Meet. Esse código faz a inscrição em todos os eventos de um espaço
para reuniões. Quando inscritos, os eventos são postados no tópico do Pub/Sub.
def subscribe_to_space(space_name: str = None, topic_name: str = None):
"""Subscribe to events for a meeting space."""
session = requests.AuthorizedSession(USER_CREDENTIALS)
body = {
'targetResource': f"//meet.googleapis.com/{space_name}",
"eventTypes": [
"google.workspace.meet.conference.v2.started",
"google.workspace.meet.conference.v2.ended",
"google.workspace.meet.participant.v2.joined",
"google.workspace.meet.participant.v2.left",
"google.workspace.meet.recording.v2.fileGenerated",
"google.workspace.meet.transcript.v2.fileGenerated",
],
"payloadOptions": {
"includeResource": False,
},
"notificationEndpoint": {
"pubsubTopic": topic_name
},
"ttl": "86400s",
}
response = session.post("https://workspaceevents.googleapis.com/v1/subscriptions", json=body)
return response
Em seguida, adicione o código correspondente para extrair e processar os eventos.
Detectar e processar eventos
Continue editando main.py
e adicione o exemplo de código a seguir. Esse código implementa o lado do recebimento e usa a API Google Cloud Pub/Sub para extrair eventos à medida que são disponibilizados. Os vários métodos de gerenciador imprimem informações sobre os eventos correspondentes.
def format_participant(participant: meet.Participant) -> str:
"""Formats a participant for display on the console."""
if participant.anonymous_user:
return f"{participant.anonymous_user.display_name} (Anonymous)"
if participant.signedin_user:
return f"{participant.signedin_user.display_name} (ID: {participant.signedin_user.user})"
if participant.phone_user:
return f"{participant.phone_user.display_name} (Phone)"
return "Unknown participant"
def fetch_participant_from_session(session_name: str) -> meet.Participant:
"""Fetches the participant for a session."""
client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
# Use the parent path of the session to fetch the participant details
parsed_session_path = client.parse_participant_session_path(session_name)
participant_resource_name = client.participant_path(
parsed_session_path["conference_record"],
parsed_session_path["participant"])
return client.get_participant(name=participant_resource_name)
def on_conference_started(message: pubsub_v1.subscriber.message.Message):
"""Display information about a conference when started."""
payload = json.loads(message.data)
resource_name = payload.get("conferenceRecord").get("name")
client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
conference = client.get_conference_record(name=resource_name)
print(f"Conference (ID {conference.name}) started at {conference.start_time.rfc3339()}")
def on_conference_ended(message: pubsub_v1.subscriber.message.Message):
"""Display information about a conference when ended."""
payload = json.loads(message.data)
resource_name = payload.get("conferenceRecord").get("name")
client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
conference = client.get_conference_record(name=resource_name)
print(f"Conference (ID {conference.name}) ended at {conference.end_time.rfc3339()}")
def on_participant_joined(message: pubsub_v1.subscriber.message.Message):
"""Display information about a participant when they join a meeting."""
payload = json.loads(message.data)
resource_name = payload.get("participantSession").get("name")
client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
session = client.get_participant_session(name=resource_name)
participant = fetch_participant_from_session(resource_name)
display_name = format_participant(participant)
print(f"{display_name} joined at {session.start_time.rfc3339()}")
def on_participant_left(message: pubsub_v1.subscriber.message.Message):
"""Display information about a participant when they leave a meeting."""
payload = json.loads(message.data)
resource_name = payload.get("participantSession").get("name")
client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
session = client.get_participant_session(name=resource_name)
participant = fetch_participant_from_session(resource_name)
display_name = format_participant(participant)
print(f"{display_name} left at {session.end_time.rfc3339()}")
def on_recording_ready(message: pubsub_v1.subscriber.message.Message):
"""Display information about a recorded meeting when artifact is ready."""
payload = json.loads(message.data)
resource_name = payload.get("recording").get("name")
client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
recording = client.get_recording(name=resource_name)
print(f"Recording available at {recording.drive_destination.export_uri}")
def on_transcript_ready(message: pubsub_v1.subscriber.message.Message):
"""Display information about a meeting transcript when artifact is ready."""
payload = json.loads(message.data)
resource_name = payload.get("transcript").get("name")
client = meet.ConferenceRecordsServiceClient(credentials=USER_CREDENTIALS)
transcript = client.get_transcript(name=resource_name)
print(f"Transcript available at {transcript.docs_destination.export_uri}")
def on_message(message: pubsub_v1.subscriber.message.Message) -> None:
"""Handles an incoming event from the Google Cloud Pub/Sub API."""
event_type = message.attributes.get("ce-type")
handler = {
"google.workspace.meet.conference.v2.started": on_conference_started,
"google.workspace.meet.conference.v2.ended": on_conference_ended,
"google.workspace.meet.participant.v2.joined": on_participant_joined,
"google.workspace.meet.participant.v2.left": on_participant_left,
"google.workspace.meet.recording.v2.fileGenerated": on_recording_ready,
"google.workspace.meet.transcript.v2.fileGenerated": on_transcript_ready,
}.get(event_type)
try:
if handler is not None:
handler(message)
message.ack()
except Exception as error:
print("Unable to process event")
print(error)
def listen_for_events(subscription_name: str = None):
"""Subscribe to events on the subscription."""
subscriber = pubsub_v1.SubscriberClient()
with subscriber:
future = subscriber.subscribe(subscription_name, callback=on_message)
print("Listening for events")
try:
future.result()
except KeyboardInterrupt:
future.cancel()
print("Done")
Finalizar o código
Adicione o código a seguir ao main.py
para chamar os métodos para criar o espaço,
inscrever-se em eventos e detectar. Atualize as constantes TOPIC_NAME
e SUBSCRIPTION_NAME
com os próprios nomes
de tópicos
e assinaturas criados anteriormente.
Adicione o código a
main.py
:space = create_space() print(f"Join the meeting at {space.meeting_uri}") TOPIC_NAME = "projects/PROJECT_ID/topics/TOPIC_ID" SUBSCRIPTION_NAME = "projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID" subscription = subscribe_to_space(topic_name=TOPIC_NAME, space_name=space.name) listen_for_events(subscription_name=SUBSCRIPTION_NAME)
Substitua:
PROJECT_ID
: o ID exclusivo do projeto do Cloud para seu app, comomy-sample-project-191923
.TOPIC_ID
: o nome do tópico do Pub/Sub que você criou no projeto do Cloud.SUBSCRIPTION_ID
: o nome da sua assinatura, comoworkspace-events-sub
.
Execute o programa:
python3 main.py
Se você nunca executou o programa, ele solicitará autorização na primeira vez. Conceda acesso ao aplicativo para chamar a API REST do Meet. Depois que o programa for executado, você vai ver uma resposta semelhante a esta:
Join the meeting at https://meet.google.com/abc-mnop-xyz
Participe da conferência
Para gerar eventos para o aplicativo, participe da conferência usando o URL mostrado pelo aplicativo. Depois de ingressar, tente estas ações para acionar eventos:
- Saia e entre novamente na reunião.
- Convide outras pessoas ou ligue para a reunião com seu smartphone.
- Ative as gravações e transcrições.
Cada uma dessas atividades gera um evento que o aplicativo recebe e registra no console do Google Cloud.
Use ctrl-c
para interromper o programa quando terminar.
Opcional: outras etapas para testar
O app registra os detalhes básicos sobre os eventos. Para continuar explorando a API REST do Meet, tente modificar o aplicativo para executar essas outras ações.
- Use a API People para recuperar mais informações sobre os participantes que fizeram login.
- Use a API Google Drive para fazer o download de gravações e transcrições.
- Em vez de fazer o download de transcrições do Google Drive, recupere-as usando os métodos de transcrição estruturada na API REST do Meet.
Opcional: limpar
Para evitar cobranças na sua conta do console do Google Cloud pelos recursos usados neste tutorial, recomendamos que você limpe todos os recursos e projetos criados.
Para excluir a assinatura, faça o seguinte:
Console
No console do Google Cloud, acesse Menu > Pub/Sub > Assinaturas
Selecione a assinatura e clique em
Mais ações.Clique em Excluir. A janela Excluir assinatura será exibida.
Clique em Excluir.
CLI da gcloud
Excluir a assinatura:
gcloud pubsub subscriptions delete SUBSCRIPTION_NAME
Para excluir o tópico:
Console
No console do Google Cloud, acesse Menu > Pub/Sub > Tópicos
Selecione o tópico e clique em
Mais ações.Clique em Excluir. A janela Excluir tópico é exibida.
Digite
delete
e clique em Excluir.
CLI da gcloud
Exclua o tópico:
gcloud pubsub topics delete TOPIC_NAME
Para excluir o projeto:
Console
- No Console do Google Cloud, acesse a página Gerenciar recursos. Clique em Menu > IAM e administrador > Gerenciar recursos.
- Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
- Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.
CLI da gcloud
Para excluir um projeto, use o comando gcloud projects delete:
gcloud projects delete PROJECT_ID
Temas relacionados
- Saiba mais sobre o que a API REST do Google Meet pode fazer e consulte a documentação de referência.
- Leia sobre como assinar eventos usando a API Events do Google Workspace.
- Para saber mais sobre autenticação, consulte Configurar a tela de permissão OAuth e escolher escopos.