Mattermost
الحالة: plugin مضمّن (رمز bot المميز + أحداث WebSocket). القنوات والمجموعات والرسائل الخاصة مدعومة. Mattermost هو منصة مراسلة جماعية قابلة للاستضافة الذاتية؛ راجع الموقع الرسمي على mattermost.com للحصول على تفاصيل المنتج والتنزيلات.plugin المضمّن
يأتي Mattermost كـ plugin مضمّن في إصدارات OpenClaw الحالية، لذلك لا تحتاج الإصدارات المعبأة العادية إلى تثبيت منفصل. إذا كنت تستخدم إصدارًا أقدم أو تثبيتًا مخصصًا لا يتضمن Mattermost، فثبّته يدويًا: التثبيت عبر CLI (سجل npm):الإعداد السريع
- تأكد من أن plugin Mattermost متاح.
- تتضمن إصدارات OpenClaw المعبأة الحالية هذا plugin بالفعل.
- يمكن للتثبيتات الأقدم/المخصصة إضافته يدويًا باستخدام الأوامر أعلاه.
- أنشئ حساب bot في Mattermost وانسخ رمز bot المميز.
- انسخ عنوان URL الأساسي لـ Mattermost (مثل
https://chat.example.com). - قم بتكوين OpenClaw وابدأ gateway.
أوامر الشرطة المائلة الأصلية
أوامر الشرطة المائلة الأصلية اختيارية. عند تمكينها، يسجل OpenClaw أوامر الشرطة المائلةoc_* عبر
واجهة Mattermost API ويتلقى طلبات POST الراجعة على خادم HTTP الخاص بـ gateway.
- تكون القيمة الافتراضية لـ
native: "auto"هي التعطيل في Mattermost. عيّنnative: trueللتمكين. - إذا تم حذف
callbackUrl، فسيشتق OpenClaw قيمة من مضيف/منفذ gateway +callbackPath. - في إعدادات الحسابات المتعددة، يمكن تعيين
commandsفي المستوى الأعلى أو تحتchannels.mattermost.accounts.<id>.commands(تتجاوز قيم الحساب حقول المستوى الأعلى). - يتم التحقق من عمليات callback الخاصة بالأوامر باستخدام الرموز المميزة لكل أمر التي يعيدها
Mattermost عندما يسجل OpenClaw أوامر
oc_*. - تفشل عمليات callback الخاصة بأوامر الشرطة المائلة بشكل مغلق عندما يفشل التسجيل، أو يكون بدء التشغيل جزئيًا، أو لا يطابق رمز callback أحد الأوامر المسجلة.
- متطلب إمكانية الوصول: يجب أن تكون نقطة نهاية callback قابلة للوصول من خادم Mattermost.
- لا تعيّن
callbackUrlإلىlocalhostإلا إذا كان Mattermost يعمل على نفس المضيف/namespace الشبكة مثل OpenClaw. - لا تعيّن
callbackUrlإلى عنوان URL الأساسي لـ Mattermost إلا إذا كان هذا العنوان يستخدم reverse-proxy للمسار/api/channels/mattermost/commandإلى OpenClaw. - فحص سريع هو
curl https://<gateway-host>/api/channels/mattermost/command; يجب أن يعيد طلب GET قيمة405 Method Not Allowedمن OpenClaw، وليس404.
- لا تعيّن
- متطلب قائمة السماح لخروج Mattermost:
- إذا كان callback لديك يستهدف عناوين خاصة/tailnet/داخلية، فعيّن
ServiceSettings.AllowedUntrustedInternalConnectionsفي Mattermost ليشمل مضيف/نطاق callback. - استخدم إدخالات المضيف/النطاق، وليس عناوين URL كاملة.
- جيد:
gateway.tailnet-name.ts.net - سيئ:
https://gateway.tailnet-name.ts.net
- جيد:
- إذا كان callback لديك يستهدف عناوين خاصة/tailnet/داخلية، فعيّن
متغيرات البيئة (الحساب الافتراضي)
اضبط هذه المتغيرات على مضيف gateway إذا كنت تفضل استخدام متغيرات البيئة:MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
default). يجب أن تستخدم الحسابات الأخرى قيم التكوين.
أوضاع الدردشة
يرد Mattermost على الرسائل الخاصة تلقائيًا. يتم التحكم في سلوك القنوات بواسطةchatmode:
oncall(الافتراضي): الرد فقط عند الإشارة إليه بـ @ في القنوات.onmessage: الرد على كل رسالة في القناة.onchar: الرد عندما تبدأ الرسالة ببادئة تشغيل.
- ما زال
oncharيرد على إشارات @ الصريحة. - يتم احترام
channels.mattermost.requireMentionفي التكوينات القديمة لكنchatmodeهو المفضل.
سلاسل الرسائل والجلسات
استخدمchannels.mattermost.replyToMode للتحكم في ما إذا كانت الردود في القنوات والمجموعات تبقى في
القناة الرئيسية أو تبدأ سلسلة رسائل تحت المنشور المُشغِّل.
off(الافتراضي): لا يتم الرد في سلسلة رسائل إلا عندما يكون المنشور الوارد داخل سلسلة بالفعل.first: بالنسبة لمنشورات القنوات/المجموعات ذات المستوى الأعلى، ابدأ سلسلة رسائل تحت ذلك المنشور ووجّه المحادثة إلى جلسة ضمن نطاق السلسلة.all: نفس سلوكfirstفي Mattermost حاليًا.- تتجاهل الرسائل الخاصة هذا الإعداد وتبقى بدون سلاسل.
- تستخدم الجلسات ضمن نطاق السلسلة معرّف المنشور المُشغِّل كجذر للسلسلة.
firstوallمتكافئان حاليًا لأنه بمجرد أن يملك Mattermost جذر سلسلة، تستمر الأجزاء اللاحقة والوسائط في نفس السلسلة.
التحكم في الوصول (الرسائل الخاصة)
- الافتراضي:
channels.mattermost.dmPolicy = "pairing"(يحصل المرسلون غير المعروفين على رمز اقتران). - وافق عبر:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- الرسائل الخاصة العامة:
channels.mattermost.dmPolicy="open"معchannels.mattermost.allowFrom=["*"].
القنوات (المجموعات)
- الافتراضي:
channels.mattermost.groupPolicy = "allowlist"(مقيّد بالإشارة). - اسمح للمرسلين عبر
channels.mattermost.groupAllowFrom(يوصى باستخدام معرّفات المستخدمين). - توجد تجاوزات الإشارة لكل قناة تحت
channels.mattermost.groups.<channelId>.requireMentionأوchannels.mattermost.groups["*"].requireMentionكقيمة افتراضية. - المطابقة باستخدام
@usernameقابلة للتغيير ولا يتم تمكينها إلا عندما تكونchannels.mattermost.dangerouslyAllowNameMatching: true. - القنوات المفتوحة:
channels.mattermost.groupPolicy="open"(مقيّد بالإشارة). - ملاحظة وقت التشغيل: إذا كانت
channels.mattermostمفقودة بالكامل، فإن وقت التشغيل يعود إلىgroupPolicy="allowlist"لفحوصات المجموعات (حتى لو كانتchannels.defaults.groupPolicyمعيّنة).
الأهداف للتسليم الصادر
استخدم صيغ الأهداف التالية معopenclaw message send أو cron/webhooks:
channel:<id>لقناةuser:<id>لرسالة خاصة@usernameلرسالة خاصة (يتم حلها عبر Mattermost API)
64ifufp...) ملتبسة في Mattermost (معرّف مستخدم أم معرّف قناة).
يقوم OpenClaw بحلها كمستخدم أولًا:
- إذا كان المعرّف موجودًا كمستخدم (
GET /api/v4/users/<id>ينجح)، يرسل OpenClaw رسالة خاصة عبر حل القناة المباشرة باستخدام/api/v4/channels/direct. - بخلاف ذلك، يُعامل المعرّف على أنه معرّف قناة.
user:<id> / channel:<id>).
إعادة محاولة قناة الرسائل الخاصة
عندما يرسل OpenClaw إلى هدف رسالة خاصة في Mattermost ويحتاج إلى حل القناة المباشرة أولًا، فإنه يعيد محاولة إخفاقات إنشاء القناة المباشرة العابرة افتراضيًا. استخدمchannels.mattermost.dmChannelRetry لضبط هذا السلوك عمومًا لـ plugin Mattermost،
أو channels.mattermost.accounts.<id>.dmChannelRetry لحساب واحد.
- ينطبق هذا فقط على إنشاء قناة الرسائل الخاصة (
/api/v4/channels/direct)، وليس على كل استدعاء Mattermost API. - تنطبق إعادة المحاولات على الإخفاقات العابرة مثل حدود المعدل، واستجابات 5xx، وأخطاء الشبكة أو انتهاء المهلة.
- تُعامل أخطاء العميل 4xx بخلاف
429على أنها دائمة ولا تتم إعادة محاولتها.
التفاعلات (أداة الرسائل)
- استخدم
message action=reactمعchannel=mattermost. messageIdهو معرّف منشور Mattermost.- تقبل
emojiأسماء مثلthumbsupأو:+1:(النقطتان اختيارية). - عيّن
remove=true(منطقي) لإزالة تفاعل. - يتم تمرير أحداث إضافة/إزالة التفاعل كأحداث نظام إلى جلسة الوكيل الموجّهة.
channels.mattermost.actions.reactions: تمكين/تعطيل إجراءات التفاعل (الافتراضي true).- تجاوز لكل حساب:
channels.mattermost.accounts.<id>.actions.reactions.
الأزرار التفاعلية (أداة الرسائل)
أرسل رسائل تحتوي على أزرار قابلة للنقر. عندما ينقر المستخدم زرًا، يتلقى الوكيل الاختيار ويمكنه الرد. قم بتمكين الأزرار بإضافةinlineButtons إلى قدرات القناة:
message action=send مع معلمة buttons. الأزرار عبارة عن مصفوفة ثنائية الأبعاد (صفوف من الأزرار):
text(مطلوب): تسمية العرض.callback_data(مطلوب): القيمة التي تُرسل مرة أخرى عند النقر (تُستخدم كمعرّف الإجراء).style(اختياري):"default"أو"primary"أو"danger".
- تُستبدل كل الأزرار بسطر تأكيد (مثل ”✓ Yes selected by @user”).
- يتلقى الوكيل الاختيار كرسالة واردة ويرد.
- تستخدم عمليات callback الخاصة بالأزرار تحقق HMAC-SHA256 (تلقائي، ولا حاجة إلى تكوين).
- يزيل Mattermost بيانات callback من استجابات API الخاصة به (ميزة أمان)، لذلك تتم إزالة جميع الأزرار عند النقر — ولا يمكن الإزالة الجزئية.
- يتم تنظيف معرّفات الإجراءات التي تحتوي على شرطات أو شرطات سفلية تلقائيًا (بسبب قيد في توجيه Mattermost).
channels.mattermost.capabilities: مصفوفة سلاسل للقدرات. أضف"inlineButtons"إلى تمكين وصف أداة الأزرار في مطالبة نظام الوكيل.channels.mattermost.interactions.callbackBaseUrl: عنوان URL أساسي خارجي اختياري لعمليات callback الخاصة بالأزرار (مثلhttps://gateway.example.com). استخدمه عندما يتعذر على Mattermost الوصول إلى gateway عند مضيف الربط مباشرة.- في إعدادات الحسابات المتعددة، يمكنك أيضًا تعيين الحقل نفسه تحت
channels.mattermost.accounts.<id>.interactions.callbackBaseUrl. - إذا تم حذف
interactions.callbackBaseUrl، يشتق OpenClaw عنوان URL الخاص بـ callback منgateway.customBindHost+gateway.port، ثم يعود إلىhttp://localhost:<port>. - قاعدة إمكانية الوصول: يجب أن يكون عنوان URL الخاص بـ callback للأزرار قابلاً للوصول من خادم Mattermost.
لا يعمل
localhostإلا عندما يعمل Mattermost وOpenClaw على نفس المضيف/namespace الشبكة. - إذا كان هدف callback لديك خاصًا/tailnet/داخليًا، فأضف مضيفه/نطاقه إلى
ServiceSettings.AllowedUntrustedInternalConnectionsفي Mattermost.
تكامل API مباشر (scripts خارجية)
يمكن لـ scripts وwebhooks الخارجية نشر الأزرار مباشرة عبر Mattermost REST API بدلًا من المرور عبر أداةmessage الخاصة بالوكيل. استخدم buildButtonAttachments() من
الامتداد عندما يكون ذلك ممكنًا؛ وإذا كنت تنشر JSON خامًا، فاتبع هذه القواعد:
بنية الحمولة:
- توضع المرفقات في
props.attachments، وليس فيattachmentsعلى المستوى الأعلى (وإلا يتم تجاهلها بصمت). - يحتاج كل إجراء إلى
type: "button"— من دونه، يتم ابتلاع النقرات بصمت. - يحتاج كل إجراء إلى حقل
id— يتجاهل Mattermost الإجراءات من دون معرّفات. - يجب أن يكون
idالخاص بالإجراء أبجديًا رقميًا فقط ([a-zA-Z0-9]). تؤدي الشرطات والشرطات السفلية إلى كسر توجيه الإجراءات من جهة خادم Mattermost (ويُرجع 404). أزلها قبل الاستخدام. - يجب أن يطابق
context.action_idقيمةidالخاصة بالزر حتى تعرض رسالة التأكيد اسم الزر (مثل “Approve”) بدلًا من معرّف خام. context.action_idمطلوب — يعيد معالج التفاعل 400 من دونه.
- اشتق السر من رمز bot المميز:
HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken) - ابنِ كائن السياق بجميع الحقول باستثناء
_token. - قم بالتسلسل باستخدام مفاتيح مرتبة ومن دون مسافات (يستخدم gateway
JSON.stringifyمع مفاتيح مرتبة، ما ينتج خرجًا مضغوطًا). - وقّع:
HMAC-SHA256(key=secret, data=serializedContext) - أضف الملخص السداسي الناتج كقيمة
_tokenفي السياق.
- يضيف
json.dumpsفي Python مسافات افتراضيًا ({"key": "val"}). استخدمseparators=(",", ":")لمطابقة الخرج المضغوط في JavaScript ({"key":"val"}). - وقّع دائمًا كل حقول السياق (باستثناء
_token). يزيل gateway قيمة_tokenثم يوقّع كل ما تبقى. يؤدي توقيع مجموعة فرعية إلى فشل صامت في التحقق. - استخدم
sort_keys=True— يقوم gateway بترتيب المفاتيح قبل التوقيع، وقد يعيد Mattermost ترتيب حقول السياق عند تخزين الحمولة. - اشتق السر من رمز bot المميز (حتمي)، وليس من بايتات عشوائية. يجب أن يكون السر نفسه في كل من العملية التي تنشئ الأزرار وgateway الذي يتحقق منها.
مهايئ الدليل
يتضمن plugin Mattermost مهايئ دليل يحل أسماء القنوات والمستخدمين عبر Mattermost API. يتيح هذا استخدام أهداف#channel-name و@username في
openclaw message send وعمليات التسليم عبر cron/webhook.
لا يلزم أي تكوين — يستخدم المهايئ رمز bot المميز من تكوين الحساب.
حسابات متعددة
يدعم Mattermost حسابات متعددة تحتchannels.mattermost.accounts:
استكشاف الأخطاء وإصلاحها
- لا توجد ردود في القنوات: تأكد من وجود bot في القناة واذكره (oncall)، أو استخدم بادئة تشغيل (onchar)، أو عيّن
chatmode: "onmessage". - أخطاء المصادقة: تحقق من رمز bot المميز وعنوان URL الأساسي وما إذا كان الحساب ممكّنًا.
- مشكلات الحسابات المتعددة: تنطبق متغيرات البيئة فقط على الحساب
default. - تعيد أوامر الشرطة المائلة الأصلية
Unauthorized: invalid command token.: لم يقبل OpenClaw رمز callback المميز. الأسباب المعتادة:- فشل تسجيل أوامر الشرطة المائلة أو اكتمل جزئيًا فقط عند بدء التشغيل
- يصل callback إلى gateway/الحساب الخطأ
- ما زال Mattermost يملك أوامر قديمة تشير إلى هدف callback سابق
- أُعيد تشغيل gateway من دون إعادة تنشيط أوامر الشرطة المائلة
- إذا توقفت أوامر الشرطة المائلة الأصلية عن العمل، فتحقق من السجلات بحثًا عن
mattermost: failed to register slash commandsأوmattermost: native slash commands enabled but no commands could be registered. - إذا تم حذف
callbackUrlوكانت السجلات تحذر من أن callback تم حله إلىhttp://127.0.0.1:18789/...، فمن المحتمل أن يكون عنوان URL هذا قابلاً للوصول فقط عندما يعمل Mattermost على نفس المضيف/namespace الشبكة مثل OpenClaw. عيّنcommands.callbackUrlصريحًا وقابلًا للوصول من الخارج بدلًا من ذلك. - تظهر الأزرار كمربعات بيضاء: ربما يرسل الوكيل بيانات أزرار غير صحيحة. تحقق من أن كل زر يحتوي على الحقلين
textوcallback_data. - تُعرض الأزرار لكن النقرات لا تفعل شيئًا: تحقق من أن
AllowedUntrustedInternalConnectionsفي تكوين خادم Mattermost يتضمن127.0.0.1 localhost، وأنEnablePostActionIntegrationيساويtrueفي ServiceSettings. - تُرجع الأزرار 404 عند النقر: من المحتمل أن يحتوي
idالخاص بالزر على شرطات أو شرطات سفلية. يتعطل موجه إجراءات Mattermost مع المعرّفات غير الأبجدية الرقمية. استخدم[a-zA-Z0-9]فقط. - تُظهر سجلات gateway الرسالة
invalid _token: عدم تطابق HMAC. تحقق من أنك توقّع كل حقول السياق (وليس مجموعة فرعية)، وتستخدم مفاتيح مرتبة، وJSON مضغوطًا (من دون مسافات). راجع قسم HMAC أعلاه. - تُظهر سجلات gateway الرسالة
missing _token in context: الحقل_tokenغير موجود في سياق الزر. تأكد من تضمينه عند إنشاء حمولة التكامل. - يُظهر التأكيد معرّفًا خامًا بدلًا من اسم الزر:
context.action_idلا يطابقidالخاص بالزر. عيّن الاثنين إلى القيمة المنظفة نفسها. - الوكيل لا يعرف الأزرار: أضف
capabilities: ["inlineButtons"]إلى تكوين قناة Mattermost.
ذو صلة
- نظرة عامة على القنوات — جميع القنوات المدعومة
- الاقتران — مصادقة الرسائل الخاصة وتدفق الاقتران
- المجموعات — سلوك الدردشة الجماعية وضبط الإشارات
- توجيه القنوات — توجيه الجلسات للرسائل
- الأمان — نموذج الوصول والتقوية