Gmail PubSub
Цель: Наблюдение Gmail -> Pub/Sub push -> gog gmail watch serve -> вебхук OpenClaw.
Предварительные требования
- Установленный и авторизованный
gcloud(руководство по установке). - Установленный и авторизованный для аккаунта Gmail
gog(gogcli) (gogcli.sh). - Включённые хуки OpenClaw (см. Вебхуки).
- Авторизованный
tailscale(tailscale.com). Поддерживаемая конфигурация использует Tailscale Funnel для публичной HTTPS-конечной точки. Другие туннельные сервисы могут работать, но требуют самостоятельной настройки и не поддерживаются. В настоящее время мы поддерживаем только Tailscale.
Пример конфигурации хука (включите пресет Gmail):
{
hooks: {
enabled: true,
token: "OPENCLAW_HOOK_TOKEN",
path: "/hooks",
presets: ["gmail"],
},
}
Чтобы доставить сводку Gmail в чат, переопределите пресет с помощью маппинга, который устанавливает deliver + опционально channel/to:
{
hooks: {
enabled: true,
token: "OPENCLAW_HOOK_TOKEN",
presets: ["gmail"],
mappings: [
{
match: { path: "gmail" },
action: "agent",
wakeMode: "now",
name: "Gmail",
sessionKey: "hook:gmail:{{messages[0].id}}",
messageTemplate: "Новое письмо от {{messages[0].from}}\nТема: {{messages[0].subject}}\n{{messages[0].snippet}}\n{{messages[0].body}}",
model: "openai/gpt-5.2-mini",
deliver: true,
channel: "last",
// to: "+15551234567"
},
],
},
}
Если нужен фиксированный канал, установите channel + to. Иначе channel: "last" использует последний маршрут доставки (резервный — WhatsApp). Чтобы принудительно использовать более дешёвую модель для Gmail, установите model в маппинге (provider/model или алиас). Если вы задали agents.defaults.models, включите её туда. Чтобы задать модель по умолчанию и уровень мышления именно для хуков Gmail, добавьте hooks.gmail.model / hooks.gmail.thinking в свою конфигурацию:
{
hooks: {
gmail: {
model: "openrouter/meta-llama/llama-3.3-70b-instruct:free",
thinking: "off",
},
},
}
Примечания:
model/thinkingдля конкретного хука в маппинге всё равно переопределяют эти значения по умолчанию.- Порядок отката:
hooks.gmail.model→agents.defaults.model.fallbacks→ основная модель (авторизация/лимиты/таймауты). - Если задан
agents.defaults.models, модель Gmail должна быть в списке разрешённых. - Содержимое хука Gmail по умолчанию оборачивается границами безопасности для внешнего контента. Чтобы отключить (опасно), установите
hooks.gmail.allowUnsafeExternalContent: true.
Для дальнейшей кастомизации обработки полезной нагрузки добавьте hooks.mappings или JS/TS модуль преобразования в ~/.openclaw/hooks/transforms (см. Вебхуки).
Мастер (рекомендуется)
Используйте помощник OpenClaw, чтобы связать всё вместе (устанавливает зависимости на macOS через brew):
openclaw webhooks gmail setup \
--account openclaw@gmail.com
Значения по умолчанию:
- Использует Tailscale Funnel для публичной push-конечной точки.
- Записывает конфигурацию
hooks.gmailдляopenclaw webhooks gmail run. - Включает пресет Gmail (
hooks.presets: ["gmail"]).
Примечание о пути: когда tailscale.mode включён, OpenClaw автоматически устанавливает hooks.gmail.serve.path в / и сохраняет публичный путь в hooks.gmail.tailscale.path (по умолчанию /gmail-pubsub), потому что Tailscale удаляет установленный префикс пути перед проксированием. Если нужно, чтобы бэкенд получал путь с префиксом, установите hooks.gmail.tailscale.target (или --tailscale-target) на полный URL, например http://127.0.0.1:8788/gmail-pubsub, и сопоставьте hooks.gmail.serve.path. Нужна пользовательская конечная точка? Используйте --push-endpoint <url> или --tailscale off. Примечание о платформе: на macOS мастер устанавливает gcloud, gogcli и tailscale через Homebrew; на Linux установите их вручную заранее. Автозапуск шлюза (рекомендуется):
- Когда
hooks.enabled=trueиhooks.gmail.accountзадан, Шлюз запускаетgog gmail watch serveпри загрузке и автоматически обновляет наблюдение. - Установите
OPENCLAW_SKIP_GMAIL_WATCHER=1, чтобы отказаться (полезно, если вы запускаете демон самостоятельно). - Не запускайте ручной демон одновременно, иначе получите ошибку
listen tcp 127.0.0.1:8788: bind: address already in use.
Ручной демон (запускает gog gmail watch serve + автообновление):
openclaw webhooks gmail run
Разовая настройка
- Выберите проект GCP, которому принадлежит OAuth-клиент, используемый
gog.
gcloud auth login
gcloud config set project <project-id>
Примечание: Наблюдение Gmail требует, чтобы тема Pub/Sub находилась в том же проекте, что и OAuth-клиент.
- Включите API:
gcloud services enable gmail.googleapis.com pubsub.googleapis.com
- Создайте тему:
gcloud pubsub topics create gog-gmail-watch
- Разрешите Gmail push публиковать:
gcloud pubsub topics add-iam-policy-binding gog-gmail-watch \
--member=serviceAccount:gmail-api-push@system.gserviceaccount.com \
--role=roles/pubsub.publisher
Запуск наблюдения
gog gmail watch start \
--account openclaw@gmail.com \
--label INBOX \
--topic projects/<project-id>/topics/gog-gmail-watch
Сохраните history_id из вывода (для отладки).
Запуск обработчика push-уведомлений
Локальный пример (аутентификация общим токеном):
gog gmail watch serve \
--account openclaw@gmail.com \
--bind 127.0.0.1 \
--port 8788 \
--path /gmail-pubsub \
--token <shared> \
--hook-url http://127.0.0.1:18789/hooks/gmail \
--hook-token OPENCLAW_HOOK_TOKEN \
--include-body \
--max-bytes 20000
Примечания:
--tokenзащищает push-конечную точку (x-gog-tokenили?token=).--hook-urlуказывает на OpenClaw/hooks/gmail(сопоставлен; изолированный запуск + сводка в основной).--include-bodyи--max-bytesуправляют фрагментом тела, отправляемым в OpenClaw.
Рекомендуется: openclaw webhooks gmail run оборачивает тот же процесс и автоматически обновляет наблюдение.
Публикация обработчика (продвинутый, не поддерживается)
Если нужен туннель не на Tailscale, настройте его вручную и используйте публичный URL в push-подписке (не поддерживается, без защитных механизмов):
cloudflared tunnel --url http://127.0.0.1:8788 --no-autoupdate
Используйте сгенерированный URL как push-конечную точку:
gcloud pubsub subscriptions create gog-gmail-watch-push \
--topic gog-gmail-watch \
--push-endpoint "https://<public-url>/gmail-pubsub?token=<shared>"
Продакшен: используйте стабильную HTTPS-конечную точку и настройте OIDC JWT для Pub/Sub, затем запустите:
gog gmail watch serve --verify-oidc --oidc-email <svc@...>
Тестирование
Отправьте сообщение в отслеживаемый ящик:
gog gmail send \
--account openclaw@gmail.com \
--to openclaw@gmail.com \
--subject "watch test" \
--body "ping"
Проверьте состояние наблюдения и историю:
gog gmail watch status --account openclaw@gmail.com
gog gmail history --account openclaw@gmail.com --since <historyId>
Устранение неполадок
Invalid topicName: несоответствие проекта (тема не в проекте OAuth-клиента).User not authorized: отсутствуетroles/pubsub.publisherдля темы.- Пустые сообщения: Gmail push предоставляет только
historyId; получайте черезgog gmail history.
Очистка
gog gmail watch stop --account openclaw@gmail.com
gcloud pubsub subscriptions delete gog-gmail-watch-push
gcloud pubsub topics delete gog-gmail-watch