В этом руководстве показано, как использовать REST API Google Meet вместе с API Google Workspace Events и Google Cloud Pub/Sub для наблюдения за событиями собраний и реагирования на них. Пример приложения записывает, когда конференции начинаются и заканчиваются, когда участники присоединяются или покидают их, а также когда доступны любые созданные артефакты собрания.
Дополнительную информацию о работе с событиями см. в разделе «Подписка на события Google Meet» в документации Google Workspace Events API.
Предварительные условия
Если вам необходимо включить какие-либо из этих предварительных условий для вашей организации, попросите администратора Google Workspace включить их:
- Учетная запись Google Workspace с доступом к Google Meet .
- Доступ для создания проекта Google Cloud .
- Установлен Питон 3 .
- Интерфейс командной строки gcloud установлен.
Подготовьте свое окружение
В этом разделе показано, как создать и настроить локальную среду и проект Google Cloud для этого руководства.
Создайте рабочий каталог и виртуальную среду Python.
Чтобы создать и активировать новую виртуальную среду , выполните следующие команды в своем терминале.
Linux/macOS
mkdir meet-tutorial
cd meet-tutorial
python3 -mvenv env
source env/bin/activate
Windows (командная строка)
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
Создайте проект Google Cloud
Консоль Google Cloud
- В консоли Google Cloud выберите > IAM и администрирование > Создать проект .
- В поле «Имя проекта» введите описательное имя вашего проекта.
Необязательно: Чтобы изменить идентификатор проекта , нажмите «Изменить» . Идентификатор проекта нельзя изменить после его создания, поэтому выберите идентификатор, который соответствует вашим потребностям на протяжении всего срока действия проекта.
- В поле «Местоположение» нажмите «Обзор» , чтобы отобразить возможные местоположения для вашего проекта. Затем нажмите «Выбрать» .
- Нажмите Создать . Консоль Google Cloud перейдет на страницу панели инструментов, и ваш проект будет создан в течение нескольких минут.
интерфейс командной строки gcloud
В одной из следующих сред разработки получите доступ к Google Cloud CLI («gcloud»):
- Cloud Shell : чтобы использовать онлайн-терминал с уже настроенным интерфейсом командной строки gcloud, активируйте Cloud Shell.
Активировать Cloud Shell - Локальная оболочка : чтобы использовать локальную среду разработки, установите и инициализируйте интерфейс командной строки gcloud.
Чтобы создать облачный проект, используйте команду gcloud project create:gcloud projects create PROJECT_ID
Включить оплату для проекта Google Cloud
Консоль Google Cloud
- В консоли Google Cloud перейдите в раздел «Оплата» . > Оплата > Мои проекты . Меню
- В разделе «Выберите организацию» выберите организацию, связанную с вашим проектом Google Cloud.
- В строке проекта откройте меню «Действия» ( ), нажмите «Изменить биллинг» и выберите учетную запись Cloud Billing.
- Нажмите Установить учетную запись .
интерфейс командной строки gcloud
- Чтобы просмотреть доступные учетные записи выставления счетов, запустите:
gcloud billing accounts list
- Свяжите платежный аккаунт с проектом Google Cloud:
gcloud billing projects link PROJECT_ID --billing-account=BILLING_ACCOUNT_ID
Замените следующее:
-
PROJECT_ID
— это идентификатор облачного проекта, для которого вы хотите включить оплату. -
BILLING_ACCOUNT_ID
— это идентификатор платежного аккаунта , который нужно связать с проектом Google Cloud.
-
Настройте аутентификацию и авторизацию
Аутентификация и авторизация позволяют приложению получать доступ к ресурсам API REST Meet. Для вызова Meet REST API требуется авторизация пользователя. В этом разделе описано, как настроить учетные данные пользователя и запросить авторизацию.
Настройте экран согласия OAuth и выберите области действия.
Следующие шаги предлагают информацию-заполнитель для настройки экрана согласия OAuth для вашего приложения. Прежде чем публиковать приложение на внешних ресурсах, обновите эту информацию.
- В консоли Google Cloud выберите > API и службы > Экран согласия OAuth .
- В разделе «Тип пользователя» выберите «Внутренний» , затем нажмите «Создать» .
- В поле «Имя приложения» введите
Meet REST API Tutorial
. - Заполните форму регистрации приложения, затем нажмите « Сохранить и продолжить» .
- Нажмите «Добавить или удалить области» . Появится панель со списком областей действия для каждого API, который вы включили в своем проекте Google Cloud.
- В разделе «Добавление областей вручную» вставьте следующие области:
-
https://www.googleapis.com/auth/meetings.space.created
-
- Нажмите «Добавить в таблицу» .
- Нажмите Обновить .
- После выбора областей, необходимых вашему приложению, нажмите « Сохранить и продолжить» .
- Если в качестве типа пользователя вы выбрали Внешний , добавьте тестовых пользователей:
- В разделе «Тестовые пользователи» нажмите «Добавить пользователей» .
- Введите свой адрес электронной почты и адрес других авторизованных тестовых пользователей, затем нажмите «Сохранить и продолжить» .
- Просмотрите сводку регистрации приложения. Чтобы внести изменения, нажмите «Изменить» . Если регистрация приложения выглядит нормально, нажмите «Вернуться на панель управления» .
Создайте идентификатор клиента
Идентификатор клиента действует как учетные данные для вашего приложения во время потоков OAuth 2.0. Поскольку приложение работает локально, создайте идентификатор клиента настольного компьютера.
- В консоли Google Cloud выберите > API и службы > Учетные данные .
- Нажмите «Создать учетные данные» > «Идентификатор клиента OAuth» .
- Нажмите Тип приложения > Приложение для ПК .
- В поле Имя введите имя учетных данных. Это имя отображается только в консоли Google Cloud.
- Нажмите Создать . Появится экран создания клиента OAuth, показывающий ваш новый идентификатор клиента и секрет клиента.
- Нажмите ОК . Вновь созданные учетные данные появятся в разделе «Идентификаторы клиентов OAuth 2.0».
Установите библиотеки аутентификации Google.
Установите библиотеки аутентификации Google:
pip install google-auth google-auth-oauthlib
Выполнить авторизацию
Для API REST Meet требуются учетные данные пользователя в виде токена доступа OAuth 2.0. В этом разделе вы реализуете поток OAuth 2.0 для запроса токена доступа и токена обновления для пользователя.
В своем рабочем каталоге создайте файл
main.py
и добавьте следующее содержимое: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()
Для запуска кода необходимы как идентификатор клиента, так и созданный ранее секрет. Скопируйте загруженный секретный файл клиента в рабочий каталог проекта и переименуйте его в
client_secret.json
.Если вы хотите проверить, как работает авторизация, выполните следующую команду. Приложение запрашивает авторизацию и создает файл
token.json
в рабочем каталоге проекта после одобрения запроса.python3 main.py
Добавьте REST API Meet
Теперь, когда код авторизации готов, пришло время включить и вызвать Meet REST API.
Включите API
Хотя этот раздел посвящен API REST Meet, в этом руководстве также используются API Google Cloud Pub/Sub и Google Workspace Events.
Консоль Google Cloud
В консоли Google Cloud включите API REST Google Meet, API событий Google Workspace и Google Cloud Pub/Sub.
Убедитесь, что вы включаете API в правильном облачном проекте, затем нажмите «Далее» .
Убедитесь, что вы включаете правильные API, затем нажмите «Включить» .
интерфейс командной строки gcloud
При необходимости установите текущий проект Cloud на тот, который вы создали с помощью команды
gcloud config set project
:gcloud config set project PROJECT_ID
Замените PROJECT_ID на идентификатор созданного вами облачного проекта.
Включите REST API Google Meet, API Google Workspace Events и Google Cloud Pub/Sub с помощью команды
gcloud services enable
:gcloud services enable meet.googleapis.com workspaceevents.googleapis.com pubsub.googleapis.com
Установите клиентскую библиотеку Meet REST API.
Выполните следующие действия, чтобы установить клиентскую библиотеку Meet REST API:
Запустите команду:
pip install google-apps-meet
Отредактируйте файл
main.py
, чтобы импортировать клиент:from google.apps import meet_v2 as meet
Создайте пространство
Теперь, когда API Meet REST доступен, определите функцию для создания пространства для собраний, на которое можно подписаться.
Отредактируйте main.py
и добавьте:
def create_space() -> meet.Space:
"""Create a meeting space."""
client = meet.SpacesServiceClient(credentials=USER_CREDENTIALS)
request = meet.CreateSpaceRequest()
return client.create_space(request=request)
Подписаться на события
Чтобы получать события о конференц-зале, вы создаете подписку с помощью API Google Workspace Events. Вы также должны создать тему Google Cloud Pub/Sub и подписаться на нее, которая будет служить конечной точкой уведомлений, откуда ваше приложение получает события.
Настройка Google Cloud Pub/Sub
Чтобы создать тему Pub/Sub и подписаться на нее:
Консоль Google Cloud
- В консоли Google Cloud перейдите в > «Pub/Sub» .
Убедитесь, что для вашего приложения выбран облачный проект.
«Меню» - Нажмите
- Введите
workspace-events
в качестве имени темы. - Оставьте выбранным параметр «Добавить подписку по умолчанию» .
- Нажмите Создать . Полное название темы имеет формат
projects/{project}/topics/{topic}
. Запишите это имя для использования в последующих шагах.
Создать тему и выполните следующие действия: - Введите
- Предоставьте доступ к публикации сообщений Pub/Sub в вашей теме:
- На боковой панели откройте вкладку «Разрешения» .
- Нажмите «Добавить принципала» .
- В разделе «Новые участники» введите
meet-api-event-push@system.gserviceaccount.com
. - В разделе «Назначить роли» выберите
Pub/Sub Publisher
. - Нажмите Сохранить .
Обновление разрешений для вашей темы может занять несколько минут.
интерфейс командной строки gcloud
- В своем облачном проекте создайте тему, выполнив следующую команду:
gcloud pubsub topics create workspace-events
В выводе отображается полное имя темы в формате
projects/{project}/topics/{topic}
. Запишите это имя для использования в последующих шагах. - Предоставьте доступ к публикации сообщений в вашей теме:
gcloud pubsub topics add-iam-policy-binding workspace-events --member='serviceAccount:meet-api-event-push@system.gserviceaccount.com' --role='roles/pubsub.publisher'
Обновление разрешений для вашей темы может занять несколько минут.
- Создайте подписку Pub/Sub для темы:
gcloud pubsub subscriptions create workspace-events-sub --topic=TOPIC_NAME
Замените следующее:
-
TOPIC_NAME
: название вашей темы, которую вы создали на предыдущем шаге.
-
Запишите название темы и убедитесь, что значение {project}
соответствует идентификатору облачного проекта вашего приложения. Название темы вы будете использовать позже для создания подписки на Google Workspace.
Создать учетную запись службы
Консоль Google Cloud
- В консоли Google Cloud выберите > IAM и администрирование > Учетные записи служб .
- Нажмите Создать учетную запись службы .
- Заполните данные учетной записи службы, затем нажмите «Создать и продолжить» .
- Необязательно: назначьте роли своему сервисному аккаунту, чтобы предоставить доступ к ресурсам вашего проекта Google Cloud. Дополнительные сведения см. в разделе Предоставление, изменение и отзыв доступа к ресурсам .
- Нажмите Продолжить .
- Необязательно: укажите пользователей или группы, которые могут управлять этой учетной записью службы и выполнять действия с ней. Дополнительные сведения см. в разделе Управление олицетворением учетной записи службы .
- Нажмите Готово . Запишите адрес электронной почты для учетной записи службы.
интерфейс командной строки gcloud
- Создайте учетную запись службы:
gcloud iam service-accounts create meet-event-listener \ --display-name="meet-event-listener"
- Необязательно: назначьте роли своему сервисному аккаунту, чтобы предоставить доступ к ресурсам вашего проекта Google Cloud. Дополнительные сведения см. в разделе Предоставление, изменение и отзыв доступа к ресурсам .
Используйте сервисный аккаунт
После создания учетной записи службы предоставьте себе доступ, чтобы выдавать себя за учетную запись службы.
Консоль Google Cloud
- В столбце «Действия» для вновь созданной учетной записи службы нажмите > Управление разрешениями .
- Нажмите Добавить ключ > Предоставить доступ .
- Введите свой адрес электронной почты в разделе «Добавить участников» .
- В качестве роли выберите Учетные записи служб > Создатель токенов учетных записей служб .
- Нажмите Сохранить .
- Вернитесь к своему терминалу и войдите в систему с помощью
gcloud
чтобы установить учетные данные приложения по умолчанию для учетной записи службы. При появлении запроса на авторизацию войдите в систему, используя ту же учетную запись, которая использовалась на предыдущих шагах.gcloud auth application-default login --impersonate-service-account=SERVICE_ACCOUNT_EMAIL
интерфейс командной строки gcloud
- Чтобы добавить разрешение, запустите
gcloud iam service-accounts add-iam-policy-binding
используя адрес электронной почты сервисной учетной записи и пользователя.gcloud iam service-accounts add-iam-policy-binding \ SERVICE_ACCOUNT_EMAIL \ --member="user:YOUR_EMAIL \ --role="roles/iam.serviceAccountTokenCreator"
- Войдите, чтобы установить учетные данные приложения по умолчанию для учетной записи службы. При появлении запроса на авторизацию войдите в систему, используя ту же учетную запись, которая использовалась на предыдущих шагах.
gcloud auth application-default login --impersonate-service-account=SERVICE_ACCOUNT_EMAIL
Установите клиентскую библиотеку Pub/Sub.
Используйте
pip
для установки клиентской библиотеки для Pub/Sub:pip install google-cloud-pubsub
Затем отредактируйте
main.py
, чтобы импортировать клиент:from google.cloud import pubsub_v1
Создайте подписку на Google Workspace.
Добавьте следующий код в main.py
, чтобы определить метод подписки на события Meet. Этот код подписывается на все события в конференц-зале. При подписке события публикуются в теме 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
Затем добавьте соответствующий код для извлечения и обработки событий.
Слушайте и обрабатывайте события
Продолжайте редактировать main.py
и добавьте следующий пример кода. Этот код реализует принимающую сторону и использует API Google Cloud Pub/Sub для получения событий по мере их появления. Различные методы-обработчики выводят информацию о соответствующих событиях.
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")
Завершите код
Добавьте следующий код в main.py
, чтобы вызвать методы для создания пространства, подписки на события и прослушивания. Обновите константы TOPIC_NAME
и SUBSCRIPTION_NAME
указав свои собственные названия тем и подписок , которые вы создали ранее.
Добавьте код в
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)
Замените следующее:
PROJECT_ID
: уникальный идентификатор облачного проекта для вашего приложения, напримерmy-sample-project-191923
.TOPIC_ID
: название темы Pub/Sub, которую вы создали в своем облачном проекте.SUBSCRIPTION_ID
: название вашей подписки, напримерworkspace-events-sub
.
Запустите программу:
python3 main.py
Если вы ранее не запускали программу, она запросит авторизацию с первого раза. Предоставьте приложению доступ для вызова API REST Meet. После успешного запуска программы вы должны увидеть вывод, похожий на:
Join the meeting at https://meet.google.com/abc-mnop-xyz
Присоединяйтесь к конференции
Чтобы генерировать события для приложения, присоединитесь к конференции, используя URL-адрес, отображаемый приложением. После присоединения вы можете попробовать следующие действия для запуска событий:
- Выйдите и снова присоединитесь к собранию.
- Пригласите других или позвоните с помощью телефона.
- Включите записи и расшифровки.
Каждое из этих действий генерирует событие, которое приложение получает и регистрирует в консоли Google Cloud.
Используйте ctrl-c
чтобы прервать программу, когда вы закончите.
Необязательно: дополнительные действия, которые стоит попробовать
Приложение регистрирует основные сведения о событиях. Чтобы продолжить изучение API REST Meet, попробуйте изменить приложение для выполнения этих дополнительных действий.
- Используйте API People для получения дополнительной информации о вошедших в систему участниках.
- Используйте Google Drive API для загрузки записей и расшифровок.
- Вместо загрузки стенограмм с Google Диска извлекайте их, используя методы структурированной стенограммы в Meet REST API.
Дополнительно: очистка
Чтобы избежать списания средств с вашей учетной записи консоли Google Cloud за ресурсы, используемые в этом руководстве, мы рекомендуем вам очистить все созданные ресурсы и проекты.
Чтобы удалить подписку:
Консоль
В консоли Google Cloud перейдите в > «Pub/Sub» > «Подписки» .
«Меню»Выберите подписку и нажмите
Дополнительные действия .Нажмите Удалить . Появится окно Удалить подписку .
Нажмите Удалить .
интерфейс командной строки gcloud
Удалить подписку:
gcloud pubsub subscriptions delete SUBSCRIPTION_NAME
Чтобы удалить тему:
Консоль
В консоли Google Cloud перейдите в > «Pub/Sub» > «Темы».
«Меню»Выберите тему и нажмите
Дополнительные действия .Нажмите Удалить . Появится окно Удалить тему .
Введите
delete
и нажмите «Удалить» .
интерфейс командной строки gcloud
Удалить тему:
gcloud pubsub topics delete TOPIC_NAME
Чтобы удалить проект:
Консоль
- В консоли Google Cloud перейдите на страницу «Управление ресурсами» . IAM и администрирование > Управление ресурсами . >
- В списке проектов выберите проект, который хотите удалить, и нажмите « .
- В диалоговом окне введите идентификатор проекта и нажмите «Завершить работу» , чтобы удалить проект.
интерфейс командной строки gcloud
Чтобы удалить проект, используйте команду удаления проектов gcloud :
gcloud projects delete PROJECT_ID
похожие темы
- Узнайте больше о возможностях Google Meet REST API и просмотрите справочную документацию .
- Узнайте, как подписаться на события с помощью API событий Google Workspace .
- Дополнительные сведения об аутентификации см. в разделе Настройка экрана согласия OAuth и выбор областей .