Slack
وضع Socket (الافتراضي)
إعداد سريع (للمبتدئين)
- أنشئ تطبيق Slack وفعّل Socket Mode.
- أنشئ App Token (
xapp-...) وBot Token (xoxb-...). - عيّن الرموز لـ OpenClaw وابدأ الـ Gateway.
الإعداد
- أنشئ تطبيق Slack (From scratch) في https://api.slack.com/apps.
- Socket Mode → فعّل الخيار. ثم انتقل إلى Basic Information → App-Level Tokens → Generate Token and Scopes مع النطاق
connections:write. انسخ App Token (xapp-...). - OAuth & Permissions → أضف نطاقات رمز البوت (استخدم البيان أدناه). انقر Install to Workspace. انسخ Bot User OAuth Token (
xoxb-...). - اختياري: OAuth & Permissions → أضف User Token Scopes (انظر قائمة القراءة فقط أدناه). أعد تثبيت التطبيق وانسخ User OAuth Token (
xoxp-...). - Event Subscriptions → فعّل الأحداث واشترك في:
message.*(يتضمن التعديلات/الحذف/بثّ سلاسل المحادثات)app_mentionreaction_added,reaction_removedmember_joined_channel,member_left_channelchannel_renamepin_added,pin_removed
- ادعُ البوت إلى القنوات التي تريد أن يقرأها.
- الأوامر المائلة → أنشئ
/openclawإذا كنت تستخدمchannels.slack.slashCommand. إذا فعّلت الأوامر الأصلية، فأضف أمرًا مائلًا واحدًا لكل أمر مدمج (بنفس أسماء/help). الوضع الافتراضي للأوامر الأصلية في Slack هو الإيقاف ما لم تضبطchannels.slack.commands.native: true(القيمة العامةcommands.nativeهي"auto"والتي تُبقي Slack مُعطّلًا). - App Home → فعّل Messages Tab حتى يتمكن المستخدمون من مراسلة البوت مباشرة.
channels.slack.accounts مع رموز لكل حساب وخيار name الاختياري. راجع gateway/configuration للنمط المشترك.
تهيئة OpenClaw (وضع Socket)
تعيين الرموز المميزة عن طريق vars env (مستحسن):SLACK_APP_TOKEN=xapp-...SLACK_BOT_TOKEN=xoxb-...
رمز المستخدم (اختياري)
يمكن لـ OpenClaw استخدام رمز مستخدم Slack (xoxp-...) لعمليات القراءة (السجل،
التثبيتات، التفاعلات، الرموز التعبيرية، معلومات الأعضاء). افتراضيًا يبقى هذا للقراءة فقط: تفضّل القراءات رمز المستخدم عند توفره، بينما تستمر الكتابات باستخدام رمز البوت ما لم تختَر خلاف ذلك صراحةً. حتى مع userTokenReadOnly: false، يبقى رمز البوت مفضّلًا للكتابة عند توفره.
تُضبط رموز المستخدم في ملف التهيئة (لا يوجد دعم لمتغيرات البيئة). ولتعدد الحسابات، اضبط channels.slack.accounts.<id>.userToken.
مثال باستخدام رموز البوت + التطبيق + المستخدم:
استخدام الرموز
- عمليات القراءة (السجل، قائمة التفاعلات، قائمة التثبيتات، قائمة الرموز التعبيرية، معلومات الأعضاء، البحث) تفضّل رمز المستخدم عند تهيئته، وإلا فترمز البوت.
- عمليات الكتابة (إرسال/تعديل/حذف الرسائل، إضافة/إزالة التفاعلات، تثبيت/إلغاء تثبيت،
رفع الملفات) تستخدم رمز البوت افتراضيًا. إذا كان
userTokenReadOnly: falseولا يتوفر رمز بوت، يلجأ OpenClaw إلى رمز المستخدم.
سياق السجل
- يتحكم
channels.slack.historyLimit(أوchannels.slack.accounts.*.historyLimit) في عدد رسائل القناة/المجموعة الحديثة التي تُضمَّن في الموجّه. - يعود افتراضيًا إلى
messages.groupChat.historyLimit. عيّن0للتعطيل (الافتراضي 50).
وضع HTTP (واجهة الأحداث)
استخدم وضع Webhook عبر HTTP عندما يكون الـ Gateway قابلاً للوصول من Slack عبر HTTPS (وهو شائع في نشر الخوادم). يستخدم وضع HTTP واجهة الأحداث + التفاعلية + الأوامر المائلة مع عنوان طلب مشترك.الإعداد (وضع HTTP)
- أنشئ تطبيق Slack وعطّل Socket Mode (اختياري إذا كنت تستخدم HTTP فقط).
- Basic Information → انسخ Signing Secret.
- OAuth & Permissions → ثبّت التطبيق وانسخ Bot User OAuth Token (
xoxb-...). - Event Subscriptions → فعّل الأحداث وعيّن Request URL إلى مسار Webhook للـ Gateway (الافتراضي
/slack/events). - Interactivity & Shortcuts → فعّل وعيّن Request URL نفسه.
- Slash Commands → عيّن Request URL نفسه لأوامرك.
https://gateway-host/slack/events
تهيئة OpenClaw (الحد الأدنى)
channels.slack.accounts.<id>.mode = "http" وقدّم
webhookPath فريدًا لكل حساب بحيث يشير كل تطبيق Slack إلى عنوان URL خاص به.
البيان (اختياري)
استخدم بيان تطبيق Slack هذا لإنشاء التطبيق بسرعة (عدّل الاسم/الأمر إذا رغبت). ضمّن نطاقات المستخدم إذا كنت تخطط لتهيئة رمز مستخدم.slash_commands واحدًا لكل أمر تريد كشفه (مطابقًا لقائمة /help). تجاوز ذلك باستخدام channels.slack.commands.native.
النطاقات (الحالية مقابل الاختيارية)
واجهة محادثات Slack مُقيّدة حسب النوع: لا تحتاج إلا النطاقات لأنواع المحادثات التي تتعامل معها فعليًا (قنوات، مجموعات، im، mpim). راجع https://docs.slack.dev/apis/web-api/using-the-conversations-api/ للنظرة العامة.نطاقات رمز البوت (مطلوبة)
chat:write(إرسال/تحديث/حذف الرسائل عبرchat.postMessage) https://docs.slack.dev/reference/methods/chat.postMessageim:write(فتح الرسائل المباشرة عبرconversations.openلرسائل المستخدم) https://docs.slack.dev/reference/methods/conversations.openchannels:history,groups:history,im:history,mpim:historyhttps://docs.slack.dev/reference/methods/conversations.historychannels:read,groups:read,im:read,mpim:readhttps://docs.slack.dev/reference/methods/conversations.infousers:read(البحث عن المستخدم) https://docs.slack.dev/reference/methods/users.inforeactions:read,reactions:write(reactions.get/reactions.add) https://docs.slack.dev/reference/methods/reactions.get https://docs.slack.dev/reference/methods/reactions.addpins:read,pins:write(pins.list/pins.add/pins.remove) https://docs.slack.dev/reference/scopes/pins.read https://docs.slack.dev/reference/scopes/pins.writeemoji:read(emoji.list) https://docs.slack.dev/reference/scopes/emoji.readfiles:write(الرفع عبرfiles.uploadV2) https://docs.slack.dev/messaging/working-with-files/#upload
نطاقات رمز المستخدم (اختيارية، قراءة فقط افتراضيًا)
أضف هذه ضمن User Token Scopes إذا قمت بتهيئةchannels.slack.userToken.
channels:history,groups:history,im:history,mpim:historychannels:read,groups:read,im:read,mpim:readusers:readreactions:readpins:reademoji:readsearch:read
غير مطلوبة حاليًا (لكن محتملة مستقبلًا)
mpim:write(فقط إذا أضفنا فتح DM جماعي/بدء DM عبرconversations.open)groups:write(فقط إذا أضفنا إدارة القنوات الخاصة: إنشاء/إعادة تسمية/دعوة/أرشفة)chat:write.public(فقط إذا أردنا النشر في قنوات لا يكون البوت عضوًا فيها) https://docs.slack.dev/reference/scopes/chat.write.publicusers:read.email(فقط إذا احتجنا حقول البريد الإلكتروني منusers.info) https://docs.slack.dev/changelog/2017-04-narrowing-email-accessfiles:read(فقط إذا بدأنا سرد/قراءة بيانات تعريف الملفات)
التهيئة
يستخدم Slack وضع Socket فقط (لا يوجد خادم Webhook عبر HTTP). قدّم كلا الرمزين:SLACK_BOT_TOKENSLACK_APP_TOKEN
messages.ackReaction +
messages.ackReactionScope. استخدم messages.removeAckAfterReply لمسح
تفاعل الإقرار بعد رد البوت.
الحدود
- يُجزّأ النص الصادر إلى
channels.slack.textChunkLimit(الافتراضي 4000). - تجزئة الأسطر الجديدة اختيارية: عيّن
channels.slack.chunkMode="newline"للتقسيم عند الأسطر الفارغة (حدود الفقرات) قبل تجزئة الطول. - يُحدَّد سقف رفع الوسائط بواسطة
channels.slack.mediaMaxMb(الافتراضي 20).
تشعيب الردود
افتراضيًا، يرد OpenClaw في القناة الرئيسية. استخدمchannels.slack.replyToMode للتحكم في التشعيب التلقائي:
| الوضع | السلوك |
|---|---|
off | الافتراضي. الرد في القناة الرئيسية. لا يتم التشعيب إلا إذا كانت الرسالة المُحفِّزة أصلًا ضمن خيط. |
first | يذهب الرد الأول إلى الخيط (تحت الرسالة المُحفِّزة)، وتذهب الردود اللاحقة إلى القناة الرئيسية. مفيد للحفاظ على السياق مع تجنب ازدحام الخيوط. |
all | جميع الردود تذهب إلى الخيط. يُبقي المحادثات محتواة لكنه قد يقلل الظهور. |
slack sendMessage).
تشعيب حسب نوع الدردشة
يمكنك تهيئة سلوك تشعيب مختلف لكل نوع دردشة عبر تعيينchannels.slack.replyToModeByChatType:
direct: رسائل مباشرة 1:1 (Slackim)group: رسائل مباشرة جماعية / MPIMs (Slackmpim)channel: قنوات قياسية (عامة/خاصة)
replyToModeByChatType.<chatType>replyToMode- الافتراضي الخاص بالموفّر (
off)
channels.slack.dm.replyToMode القديم مقبولًا كبديل احتياطي لـ direct عند عدم تعيين تجاوز حسب نوع الدردشة.
أمثلة:
مناقشة DM:
علامات ثلاثية يدوية
للتحكم الدقيق، استخدم هذه الوسوم في ردود الوكيل:[[reply_to_current]]— الرد على الرسالة المُحفِّزة (بدء/متابعة خيط).[[reply_to:<id>]]— الرد على مُعرّف رسالة محدد.
الجلسات + التوجيه
- تشترك الرسائل المباشرة في جلسة
main(مثل WhatsApp/Telegram). - تُطابِق القنوات جلسات
agent:<agentId>:slack:channel:<channelId>. - تستخدم الأوامر المائلة جلسات
agent:<agentId>:slack:slash:<userId>(البادئة قابلة للتهيئة عبرchannels.slack.slashCommand.sessionPrefix). - إذا لم يوفّر Slack
channel_type، يستنتجه OpenClaw من بادئة مُعرّف القناة (D,C,G) ويُعيّن افتراضيًاchannelللحفاظ على ثبات مفاتيح الجلسات. - يستخدم تسجيل الأوامر الأصلية
commands.native(الافتراضي العام"auto"→ Slack مُعطّل) ويمكن تجاوزه لكل مساحة عمل عبرchannels.slack.commands.native. تتطلب الأوامر النصية رسائل/...مستقلة ويمكن تعطيلها باستخدامcommands.text: false. تُدار الأوامر المائلة في Slack داخل تطبيق Slack ولا تُزال تلقائيًا. استخدمcommands.useAccessGroups: falseلتجاوز فحوص مجموعات الوصول للأوامر. - قائمة الأوامر الكاملة + التهيئة: الأوامر المائلة
أمان DM (إقران)
- الافتراضي:
channels.slack.dm.policy="pairing"— يحصل مُرسلو الرسائل المباشرة غير المعروفين على رمز اقتران (تنتهي صلاحيته بعد ساعة). - الموافقة عبر:
openclaw pairing approve slack <code>. - للسماح للجميع: عيّن
channels.slack.dm.policy="open"وchannels.slack.dm.allowFrom=["*"]. - يقبل
channels.slack.dm.allowFromمُعرّفات المستخدمين، أو @handles، أو رسائل البريد الإلكتروني (تُحل عند بدء التشغيل عندما تسمح الرموز). يقبل معالج الإعداد أسماء المستخدمين ويحلّها إلى مُعرّفات أثناء الإعداد عندما تسمح الرموز.
سياسة المجموعات
- يتحكم
channels.slack.groupPolicyفي التعامل مع القنوات (open|disabled|allowlist). - يتطلب
allowlistإدراج القنوات فيchannels.slack.channels. - إذا عيّنت فقط
SLACK_BOT_TOKEN/SLACK_APP_TOKENولم تُنشئ قسمchannels.slack، فإن الإعدادات الافتراضية وقت التشغيل تُعيّنgroupPolicyإلىopen. أضفchannels.slack.groupPolicy، أوchannels.defaults.groupPolicy، أو قائمة سماح للقنوات لإحكام القفل. - يقبل معالج التهيئة أسماء
#channelويحلّها إلى مُعرّفات عند الإمكان (عامة + خاصة)؛ وإذا وُجدت تطابقات متعددة، يُفضّل القناة النشطة. - عند بدء التشغيل، يحل OpenClaw أسماء القنوات/المستخدمين في قوائم السماح إلى مُعرّفات (عندما تسمح الرموز) ويسجل الربط؛ وتُبقى الإدخالات غير المحلولة كما كُتبت.
- للسماح بعدم وجود أي قنوات، عيّن
channels.slack.groupPolicy: "disabled"(أو أبقِ قائمة السماح فارغة).
channels.slack.channels.<id> أو channels.slack.channels.<name>):
allow: السماح/المنع للقناة عندماgroupPolicy="allowlist".requireMention: ضبط الإشارة للقناة.tools: تجاوزات سياسة الأدوات لكل قناة (اختياري) (allow/deny/alsoAllow).toolsBySender: تجاوزات سياسة الأدوات لكل مُرسِل داخل القناة (المفاتيح هي مُعرّفات المُرسِلين/@handles/رسائل البريد الإلكتروني؛ يدعم الرمز الشامل"*").allowBots: السماح برسائل من تأليف البوت في هذه القناة (الافتراضي: false).users: قائمة سماح مستخدمين لكل قناة (اختياري).skills: مُرشّح المهارات (الإغفال = جميع المهارات، الفارغ = لا شيء).systemPrompt: موجّه نظام إضافي للقناة (يُدمج مع الموضوع/الغرض).enabled: عيّنfalseلتعطيل القناة.
أهداف التسليم
استخدم هذه مع الإرسال عبر cron/CLI:user:<id>للرسائل المباشرةchannel:<id>للقنوات
إجراءات الأدوات
يمكن تقييد إجراءات أدوات Slack باستخدامchannels.slack.actions.*:
| مجموعة الإجراءات | الافتراضي | ملاحظات |
|---|---|---|
| reactions | مفعّل | تفاعل + سرد التفاعلات |
| messages | مفعّل | قراءة/إرسال/تعديل/حذف |
| pins | مفعّل | تثبيت/إلغاء التثبيت/القائمة |
| memberInfo | مفعّل | معلومات الأعضاء |
| emojiList | مفعّل | قائمة الرموز المخصصة |
ملاحظات أمنية
- افتراضيًا، تستخدم الكتابات رمز البوت بحيث تبقى الإجراءات المُغيِّرة للحالة ضمن أذونات وهوية بوت التطبيق.
- يتيح تعيين
userTokenReadOnly: falseاستخدام رمز المستخدم لعمليات الكتابة عند عدم توفر رمز البوت، ما يعني أن الإجراءات تُنفّذ بصلاحيات المستخدم المُثبِّت. تعامل مع رمز المستخدم كرمز عالي الامتيازات وأبقِ بوابات الإجراءات وقوائم السماح مُحكمة. - إذا فعّلت كتابات رمز المستخدم، فتأكد من أن رمز المستخدم يتضمن نطاقات
الكتابة المتوقعة (
chat:write,reactions:write,pins:write,files:write) وإلا ستفشل تلك العمليات.
استكشاف الأخطاء وإصلاحها
شغّل هذا التسلسل أولًا:- متصل لكن لا توجد ردود في القنوات: القناة محظورة بواسطة
groupPolicyأو غير مدرجة في قائمة السماحchannels.slack.channels. - تجاهل الرسائل المباشرة: المُرسِل غير معتمد عندما
channels.slack.dm.policy="pairing". - أخطاء واجهة API (
missing_scope,not_in_channel، فشل المصادقة): رموز البوت/التطبيق أو نطاقات Slack غير مكتملة.
ملاحظات
- يتحكم ضبط الإشارة عبر
channels.slack.channels(عيّنrequireMentionإلىtrue)؛ كما تُحتسبagents.list[].groupChat.mentionPatterns(أوmessages.groupChat.mentionPatterns) كإشارات أيضًا. - تجاوز تعدد الوكلاء: عيّن أنماطًا لكل وكيل على
agents.list[].groupChat.mentionPatterns. - تتبع إشعارات التفاعلات
channels.slack.reactionNotifications(استخدمreactionAllowlistمع الوضعallowlist). - تُتجاهل الرسائل المؤلَّفة بواسطة البوت افتراضيًا؛ فعّل ذلك عبر
channels.slack.allowBotsأوchannels.slack.channels.<id>.allowBots. - تحذير: إذا سمحت بالرد على بوتات أخرى (
channels.slack.allowBots=trueأوchannels.slack.channels.<id>.allowBots=true)، فامنع حلقات ردود بوت-إلى-بوت باستخدام قوائم السماحrequireMentionوchannels.slack.channels.<id>.users، و/أو أزل الحواجز فيAGENTS.mdوSOUL.md. - لأداة Slack، دلالات إزالة التفاعلات موجودة في /tools/reactions.
- تُنزَّل المرفقات إلى مخزن الوسائط عند السماح وتحت حد الحجم.