Google Chat

本文档由 AI 编写,已经人工审核。

Google Chat#

Google Chat 驱动器通过服务账号Google Chat REST API 将 Google Chat 空间与其他平台桥接。它启动一个 HTTP 服务器接收 Google 推送的消息事件,并通过 Chat API 发送回复。

前置条件#

你需要一个 Google Workspace 账号来进行配置,否则你会遇到 Google Chat API is only available to Google Workspace users

  1. console.cloud.google.com 创建 Google Cloud 项目(或使用已有项目)。

  2. 启用 Google Chat API:进入 API 和服务 → 库,搜索"Google Chat API"并启用。

  3. 创建服务账号:进入 IAM 和管理 → 服务账号,创建新账号并下载 JSON 密钥文件。

  4. 配置 Chat 应用:进入 API 和服务 → Google Chat API → 配置 并填写:

    • 应用名称头像 URL描述(必填字段)

    • 连接设置 下选择 HTTP 端点 URL 并填入机器人的公开地址,例如 https://example.com/google-chat/events

    • 可见性 下选择可安装该机器人的用户或群组。

  5. 将机器人添加到空间:在 Google Chat 中创建或打开一个空间,点击 添加用户和应用,按名称添加机器人。

HTTP 端点必须通过 HTTPS 公开可访问。开发阶段可使用 nginx/Caddy 反向代理或 ngrok / Cloudflare Tunnel 隧道工具。

配置项#

config.jsongooglechat.<instance_id> 下添加:

必填
默认值
说明
service_account_file是*服务账号 JSON 密钥文件路径
service_account_json是*内联服务账号 JSON 字符串(与文件路径二选一)
listen_port8090驱动器监听的 HTTP 端口
listen_path"/google-chat/events"事件端点的 HTTP 路径
endpoint_url端点的完整公开 URL(设置后启用请求签名验证)
max_file_size52428800(50 MB)附件大小上限(字节)
proxy所有 Google Chat API 请求的代理 URL(例如:http://proxy.example.com:8080socks5://proxy.example.com:1080)。如果未设置,将使用全局代理配置(如有)。设置为 null 可显式禁用此实例的代理(忽略全局代理设置)。

* service_account_fileservice_account_json 必须填写其中一个。

使用文件路径#

json
{
  "googlechat": {
    "my_space": {
      "service_account_file": "/secrets/google-chat-sa.json",
      "listen_port": 8090,
      "endpoint_url": "https://example.com/google-chat/events"
    }
  }
}

内联 JSON(适用于密钥管理器)#

json
{
  "googlechat": {
    "my_space": {
      "service_account_json": "{\"type\":\"service_account\",\"project_id\":\"...\", ...}"
    }
  }
}

规则通道键#

说明
space_nameGoogle Chat 空间资源名称,例如 "spaces/AAAA"

space_name 存在于每条接收到的事件中。也可通过 Chat API 查询,或在 Google Cloud Console 的空间对象 name 字段中找到。

json
{
  "my_space": {
    "space_name": "spaces/AAAAAbCdEfG"
  }
}

工作原理#

接收: 当用户向机器人发送消息时,Google Chat 将 JSON 事件 POST 到配置的端点。驱动器会:

  • 立即返回 {"text": ""} 以确认事件(Google 要求)

  • 忽略非 MESSAGE 事件类型(ADDED_TO_SPACEREMOVED_FROM_SPACE 等)

  • 跳过机器人(包括自身)发送的消息

  • 优先使用 argumentText(@提及后的文本),回退到完整 text 字段

  • 使用服务账号令牌下载内联附件并转发给桥接核心

发送: 对于每条出站消息,驱动器会:

  1. 获取(或刷新)服务账号 OAuth2 访问令牌

  2. https://chat.googleapis.com/v1/{space_name}/messages POST 消息

  3. 对于拥有公开 HTTPS URL 的图片,发送带有图片小部件的 Card v2

  4. 对于其他附件(或没有公开 URL 的图片),发送文本标签 [类型: 文件名]

请求验证#

设置 endpoint_url 后,驱动器会对每条传入请求验证 Google 签名的 OIDC 令牌:

  • 检查 Authorization: Bearer <token> 请求头

  • 使用 Google 公钥验证令牌签名

  • 确认受众(audience)与 endpoint_url 匹配

  • 确认发送者邮箱为 chat@system.gserviceaccount.com

若未设置 endpoint_url,则跳过验证(适用于开发环境或防火墙后的部署)。

注意事项#

  • 服务账号必须在同一项目中启用 Chat API;无需任何 IAM 角色。

  • Google Chat 要求有效的 HTTPS 端点,Chat 配置界面会拒绝纯 HTTP 地址。

  • 仅当附件已有公开 URL 时,图片才会以 Card v2 小部件发送。来自其他平台(如 NapCat)的二进制附件将显示为文本标签,因为 Google Chat REST API 不支持在不借助 Drive/存储服务的情况下直接上传二进制文件。

  • rich_header 前缀使用 Google Chat 有限的 Markdown 语法:*粗体*_斜体_

  • Google Chat 支持空间、私信和群聊。请使用对应会话的 space_name