Mainstream messaging
Google Chat
Google Chat بهعنوان Plugin رسمی @openclaw/googlechat اجرا میشود: پیامهای مستقیم و فضاها از طریق Webhookهای APIِ Google Chat (فقط نقطه پایانی HTTP، بدون Pub/Sub).
نصب
openclaw plugins install @openclaw/googlechatنسخه محلی مخزن (هنگام اجرا از یک مخزن git):
openclaw plugins install ./path/to/local/googlechat-pluginراهاندازی سریع (مبتدی)
- یک پروژه Google Cloud ایجاد و Google Chat API را فعال کنید.
- به این نشانی بروید: اعتبارنامههای APIِ Google Chat
- اگر API از قبل فعال نیست، آن را فعال کنید.
- یک Service Account ایجاد کنید:
- Create Credentials > Service Account را فشار دهید.
- هر نامی که میخواهید برای آن انتخاب کنید (برای مثال،
openclaw-chat). - مجوزها و کاربران اصلی را خالی بگذارید (Continue و سپس Done).
- کلید JSON را ایجاد و بارگیری کنید:
- روی حساب سرویس جدید کلیک کنید > زبانه Keys > Add Key > Create new key > JSON > Create.
- فایل JSON بارگیریشده را روی میزبان Gateway خود ذخیره کنید (برای مثال،
~/.openclaw/googlechat-service-account.json). - در پیکربندی Chat در Google Cloud Console یک برنامه Google Chat ایجاد کنید:
- بخش Application info (نام برنامه، نشانی اینترنتی آواتار، توضیحات) را تکمیل کنید.
- Interactive features را فعال کنید.
- در بخش Functionality، گزینه Join spaces and group conversations را علامت بزنید.
- در بخش Connection settings، گزینه HTTP endpoint URL را انتخاب کنید.
- در بخش Triggers، گزینه Use a common HTTP endpoint URL for all triggers را انتخاب کنید و آن را روی نشانی عمومی Gateway خود بههمراه
/googlechatتنظیم کنید (به نشانی عمومی مراجعه کنید). - در بخش Visibility، گزینه Make this Chat app available to specific people and groups in
<Your Domain>را علامت بزنید و نشانی ایمیل خود را وارد کنید. - روی Save کلیک کنید.
- وضعیت برنامه را فعال کنید: صفحه را تازهسازی کنید، App status را بیابید، آن را روی Live - available to users تنظیم کنید و دوباره Save را بزنید.
- OpenClaw را با حساب سرویس و مخاطب Webhook پیکربندی کنید (باید با پیکربندی برنامه Chat مطابقت داشته باشد):
- متغیر محیطی:
GOOGLE_CHAT_SERVICE_ACCOUNT_FILE=/path/to/service-account.json(فقط حساب پیشفرض)، یا - پیکربندی: به نکات برجسته پیکربندی مراجعه کنید.
openclaw channels add --channel googlechatهمچنین--audience-type،--audience،--webhook-pathو--webhook-urlرا میپذیرد.
- متغیر محیطی:
- Gateway را راهاندازی کنید. Google Chat درخواستهای POST را به مسیر Webhook شما ارسال میکند (پیشفرض
/googlechat).
افزودن به Google Chat
پس از اجرای Gateway و قرار گرفتن ایمیل شما در فهرست مشاهدهپذیری:
- به Google Chat بروید.
- روی نماد + (علامت جمع) کنار Direct Messages کلیک کنید.
- نامی را که در Google Cloud Console برای App name پیکربندی کردهاید جستوجو کنید.
- ربات در فهرست مرور Marketplace ظاهر نمیشود، زیرا برنامه خصوصی است؛ آن را با نام جستوجو کنید.
- ربات را انتخاب کنید، روی Add یا Chat کلیک کنید و پیامی بفرستید.
نشانی عمومی (فقط Webhook)
Webhookهای Google Chat به یک نقطه پایانی عمومی HTTPS نیاز دارند. برای امنیت، فقط مسیر /googlechat را در معرض اینترنت قرار دهید و داشبورد OpenClaw و دیگر نقاط پایانی را خصوصی نگه دارید.
گزینه الف: Tailscale Funnel (پیشنهادی)
برای داشبورد خصوصی از Tailscale Serve و برای مسیر عمومی Webhook از Funnel استفاده کنید.
-
بررسی کنید Gateway شما به چه نشانیای متصل است:
bash ss -tlnp | grep 18789نشانی IP را یادداشت کنید (برای مثال،
127.0.0.1،0.0.0.0یا یک نشانی Tailscale از نوع100.x.x.x). -
داشبورد را فقط در اختیار tailnet قرار دهید (درگاه 8443):
bash # If bound to localhost (127.0.0.1 or 0.0.0.0):tailscale serve --bg --https 8443 http://127.0.0.1:18789 # If bound to a Tailscale IP only:tailscale serve --bg --https 8443 http://100.x.x.x:18789 -
فقط مسیر Webhook را بهصورت عمومی در معرض دسترسی قرار دهید:
bash # If bound to localhost (127.0.0.1 or 0.0.0.0):tailscale funnel --bg --set-path /googlechat http://127.0.0.1:18789/googlechat # If bound to a Tailscale IP only:tailscale funnel --bg --set-path /googlechat http://100.x.x.x:18789/googlechat -
اگر از شما خواسته شد، برای فعالسازی Funnel برای این Node، نشانی مجوز نمایشدادهشده در خروجی را باز کنید.
-
تأیید کنید:
bash tailscale serve statustailscale funnel status
نشانی عمومی Webhook شما https://<node-name>.<tailnet>.ts.net/googlechat است؛ داشبورد در https://<node-name>.<tailnet>.ts.net:8443/ فقط در دسترس tailnet باقی میماند. در پیکربندی برنامه Google Chat از نشانی عمومی (بدون :8443) استفاده کنید.
نکته: این پیکربندی پس از راهاندازی مجدد نیز باقی میماند. بعداً آن را با
tailscale funnel resetوtailscale serve resetحذف کنید.
گزینه ب: پراکسی معکوس (Caddy)
فقط مسیر Webhook را پراکسی کنید:
your-domain.com { reverse_proxy /googlechat* localhost:18789}درخواستهای your-domain.com/ نادیده گرفته میشوند یا پاسخ 404 میگیرند، درحالیکه your-domain.com/googlechat به OpenClaw هدایت میشود.
گزینه پ: Cloudflare Tunnel
قواعد ورودی تونل را طوری پیکربندی کنید که فقط مسیر Webhook را هدایت کنند:
- Path:
/googlechat->http://localhost:18789/googlechat - Default rule: HTTP 404 (Not Found)
نحوه کار
- Google Chat داده JSON را با درخواست POST به مسیر Webhook در Gateway ارسال میکند (فقط POST، نوع محتوای JSON الزامی و نرخ درخواست بهازای هر IP محدود است).
- OpenClaw پیش از ارسال هر درخواست، آن را احراز هویت میکند:
- رویدادهای برنامه Chat شامل
Authorization: Bearer <token>هستند؛ توکن پیش از تجزیه کامل بدنه تأیید میشود. - رویدادهای افزونه Google Workspace توکن را در بدنه (
authorizationEventObject.systemIdToken) حمل میکنند و پیش از تأیید، تحت محدودیت سختگیرانهتری برای مرحله پیش از احراز هویت (۱۶ کیلوبایت، ۳ ثانیه) خوانده میشوند.
- رویدادهای برنامه Chat شامل
- توکن در برابر
audienceTypeوaudienceبررسی میشود:audienceType: "app-url"← مخاطب، نشانی HTTPS مربوط به Webhook شما است.audienceType: "project-number"← مخاطب، شماره پروژه Cloud است.- توکنهای افزونه تحت
app-urlعلاوه بر این، نیاز دارندappPrincipalروی شناسه عددی کلاینت OAuth 2.0 برنامه تنظیم شود (۲۱ رقم، نه ایمیل)؛ در غیر این صورت، تأیید با ثبت یک هشدار شکست میخورد.
- پیامها بر اساس فضا هدایت میشوند:
- فضاها نشستهای جداگانه بهازای هر فضا با قالب
agent:<agentId>:googlechat:group:<spaceId>دریافت میکنند؛ پاسخها به رشته پیام ارسال میشوند. - پیامهای مستقیم بهطور پیشفرض در نشست اصلی عامل ادغام میشوند؛ برای نشستهای پیام مستقیم جداگانه بهازای هر همتا،
session.dmScopeرا تنظیم کنید (به نشست مراجعه کنید).
- فضاها نشستهای جداگانه بهازای هر فضا با قالب
- دسترسی به پیام مستقیم بهطور پیشفرض مبتنی بر جفتسازی است. فرستندگان ناشناس یک کد جفتسازی دریافت میکنند؛ آن را با دستور زیر تأیید کنید:
openclaw pairing approve googlechat <code>
- فضاهای گروهی بهطور پیشفرض نیازمند اشاره با @ هستند. اشارهها از حاشیهنویسیهای
USER_MENTIONدر Chat که برنامه را هدف میگیرند شناسایی میشوند؛ اگر شناسایی به نام منبع کاربر برنامه نیاز دارد،botUserرا تنظیم کنید (برای مثال،users/1234567890). - هنگامی که یک تأیید اجرای دستور یا Plugin از Google Chat آغاز میشود و یک تأییدکننده پایدار با قالب
users/<id>پیکربندی شده است، OpenClaw یک کارت تأیید بومی (cardsV2) در فضا یا رشته مبدأ ارسال میکند. دکمههای کارت توکنهای بازخوانی مبهمی حمل میکنند؛ اعلان دستی/approve <id> <decision>فقط زمانی ظاهر میشود که تحویل بومی در دسترس نباشد.
مقصدها
برای تحویل و فهرستهای مجاز از این شناسهها استفاده کنید:
- پیامهای مستقیم:
users/<userId>(پیشنهادی). - فضاها:
spaces/<spaceId>. - ایمیل خام
name@example.comقابل تغییر است و فقط زمانی برای تطبیق فهرست مجاز استفاده میشود کهchannels.googlechat.dangerouslyAllowNameMatching: trueباشد. - منسوخشده:
users/<email>بهعنوان شناسه کاربر در نظر گرفته میشود، نه یک ورودی ایمیل در فهرست مجاز. - پیشوندهای
googlechat:،google-chat:وgchat:پذیرفته و حذف میشوند.
نکات برجسته پیکربندی
{ channels: { googlechat: { enabled: true, serviceAccountFile: "/path/to/service-account.json", // or serviceAccountRef: { source: "file", provider: "filemain", id: "/channels/googlechat/serviceAccount" } audienceType: "app-url", audience: "https://gateway.example.com/googlechat", appPrincipal: "123456789012345678901", // add-on verification only; numeric OAuth client ID webhookPath: "/googlechat", botUser: "users/1234567890", // optional; helps mention detection allowBots: false, dm: { policy: "pairing", allowFrom: ["users/1234567890"], }, groupPolicy: "allowlist", groups: { "spaces/AAAA": { enabled: true, requireMention: true, users: ["users/1234567890"], systemPrompt: "Short answers only.", }, }, typingIndicator: "message", mediaMaxMb: 20, }, },}نکات:
- اعتبارنامههای حساب سرویس:
serviceAccountFile(مسیر)،serviceAccount(رشته یا شیء JSON درونخطی) یاserviceAccountRef(ارجاع محرمانه env/file). متغیرهای محیطیGOOGLE_CHAT_SERVICE_ACCOUNT(JSON درونخطی) وGOOGLE_CHAT_SERVICE_ACCOUNT_FILE(مسیر) فقط برای حساب پیشفرض اعمال میشوند. راهاندازیهای چندحسابی ازchannels.googlechat.accounts.<id>با همان کلیدها، از جملهserviceAccountRefجداگانه برای هر حساب، استفاده میکنند. - وقتی
webhookPathتنظیم نشده باشد، مسیر پیشفرض Webhook برابر/googlechatاست؛webhookUrlنیز میتواند مسیر را فراهم کند. - کلیدهای گروه باید شناسههای پایدار فضا (
spaces/<spaceId>) باشند. کلیدهای مبتنی بر نام نمایشی منسوخ شدهاند و با همین عنوان ثبت میشوند. dangerouslyAllowNameMatchingتطبیق کاربران اصلی بر اساس ایمیل قابل تغییر را برای فهرستهای مجاز دوباره فعال میکند (حالت سازگاری اضطراری)؛ ابزار doctor درباره ورودیهای ایمیل هشدار میدهد.- کنشهای واکنش Google Chat ارائه نمیشوند. این Plugin از احراز هویت حساب سرویس استفاده میکند، درحالیکه نقاط پایانی واکنش Google Chat به احراز هویت کاربر نیاز دارند. پیکربندی موجود
actions.reactionsبرای سازگاری پذیرفته میشود، اما اثری ندارد. - کارتهای تأیید بومی از کلیک دکمههای
cardsV2در Google Chat استفاده میکنند، نه رویدادهای واکنش. تأییدکنندگان ازdm.allowFromیاdefaultToگرفته میشوند و باید مقادیر عددی و پایدارusers/<id>باشند. - کنشهای پیام فقط
sendمتنی را ارائه میکنند. بارگذاری پیوست در Google Chat به احراز هویت کاربر نیاز دارد، درحالیکه این Plugin از احراز هویت حساب سرویس استفاده میکند؛ بنابراین بارگذاری فایل خروجی ارائه نمیشود. typingIndicator: مقدارmessage(پیشفرض) یک جاینگهدار_<Bot> is typing..._ارسال میکند و آن را به اولین پاسخ ویرایش میکند؛noneآن را غیرفعال میکند؛reactionبه OAuth کاربر نیاز دارد و در حال حاضر هنگام استفاده از احراز هویت حساب سرویس، با ثبت خطا بهmessageبازمیگردد.- پیوستهای ورودی (اولین پیوست هر پیام) از طریق APIِ Chat در خط لوله رسانه بارگیری میشوند و اندازه آنها به
mediaMaxMb(پیشفرض ۲۰) محدود است. - پیامهای نوشتهشده توسط ربات بهطور پیشفرض نادیده گرفته میشوند. با
allowBots: true، پیامهای پذیرفتهشده ربات از محافظت مشترک در برابر حلقه ربات استفاده میکنند: ابتداchannels.defaults.botLoopProtectionرا پیکربندی کنید و سپس باchannels.googlechat.botLoopProtectionیاchannels.googlechat.groups.<space>.botLoopProtectionآن را بازنویسی کنید.
جزئیات ارجاع به اطلاعات محرمانه: مدیریت اطلاعات محرمانه.
عیبیابی
405 روش مجاز نیست
اگر Google Cloud Logs Explorer خطاهایی مانند نمونه زیر نشان میدهد:
status code: 405, reason phrase: HTTP error response: HTTP/1.1 405 Method Not Allowedکنترلکننده Webhook ثبت نشده است. علتهای رایج:
-
کانال پیکربندی نشده است: بخش
channels.googlechatوجود ندارد. با دستور زیر بررسی کنید:bash openclaw config get channels.googlechatاگر
"Config path not found"را برمیگرداند، پیکربندی را اضافه کنید (به نکات برجسته پیکربندی مراجعه کنید). -
Plugin فعال نیست: وضعیت Plugin را بررسی کنید:
bash openclaw plugins list | grep googlechatاگر
"disabled"را نشان میدهد،plugins.entries.googlechat.enabled: trueرا به پیکربندی خود اضافه کنید. -
Gateway پس از تغییرات پیکربندی راهاندازی مجدد نشده است:
bash openclaw gateway restart
بررسی کنید کانال در حال اجرا است:
openclaw channels status# Should show: Google Chat default: enabled, configured, ...مشکلات دیگر
openclaw channels status --probeخطاهای احراز هویت و نبود پیکربندی مخاطب را نمایان میکند (audienceوaudienceTypeهر دو الزامی هستند).- اگر هیچ پیامی دریافت نمیشود، نشانی Webhook و پیکربندی محرک برنامه Chat را تأیید کنید.
- اگر الزام اشاره مانع پاسخها میشود،
botUserرا روی نام منبع کاربر برنامه تنظیم وrequireMentionرا بررسی کنید. - اجرای
openclaw logs --followهنگام ارسال یک پیام آزمایشی نشان میدهد که آیا درخواستها به Gateway میرسند یا نه.
مرتبط
- نمای کلی کانالها — همه کانالهای پشتیبانیشده
- مسیریابی کانال — مسیریابی نشست برای پیامها
- پیکربندی Gateway
- گروهها — رفتار گفتوگوی گروهی و محدودسازی بر اساس اشاره
- جفتسازی — احراز هویت پیام مستقیم و فرایند جفتسازی
- امنیت — مدل دسترسی و سختسازی