跳转至

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.created
  • https://www.googleapis.com/auth/meetings.space.readonly
  • https://www.googleapis.com/auth/meetings.space.settings
  • https://www.googleapis.com/auth/meetings.conference.media.readonly
  • https://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:

http://localhost:8085/oauth2callback

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(或作为环境变量传入),然后运行:

openclaw googlemeet auth login --json

这会运行一个 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

openclaw googlemeet doctor --oauth --json

这会检查 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 --create-space --json

证明对已存在空间的读取访问:

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_ID
  • OPENCLAW_GOOGLE_MEET_CLIENT_SECRET 或 GOOGLE_MEET_CLIENT_SECRET
  • OPENCLAW_GOOGLE_MEET_REFRESH_TOKEN 或 GOOGLE_MEET_REFRESH_TOKEN
  • OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN 或 GOOGLE_MEET_ACCESS_TOKEN
  • OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT 或 GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT
  • OPENCLAW_GOOGLE_MEET_DEFAULT_MEETING 或 GOOGLE_MEET_DEFAULT_MEETING
  • OPENCLAW_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 创建的空间的房间:

openclaw googlemeet end-active-conference https://meet.google.com/abc-defg-hij

调用 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。

创建示例

openclaw googlemeet create

打印新的会议 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