OAuth 与工件
Google Cloud 凭据、刷新令牌、OAuth 验证,以及读取 Meet 产物、出席情况和导出。属于 Google Meet 插件 指南的一部分。
OAuth 与预检¶
OAuth 对于创建 Meet 链接是可选的,因为 googlemeet create 可以回退到浏览器自动化。如需通过官方 API 创建、解析空间,或进行 Meet Media API 预检,请配置 OAuth。Chrome/Chrome-node 加入从不依赖 OAuth;它们使用已登录的 Chrome 配置文件、主机的原生虚拟音频后端,并且(对于 chrome-node)无论如何都需要一个已连接的节点。
创建 Google 凭据¶
在 Google Cloud Console 中:
1. 创建或选择一个项目
2. 启用 Google Meet REST API
3. 配置 OAuth 同意屏幕
对于 Google Workspace 组织,Internal 最简单。External 适用于个人/测试环境;在应用处于 Testing 状态时,将每个将授权该应用的 Google 账户添加为测试用户。
4. 添加所需的 OAuth 作用域
https://www.googleapis.com/auth/meetings.space.createdhttps://www.googleapis.com/auth/meetings.space.readonlyhttps://www.googleapis.com/auth/meetings.space.settingshttps://www.googleapis.com/auth/meetings.conference.media.readonlyhttps://www.googleapis.com/auth/calendar.events.readonly(Calendar lookup)https://www.googleapis.com/auth/drive.meet.readonly(transcript/smart-note document body export)
5. 创建 OAuth 客户端 ID
应用类型 Web application。授权重定向 URI:
6. 复制客户端 ID 和客户端密钥
meetings.space.created 是 spaces.create 所需的。meetings.space.readonly 将 Meet URL/代码解析为空间。meetings.space.settings 允许 OpenClaw 在 API 创建房间时传递 SpaceConfig 设置,例如 accessType。meetings.conference.media.readonly 用于 Meet Media API 预检和媒体操作;Google 可能要求实际使用 Media API 时注册 Developer Preview。calendar.events.readonly 仅在 --today/--event 日历查找时需要。drive.meet.readonly 仅在 --include-doc-bodies 导出时需要。如果你只需要基于浏览器的 Chrome 加入,可以完全跳过 OAuth。
生成刷新令牌¶
配置 oauth.clientId,并可选配置 oauth.clientSecret(或作为环境变量传入),然后运行:
这会运行一个 PKCE 流程,使用 http://localhost:8085/oauth2callback 上的 localhost 回调,并打印一个包含刷新令牌的 oauth 配置块。如果浏览器无法访问本地回调,添加 --manual 以使用复制/粘贴流程:
OPENCLAW_GOOGLE_MEET_CLIENT_ID="your-client-id" \
OPENCLAW_GOOGLE_MEET_CLIENT_SECRET="your-client-secret" \
openclaw googlemeet auth login --json --manual
JSON 输出:
{
"oauth": {
"clientId": "your-client-id",
"clientSecret": "your-client-secret",
"refreshToken": "refresh-token",
"accessToken": "access-token",
"expiresAt": 1770000000000
},
"scope": "..."
}
将 oauth 对象存储到插件配置下:
{
plugins: {
entries: {
"google-meet": {
enabled: true,
config: {
oauth: {
clientId: "your-client-id",
clientSecret: "your-client-secret",
refreshToken: "refresh-token",
},
},
},
},
},
}
如果不想将刷新令牌放在配置中,请优先使用环境变量;配置会先解析,然后回退到环境变量。如果你在支持会议创建、日历查找或文档正文导出之前完成身份验证,请重新运行 openclaw googlemeet auth login --json,使刷新令牌覆盖当前的作用域集合。
使用 doctor 验证 OAuth¶
这会检查 OAuth 配置是否存在,以及刷新令牌能否生成访问令牌,而不会加载 Chrome 运行时或要求已连接的节点。报告仅包含状态字段(ok、configured、tokenSource、expiresAt、检查消息),并且从不打印访问令牌、刷新令牌或客户端密钥。
| 检查 | 含义 |
|---|---|
oauth-config |
存在 oauth.clientId 加上 oauth.refreshToken,或存在缓存的访问令牌 |
oauth-token |
缓存的访问令牌仍然有效,或刷新令牌生成了新的访问令牌 |
meet-spaces-get |
可选的 --meeting 检查解析了一个已存在的 Meet 空间 |
meet-spaces-create |
可选的 --create-space 检查创建了一个新的 Meet 空间 |
使用有副作用的创建检查来证明 Meet API 已启用以及 spaces.create 作用域:
证明对已存在空间的读取访问:
openclaw googlemeet doctor --oauth --meeting https://meet.google.com/abc-defg-hij --json
openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij
这些检查返回 403 通常意味着 Meet REST API 已禁用、刷新令牌缺少所需作用域,或 Google 账户无法访问该空间。刷新令牌错误意味着重新运行 openclaw googlemeet auth login --json 并存储新的 oauth 块。
浏览器回退不需要 OAuth;那里的 Google 身份验证来自所选节点上已登录的 Chrome 配置文件,而不是 OpenClaw 配置。
以下环境变量可作为回退使用:
OPENCLAW_GOOGLE_MEET_CLIENT_ID或GOOGLE_MEET_CLIENT_IDOPENCLAW_GOOGLE_MEET_CLIENT_SECRET或GOOGLE_MEET_CLIENT_SECRETOPENCLAW_GOOGLE_MEET_REFRESH_TOKEN或GOOGLE_MEET_REFRESH_TOKENOPENCLAW_GOOGLE_MEET_ACCESS_TOKEN或GOOGLE_MEET_ACCESS_TOKENOPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT或GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_ATOPENCLAW_GOOGLE_MEET_DEFAULT_MEETING或GOOGLE_MEET_DEFAULT_MEETINGOPENCLAW_GOOGLE_MEET_PREVIEW_ACK或GOOGLE_MEET_PREVIEW_ACK
解析、预检并读取产物¶
openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij
openclaw googlemeet preflight --meeting https://meet.google.com/abc-defg-hij
在 Meet 创建会议记录后:
openclaw googlemeet artifacts --meeting https://meet.google.com/abc-defg-hij
openclaw googlemeet attendance --meeting https://meet.google.com/abc-defg-hij
openclaw googlemeet export --meeting https://meet.google.com/abc-defg-hij --output ./meet-export
使用 --meeting 时,artifacts 和 attendance 默认使用最新的会议记录;传入 --all-conference-records 可获取所有保留的记录。
日历查找会在读取产物之前从 Google Calendar 解析会议 URL(需要一个包含日历事件只读权限范围的刷新令牌):
openclaw googlemeet latest --today
openclaw googlemeet calendar-events --today --json
openclaw googlemeet artifacts --event "Weekly sync"
openclaw googlemeet attendance --today --format csv --output attendance.csv
--today 会在今天的主日历中搜索带有 Meet 链接的事件;--event <query> 搜索匹配的事件文本;--calendar <id> 指定非主日历。calendar-events 会预览匹配的事件,并标记 latest/artifacts/attendance/export 将选择哪一个。
如果你已经知道会议记录 ID,可以直接指定它:
openclaw googlemeet latest --meeting https://meet.google.com/abc-defg-hij
openclaw googlemeet artifacts --conference-record conferenceRecords/abc123 --json
openclaw googlemeet attendance --conference-record conferenceRecords/abc123 --json
关闭通过 API 创建的空间的房间:
调用 spaces.endActiveConference,并且要求 OAuth 具有 meetings.space.created 权限范围,用于授权账户可管理的空间。接受 Meet URL、会议代码或 spaces/{id},并首先将其解析为 API 空间资源。这与 googlemeet leave 不同:leave 停止 OpenClaw 的本地/会话参与;end-active-conference 请求 Google Meet 结束该空间的当前会议。
生成可读报告:
openclaw googlemeet artifacts --conference-record conferenceRecords/abc123 \
--format markdown --output meet-artifacts.md
openclaw googlemeet attendance --conference-record conferenceRecords/abc123 \
--format csv --output meet-attendance.csv
openclaw googlemeet export --conference-record conferenceRecords/abc123 \
--include-doc-bodies --zip --output meet-export
openclaw googlemeet export --conference-record conferenceRecords/abc123 \
--include-doc-bodies --dry-run
对于 artifacts 和 attendance,--output <path> 会将所选格式(包括默认摘要)写入文件。如果不使用 --output,报告将输出到 stdout。
artifacts 返回会议记录元数据,以及当 Google 公开时返回的参与者、录制、转录、结构化转录条目和智能笔记资源元数据。--no-transcript-entries 会跳过大型会议的条目查找。attendance 将参与者展开为参与者-会话行,包含首次/最后出现时间、总会话时长、迟到/早退标志,并按已登录用户或显示名称合并重复参与者资源;--no-merge-duplicates 保留原始资源不合并,--late-after-minutes/--early-before-minutes 用于调整阈值。
export 会写入一个包含 summary.md、attendance.csv、transcript.md、artifacts.json、attendance.json 和 manifest.json 的文件夹。manifest.json 记录所选输入、导出选项、会议记录、输出文件、数量、令牌来源、使用的任何日历事件以及部分获取警告。--zip 还会在文件夹旁边写入一个可移植压缩包。--include-doc-bodies 通过 Drive files.export 导出关联的转录/智能笔记 Google Docs 文本(需要 Drive Meet 只读权限范围);如果不使用它,导出仅包含 Meet 元数据和结构化转录条目。部分产物失败(智能笔记列表、转录条目或文档正文错误)会将警告保留在摘要/清单中,而不是导致整个导出失败。--dry-run 会获取相同的数据并打印清单 JSON,而不创建文件夹或 ZIP。
代理通过 google_meet 工具使用相同操作(export、带 accessType 的 create、end_active_conference、test_listen);参见 工具。
实时冒烟测试¶
pnpm test:live 需要 OpenClaw 仓库的源代码检出;下面的 openclaw googlemeet 命令可从任何安装中运行。
OPENCLAW_LIVE_TEST=1 \
OPENCLAW_GOOGLE_MEET_LIVE_MEETING=https://meet.google.com/abc-defg-hij \
pnpm test:live -- extensions/google-meet/google-meet.live.test.ts
openclaw googlemeet setup --transport chrome-node --mode transcribe
openclaw googlemeet test-listen https://meet.google.com/abc-defg-hij --transport chrome-node --timeout-ms 30000
| 变量 | 用途 |
|---|---|
OPENCLAW_LIVE_TEST=1 |
启用受保护的实时测试 |
OPENCLAW_GOOGLE_MEET_LIVE_MEETING |
保留的 Meet URL、代码或 spaces/{id} |
OPENCLAW_GOOGLE_MEET_CLIENT_ID / GOOGLE_MEET_CLIENT_ID |
OAuth 客户端 ID |
| 变量 | 用途 |
|---|---|
OPENCLAW_GOOGLE_MEET_REFRESH_TOKEN / GOOGLE_MEET_REFRESH_TOKEN |
刷新令牌 |
OPENCLAW_GOOGLE_MEET_CLIENT_SECRET, OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN, OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT |
可选;不带 OPENCLAW_ 前缀的相同回退名称也可用 |
基础工件/出席冒烟测试需要 meetings.space.readonly 和 meetings.conference.media.readonly。日历查找需要 calendar.events.readonly。Drive 文档正文导出需要 drive.meet.readonly。
创建示例¶
打印新的会议 URI、来源和加入会话。使用 OAuth 时,它会使用 Meet API;否则使用已固定的 Chrome 节点的已登录配置文件。浏览器回退 JSON:
{
"source": "browser",
"meetingUri": "https://meet.google.com/abc-defg-hij",
"joined": true,
"browser": {
"nodeId": "ba0f4e4bc...",
"targetId": "tab-1"
},
"join": {
"session": {
"id": "meet_...",
"url": "https://meet.google.com/abc-defg-hij"
}
}
}
如果浏览器回退首先遇到 Google 登录或 Meet 权限拦截,google_meet 会返回结构化详细信息,而不是普通字符串:
{
"source": "browser",
"error": "google-login-required: Sign in to Google in the OpenClaw browser profile, then retry meeting creation.",
"manualAction": {
"reason": "google-login-required",
"message": "Sign in to Google in the OpenClaw browser profile, then retry meeting creation."
},
"browser": {
"nodeId": "ba0f4e4bc...",
"targetId": "tab-1",
"browserUrl": "https://accounts.google.com/signin",
"browserTitle": "Sign in - Google Accounts"
}
}
API 创建 JSON:
{
"source": "api",
"meetingUri": "https://meet.google.com/abc-defg-hij",
"joined": true,
"space": {
"name": "spaces/abc-defg-hij",
"meetingCode": "abc-defg-hij",
"meetingUri": "https://meet.google.com/abc-defg-hij"
},
"join": {
"session": {
"id": "meet_...",
"url": "https://meet.google.com/abc-defg-hij"
}
}
}
创建时默认加入,但 Chrome/Chrome 节点仍需要一个已登录的 Google 配置文件才能通过浏览器加入;如果已退出登录,OpenClaw 会返回 manualAction 或浏览器回退错误,并要求操作员先完成 Google 登录再重试。
只有在确认你的 Cloud 项目、OAuth 主体和会议参与者均已加入用于 Meet 媒体 API 的 Google Workspace Developer Preview Program 后,才设置 preview.enrollmentAcknowledged: true。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw