本教程介绍了如何使用 Google Meet REST API 以及 使用 Google Workspace Events API 和 Google Cloud Pub/Sub 观察事件并做出响应 进行会议示例应用将记录 会议开始和结束时间、参与者加入或离开的时间,以及任何 生成了会议制品
您不必订阅特定的会议空间,只需订阅 Meet 用户可接收任何会议空间中的活动, 用户拥有或组织的信息。有关详情,请参阅 订阅 Google Meet 活动 。
前提条件
如果您需要为组织启用以下任一前提条件,请询问 您的 Google Workspace 管理员来开启这些设置:
- 拥有符合以下条件的 Google Workspace 账号: 使用 Google Meet。
- 拥有创建 Google Cloud 项目的权限。
- 已安装 Python 3。
- 已安装 gcloud CLI。
准备环境
本部分介绍如何创建和配置本地环境以及 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 和管理 > 创建项目。
-
在项目名称字段中,为您的项目输入描述性名称。
可选:要修改项目 ID,请点击修改。项目 ID 无法更改 创建项目后,请选择一个满足您需求的 ID 项目。
- 在地理位置字段中,点击浏览以显示适合您的潜在地理位置 项目。然后,点击选择。
- 点击创建。Google Cloud 控制台会转到“信息中心”页面,并且您的项目已创建完毕 就会出现这种问题
gcloud CLI
在以下某个开发环境中,访问 Google Cloud CLI (`gcloud`):
-
Cloud Shell:通过 gcloud CLI 使用在线终端
请激活 Cloud Shell。
激活 Cloud Shell -
Local Shell:如需使用本地开发环境,
安装和
初始化
gcloud CLI
如需创建 Cloud 项目,请使用“gcloud projects create”命令: 通过设置要创建的项目的 ID 来替换 PROJECT_ID。gcloud projects create PROJECT_ID
为 Google Cloud 项目启用结算功能
<ph type="x-smartling-placeholder">Google Cloud 控制台
- 在 Google Cloud 控制台中,前往结算。点击 菜单 > 结算 > 我的项目。
- 在选择组织中,选择与 Google Cloud 项目。
- 在项目行中,打开操作菜单 ( ), 点击更改结算信息,然后选择 Cloud Billing 账号。
- 点击设置账号。
gcloud CLI
- 如需列出可用的结算账号,请运行以下命令:
gcloud billing accounts list
- 将结算账号与 Google Cloud 项目相关联:
gcloud billing projects link PROJECT_ID --billing-account=BILLING_ACCOUNT_ID
替换以下内容:
PROJECT_ID
是 您要为其启用结算功能的 Cloud 项目。BILLING_ACCOUNT_ID
是要关联的结算账号 ID Google Cloud 项目。
设置身份验证和授权
通过身份验证和授权,应用可以访问 Meet REST API 资源。需要用户授权才能调用 Meet REST API。 本部分将介绍如何配置用户凭据和请求 授权。
配置 OAuth 权限请求页面并选择范围
以下步骤建议配置占位符信息 OAuth 同意屏幕 。在对外发布应用之前,请更新此信息。
- 在 Google Cloud 控制台中,点击“菜单”图标 > API 和服务 > OAuth 同意屏幕。
- 在用户类型下,选择内部,然后点击创建。 <ph type="x-smartling-placeholder">
- 在应用名称中,输入
Meet REST API Tutorial
。 - 填写应用注册表单,然后点击保存并继续。
- 点击添加或移除范围。此时会显示一个面板,其中包含范围列表 为您在 Google Cloud 项目中启用的每个 API 创建配额。
- 在手动添加范围下方,粘贴以下范围:
<ph type="x-smartling-placeholder">
- </ph>
https://www.googleapis.com/auth/meetings.space.created
- 点击 Add to Table。
- 点击更新。
- 选择所需范围后 点击 Save and Continue(保存并继续)。
- 如果您选择了外部作为用户类型,请添加测试用户:
<ph type="x-smartling-placeholder">
- </ph>
- 在测试用户下,点击添加用户。
- 输入您的电子邮件地址和任何其他获授权的测试用户,然后点击 保存并继续。
- 查看应用注册摘要。如需进行更改,请点击修改。如果应用 点击 Back to Dashboard(返回信息中心)。
创建客户端 ID
在 OAuth 2.0 期间,客户端 ID 充当应用的凭据 流量。由于应用在本地运行,因此请创建一个桌面客户端 ID。
- 在 Google Cloud 控制台中,依次点击“菜单”图标 > API 和服务 > 凭据。
- 依次点击创建凭据 > OAuth 客户端 ID。
- 依次点击应用类型 > 桌面应用。
- 在名称字段中,输入凭据的名称。此名称仅在 Google Cloud 控制台中显示。
- 点击创建。系统会显示“OAuth 客户端创建”屏幕,其中显示了您的新客户端 ID 和客户端密钥。
- 点击 OK。新创建的凭据会显示在 OAuth 2.0 客户端 ID 下。
安装 Google 身份验证库
安装 Google 身份验证库:
pip install google-auth google-auth-oauthlib
执行授权
Meet REST API 要求提供 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()
要运行代码,需要同时将客户端 ID 和之前创建的密钥 必填字段。将下载的客户端密钥文件复制到正常运行的项目 并将其重命名为
client_secret.json
。如果您想测试授权的工作原理,请运行以下命令。 应用会提示您进行授权,并在
token.json
项目工作目录。python3 main.py
添加 Meet REST API
现在授权代码已经完成,是时候启用并调用 了解 REST API。
启用 API
虽然本部分重点介绍 Meet REST API,但本教程还使用 Google Cloud Pub/Sub 和 Google Workspace Events API。
Google Cloud 控制台
在 Google Cloud 控制台中,启用 Google Meet REST API、 Google Workspace Events API 和 Google Cloud Pub/Sub。
确认您是在正确的 Cloud 项目,然后点击下一步。
确认您启用的 API 正确无误,然后点击启用。
gcloud CLI
如有必要,请将当前 Cloud 项目设置为您 使用
gcloud config set project
命令创建:gcloud config set project PROJECT_ID
将 PROJECT_ID 替换为项目 ID 您创建的 Cloud 项目。
启用 Google Meet REST API、Google Workspace Events API 和 使用
gcloud services enable
命令的 Google Cloud Pub/Sub: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
创建聊天室
现在,Meet REST API 已可供使用,接下来请定义一个函数来创建 提供订阅服务。
修改 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)
订阅事件
如要接收有关某个会议空间的活动,您可以使用 Google Workspace Events API。您还必须创建并订阅 Google Cloud Pub/Sub 主题 - 该主题充当您的 应用收到这些事件。
配置 Google Cloud Pub/Sub
如需创建和订阅 Pub/Sub 主题,请执行以下操作:
Google Cloud 控制台
- 在 Google Cloud 控制台中,点击“菜单”图标 > Pub/Sub。
请务必为您的应用选择 Cloud 项目。
- 点击
- 输入
workspace-events
作为主题名称。 - 让添加默认订阅保持选中状态。
- 点击创建。完整主题名称的格式为
projects/{project}/topics/{topic}
。添加记事 该名称,以便在后续步骤中使用。
创建主题,然后执行相应操作
以下:
- 输入
- 授予向主题发布 Pub/Sub 消息的权限:
<ph type="x-smartling-placeholder">
- </ph>
- 在侧边栏中,打开 权限标签页。
- 点击添加主账号。
- 在新主账号中,输入
meet-api-event-push@system.gserviceaccount.com
。 - 在分配角色中,选择
Pub/Sub Publisher
。 - 点击保存。
更新主题的权限可能需要几分钟的时间。
gcloud CLI
- 在您的 Cloud 项目中,通过运行以下命令创建主题:
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}
的值为
应用的 Cloud 项目 ID。您将使用该主题名称
以后再订阅 Google Workspace。
创建服务账号
Google Cloud 控制台
- 在 Google Cloud 控制台中,点击“菜单”图标 > IAM 和管理 > 服务账号。
- 点击创建服务账号。
- 填写服务账号详细信息,然后点击创建并继续。
- 可选:向您的服务账号分配角色,以授予对 Google Cloud 项目资源的访问权限。如需了解详情,请参阅授予、更改和撤消对资源的访问权限。
- 点击继续。
- 可选:输入可以使用此服务账号管理和执行操作的用户或群组。如需了解详情,请参阅管理服务账号模拟。
- 点击完成。记下服务账号的电子邮件地址。
gcloud CLI
- 创建服务账号:
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 CLI
- 如需添加权限,请运行
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
并添加以下示例代码。此代码
实现接收方,并使用 Google Cloud Pub/Sub API
实时更新各种处理程序方法会输出信息,
有关相应事件的信息
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
:以下各项的唯一 Cloud 项目 ID 例如my-sample-project-191923
。TOPIC_ID
:您要管理的 Pub/Sub 主题的名称。 在您的 Cloud 项目中创建的。SUBSCRIPTION_ID
:订阅的名称,例如 名称:workspace-events-sub
。
运行程序:
python3 main.py
如果以前没有运行过该程序,则它会提示对 。向应用授予调用 Meet REST API 的权限。 程序成功运行后,您应该会看到类似于以下内容的输出:
Join the meeting at https://meet.google.com/abc-mnop-xyz
加入会议
要为应用生成事件,请使用网址加入会议 应用显示的内容加入后,您可以尝试以下操作: 触发事件:
- 退出并重新加入会议。
- 邀请他人或通过电话拨号加入会议。
- 启用录音和转录功能。
这些 activity 中的每一个都会生成一个事件,应用将接收并 写入 Google Cloud 控制台。
完成后,使用 ctrl-c
中断程序。
可选:尝试执行的其他步骤
该应用会记录有关事件的基本详情。如需继续探索 Meet REST API,请尝试修改应用,以执行这些额外的 操作。
- 使用 People API 检索有关 已登录的参与者。
- 使用 Google Drive API 下载录制内容 和转写文稿。
- 您可以使用 结构化转录文本 方法 Meet REST API 中的文档
可选:清理
为避免系统因资源向您的 Google Cloud 控制台账号收取费用 我们建议您清理所有资源和项目 创建。
如需删除订阅,请执行以下操作:
控制台
在 Google Cloud 控制台中,点击“菜单” > Pub/Sub > 订阅
选择相应订阅,然后点击
更多操作。点击删除。系统随即会显示删除订阅窗口。
点击删除。
gcloud CLI
删除订阅:
gcloud pubsub subscriptions delete SUBSCRIPTION_NAME
要删除主题,请执行以下操作:
控制台
在 Google Cloud 控制台中,点击“菜单” > Pub/Sub > 主题
选择相应主题,然后点击
更多操作。点击删除。系统随即会显示删除主题窗口。
输入
delete
,然后点击删除。
gcloud CLI
删除主题:
gcloud pubsub topics delete TOPIC_NAME
如需删除项目,请执行以下操作:
控制台
-
在 Google Cloud 控制台中,前往管理资源页面。点击
菜单 > IAM 和管理员
> 管理资源。
<ph type="x-smartling-placeholder"></ph> 前往 Resource Manager
- 在项目列表中,选择要删除的项目,然后点击 删除 。
- 在对话框中输入项目 ID,然后点击关停以删除项目 项目。
gcloud CLI
要删除项目,请使用 gcloud projects 删除 命令:
gcloud projects delete PROJECT_ID
相关主题
- 详细了解 您可以订阅的 Meet 事件类型。
- 详细了解 Google Meet REST API 的功能和 查看参考文档。
- 创建 Google Workspace 订阅 Meet 会议空间或使用 Google Workspace Events API。
- 如需详细了解身份验证,请参阅配置 OAuth 权限请求页面 并选择范围。