Google Chat (Chat API)
상태: Google Chat API 웹훅을 통한 DM 및 스페이스 지원 준비 완료(HTTP 전용).빠른 설정(초보자용)
- Google Cloud 프로젝트를 만들고 Google Chat API를 사용 설정합니다.
- 이동: Google Chat API Credentials
- 아직 활성화되지 않았다면 API를 활성화합니다.
- Service Account를 생성합니다.
- Create Credentials > Service Account를 누릅니다.
- 원하는 이름을 지정합니다(예:
openclaw-chat). - 권한은 비워 둡니다(Continue 누름).
- 액세스 권한이 있는 주체도 비워 둡니다(Done 누름).
- JSON Key를 생성하고 다운로드합니다.
- 서비스 계정 목록에서 방금 만든 계정을 클릭합니다.
- Keys 탭으로 이동합니다.
- Add Key > Create new key를 클릭합니다.
- JSON을 선택하고 Create를 누릅니다.
- 다운로드한 JSON 파일을 게이트웨이 호스트에 저장합니다(예:
~/.openclaw/googlechat-service-account.json). - Google Cloud Console Chat Configuration에서 Google Chat 앱을 생성합니다.
- Application info를 입력합니다.
- App name: (예:
OpenClaw) - Avatar URL: (예:
https://openclaw.ai/logo.png) - Description: (예:
개인 AI 비서)
- App name: (예:
- Interactive features를 활성화합니다.
- Functionality에서 Join spaces and group conversations를 선택합니다.
- Connection settings에서 HTTP endpoint URL을 선택합니다.
- Triggers에서 Use a common HTTP endpoint URL for all triggers를 선택하고, 이를 게이트웨이의 공개 URL 뒤에
/googlechat를 붙인 값으로 설정합니다.- 팁: 게이트웨이의 공개 URL을 찾으려면
openclaw status를 실행하세요.
- 팁: 게이트웨이의 공개 URL을 찾으려면
- Visibility에서 **Make this Chat app available to specific people and groups in <Your Domain>**를 선택합니다.
- 텍스트 상자에 이메일 주소를 입력합니다(예:
user@example.com). - 하단의 Save를 클릭합니다.
- Application info를 입력합니다.
- 앱 상태를 활성화합니다.
- 저장 후 페이지를 새로고침합니다.
- App status 섹션을 찾습니다(보통 저장 후 상단 또는 하단에 표시됨).
- 상태를 Live - available to users로 변경합니다.
- 다시 Save를 클릭합니다.
- 서비스 계정 경로와 웹훅 audience로 OpenClaw를 구성합니다.
- Env:
GOOGLE_CHAT_SERVICE_ACCOUNT_FILE=/path/to/service-account.json - 또는 config:
channels.googlechat.serviceAccountFile: "/path/to/service-account.json".
- Env:
- 웹훅 audience 유형과 값을 설정합니다(Chat 앱 구성과 일치해야 함).
- 게이트웨이를 시작합니다. 그러면 Google Chat이 웹훅 경로로 POST 요청을 보냅니다.
Google Chat에 추가하기
게이트웨이가 실행 중이고 이메일이 가시성 목록에 추가되어 있다면 다음을 수행합니다.- Google Chat으로 이동합니다.
- Direct Messages 옆의 +(플러스) 아이콘을 클릭합니다.
- 검색창(평소 사람을 추가하는 위치)에 Google Cloud Console에서 구성한 App name을 입력합니다.
- 참고: 이 봇은 비공개 앱이므로 “Marketplace” 탐색 목록에 표시되지 않습니다. 반드시 이름으로 검색해야 합니다.
- 결과에서 봇을 선택합니다.
- Add 또는 Chat을 클릭해 1:1 대화를 시작합니다.
- 비서를 트리거하려면 “Hello”를 보내세요.
공개 URL(웹훅 전용)
Google Chat 웹훅은 공개 HTTPS 엔드포인트가 필요합니다. 보안을 위해 인터넷에는/googlechat 경로만 노출하세요. OpenClaw 대시보드와 기타 민감한 엔드포인트는 사설 네트워크에 유지하세요.
옵션 A: Tailscale Funnel(권장)
비공개 대시보드에는 Tailscale Serve를 사용하고, 공개 웹훅 경로에는 Funnel을 사용합니다. 이렇게 하면/는 비공개로 유지하면서 /googlechat만 노출할 수 있습니다.
-
게이트웨이가 어떤 주소에 바인딩되어 있는지 확인합니다.
IP 주소를 확인합니다(예:
127.0.0.1,0.0.0.0, 또는100.x.x.x같은 Tailscale IP). -
대시보드를 tailnet 전용으로 노출합니다(포트 8443).
-
웹훅 경로만 공개적으로 노출합니다.
- 노드에 Funnel 액세스를 승인합니다. 프롬프트가 표시되면 출력에 나온 승인 URL을 방문해 tailnet 정책에서 이 노드에 대한 Funnel을 활성화합니다.
-
구성을 확인합니다.
https://<node-name>.<tailnet>.ts.net/googlechat
비공개 대시보드는 tailnet 전용으로 유지됩니다.
https://<node-name>.<tailnet>.ts.net:8443/
Google Chat 앱 구성에는 공개 URL(:8443 제외)을 사용하세요.
참고: 이 구성은 재부팅 후에도 유지됩니다. 나중에 제거하려면tailscale funnel reset및tailscale serve reset을 실행하세요.
옵션 B: 리버스 프록시(Caddy)
Caddy 같은 리버스 프록시를 사용하는 경우 특정 경로만 프록시하세요.your-domain.com/에 대한 요청은 무시되거나 404를 반환하고, your-domain.com/googlechat만 안전하게 OpenClaw로 라우팅됩니다.
옵션 C: Cloudflare Tunnel
터널의 ingress 규칙을 구성해 웹훅 경로만 라우팅하세요.- Path:
/googlechat->http://localhost:18789/googlechat - Default Rule: HTTP 404 (Not Found)
작동 방식
- Google Chat이 게이트웨이로 웹훅 POST를 보냅니다. 각 요청에는
Authorization: Bearer <token>헤더가 포함됩니다.- OpenClaw는 헤더가 있을 때 전체 웹훅 본문을 읽고 파싱하기 전에 bearer 인증을 검증합니다.
- 본문에
authorizationEventObject.systemIdToken이 포함된 Google Workspace Add-on 요청은 더 엄격한 사전 인증 본문 예산을 통해 지원됩니다.
- OpenClaw는 구성된
audienceType및audience에 대해 토큰을 검증합니다.audienceType: "app-url"→ audience는 HTTPS 웹훅 URL입니다.audienceType: "project-number"→ audience는 Cloud 프로젝트 번호입니다.
- 메시지는 스페이스 기준으로 라우팅됩니다.
- DM은 세션 키
agent:<agentId>:googlechat:direct:<spaceId>를 사용합니다. - 스페이스는 세션 키
agent:<agentId>:googlechat:group:<spaceId>를 사용합니다.
- DM은 세션 키
- DM 액세스는 기본적으로 pairing입니다. 알 수 없는 발신자에게는 pairing 코드가 전송되며, 다음으로 승인합니다.
openclaw pairing approve googlechat <code>
- 그룹 스페이스는 기본적으로 @멘션이 필요합니다. 멘션 감지에 앱의 사용자 이름이 필요하면
botUser를 사용하세요.
대상
전송 및 허용 목록에는 다음 식별자를 사용하세요.- 다이렉트 메시지:
users/<userId>(권장). - 원시 이메일
name@example.com은 변경 가능하며channels.googlechat.dangerouslyAllowNameMatching: true일 때만 다이렉트 허용 목록 일치에 사용됩니다. - 사용 중단 예정:
users/<email>은 이메일 허용 목록이 아니라 사용자 ID로 처리됩니다. - 스페이스:
spaces/<spaceId>.
주요 구성
- 서비스 계정 자격 증명은
serviceAccount(JSON 문자열)로 인라인 전달할 수도 있습니다. serviceAccountRef도 지원됩니다(env/file SecretRef).channels.googlechat.accounts.<id>.serviceAccountRef아래 계정별 참조도 포함됩니다.webhookPath가 설정되지 않은 경우 기본 웹훅 경로는/googlechat입니다.dangerouslyAllowNameMatching은 허용 목록에 대해 변경 가능한 이메일 주체 일치를 다시 활성화합니다(비상 호환 모드).actions.reactions가 활성화되어 있으면 반응은reactions도구 및channels action을 통해 사용할 수 있습니다.- 메시지 작업은 텍스트용
send와 명시적 첨부파일 전송용upload-file을 노출합니다.upload-file은media/filePath/path와 선택적message,filename, 스레드 대상을 받습니다. typingIndicator는none,message(기본값),reaction을 지원합니다(reaction은 사용자 OAuth 필요).- 첨부파일은 Chat API를 통해 다운로드되어 미디어 파이프라인에 저장됩니다(크기는
mediaMaxMb로 제한).
문제 해결
405 Method Not Allowed
Google Cloud Logs Explorer에 다음과 같은 오류가 표시되는 경우:-
채널이 구성되지 않음: config에
channels.googlechat섹션이 없습니다. 다음으로 확인하세요.“Config path not found”가 반환되면 구성을 추가하세요(주요 구성 참조). -
플러그인이 활성화되지 않음: 플러그인 상태를 확인하세요.
“disabled”로 표시되면 config에
plugins.entries.googlechat.enabled: true를 추가하세요. -
게이트웨이를 재시작하지 않음: config를 추가한 후 게이트웨이를 재시작하세요.
기타 문제
- 인증 오류 또는 누락된 audience 구성을 확인하려면
openclaw channels status --probe를 확인하세요. - 메시지가 도착하지 않으면 Chat 앱의 웹훅 URL과 이벤트 구독을 확인하세요.
- 멘션 게이팅 때문에 응답이 차단되면
botUser를 앱의 사용자 리소스 이름으로 설정하고requireMention을 확인하세요. - 요청이 게이트웨이에 도달하는지 확인하려면 테스트 메시지를 보내면서
openclaw logs --follow를 사용하세요.
관련
- Channels Overview — 지원되는 모든 채널
- Pairing — DM 인증 및 pairing 흐름
- Groups — 그룹 채팅 동작 및 멘션 게이팅
- Channel Routing — 메시지의 세션 라우팅
- Security — 액세스 모델 및 보안 강화