BlueBubbles (REST على macOS)
الحالة: plugin مضمّن يتصل بخادم BlueBubbles على macOS عبر HTTP. موصى به لتكامل iMessage بسبب واجهة API الأغنى وسهولة الإعداد مقارنة بقناة imsg القديمة.plugin المضمّن
تتضمن إصدارات OpenClaw الحالية BlueBubbles، لذلك لا تحتاج الإصدارات المعبأة المعتادة إلى خطوةopenclaw plugins install منفصلة.
نظرة عامة
- يعمل على macOS عبر تطبيق BlueBubbles المساعد (bluebubbles.app).
- الموصى به/المختبر: macOS Sequoia (15). يعمل macOS Tahoe (26)، لكن التحرير معطل حاليًا على Tahoe، وقد تُبلغ تحديثات أيقونات المجموعات عن النجاح لكنها لا تتزامن.
- يتصل OpenClaw به عبر واجهة REST API الخاصة به (
GET /api/v1/pingوPOST /message/textوPOST /chat/:id/*). - تصل الرسائل الواردة عبر webhooks؛ أما الردود الصادرة ومؤشرات الكتابة وإيصالات القراءة وtapbacks فهي استدعاءات REST.
- يتم استيعاب المرفقات والملصقات كوسائط واردة (وتُعرَض للوكيل عندما يكون ذلك ممكنًا).
- يعمل الاقتران/قائمة السماح بالطريقة نفسها كما في القنوات الأخرى (
/channels/pairingوما إلى ذلك) باستخدامchannels.bluebubbles.allowFrom+ رموز الاقتران. - تُعرَض التفاعلات كأحداث نظام تمامًا مثل Slack/Telegram بحيث يمكن للوكلاء “الإشارة” إليها قبل الرد.
- الميزات المتقدمة: التحرير، وإلغاء الإرسال، وسلاسل الردود، وتأثيرات الرسائل، وإدارة المجموعات.
البدء السريع
- ثبّت خادم BlueBubbles على جهاز Mac لديك (اتبع التعليمات على bluebubbles.app/install).
- في إعدادات BlueBubbles، فعّل web API وحدد كلمة مرور.
-
شغّل
openclaw onboardوحدد BlueBubbles، أو قم بالتكوين يدويًا: -
وجّه webhooks الخاصة بـ BlueBubbles إلى gateway لديك (مثال:
https://your-gateway-host:3000/bluebubbles-webhook?password=<password>). - ابدأ تشغيل gateway؛ سيقوم بتسجيل معالج webhook وبدء الاقتران.
- احرص دائمًا على تعيين كلمة مرور لـ webhook.
- تكون مصادقة webhook مطلوبة دائمًا. يرفض OpenClaw طلبات BlueBubbles webhook ما لم تتضمن كلمة مرور/guid يطابق
channels.bluebubbles.password(مثل?password=<password>أوx-password) بغض النظر عن بنية loopback/proxy. - يتم التحقق من مصادقة كلمة المرور قبل قراءة/تحليل أجسام webhook الكاملة.
إبقاء Messages.app نشطًا (إعدادات VM / بدون واجهة)
قد تنتهي بعض إعدادات macOS VM / التشغيل الدائم إلى أن يصبح Messages.app “خاملًا” (تتوقف الأحداث الواردة حتى يتم فتح التطبيق/إحضاره إلى المقدمة). أحد الحلول البسيطة هو تحفيز Messages كل 5 دقائق باستخدام AppleScript + LaunchAgent.1) احفظ AppleScript
احفظ هذا باسم:~/Scripts/poke-messages.scpt
2) ثبّت LaunchAgent
احفظ هذا باسم:~/Library/LaunchAgents/com.user.poke-messages.plist
- يعمل هذا كل 300 ثانية وعند تسجيل الدخول.
- قد يؤدي التشغيل الأول إلى ظهور مطالبات macOS Automation (
osascript→ Messages). وافق عليها في جلسة المستخدم نفسها التي تشغّل LaunchAgent.
الإعداد التفاعلي
يتوفر BlueBubbles في الإعداد التفاعلي:- Server URL (مطلوب): عنوان خادم BlueBubbles (مثلًا،
http://192.168.1.100:1234) - Password (مطلوب): كلمة مرور API من إعدادات BlueBubbles Server
- Webhook path (اختياري): القيمة الافتراضية هي
/bluebubbles-webhook - DM policy: pairing أو allowlist أو open أو disabled
- Allow list: أرقام الهواتف أو عناوين البريد الإلكتروني أو أهداف الدردشة
التحكم في الوصول (الرسائل الخاصة + المجموعات)
الرسائل الخاصة:- الافتراضي:
channels.bluebubbles.dmPolicy = "pairing". - يتلقى المرسلون غير المعروفين رمز اقتران؛ ويتم تجاهل الرسائل حتى الموافقة عليها (تنتهي صلاحية الرموز بعد ساعة واحدة).
- وافق عبر:
openclaw pairing list bluebubblesopenclaw pairing approve bluebubbles <CODE>
- الاقتران هو تبادل الرموز الافتراضي. التفاصيل: الاقتران
channels.bluebubbles.groupPolicy = open | allowlist | disabled(الافتراضي:allowlist).- يتحكم
channels.bluebubbles.groupAllowFromفي من يمكنه التفعيل في المجموعات عندما يتم تعيينallowlist.
إثراء أسماء جهات الاتصال (macOS، اختياري)
غالبًا ما تتضمن webhooks الخاصة بمجموعات BlueBubbles عناوين المشاركين الخام فقط. إذا كنت تريد أن يُظهر سياقGroupMembers أسماء جهات الاتصال المحلية بدلًا من ذلك، فيمكنك الاشتراك في إثراء Contacts المحلي على macOS:
- يؤدي
channels.bluebubbles.enrichGroupParticipantsFromContacts = trueإلى تمكين البحث. الافتراضي:false. - لا تعمل عمليات البحث إلا بعد أن يسمح وصول المجموعة وتفويض الأوامر وضبط الإشارات بمرور الرسالة.
- يتم إثراء المشاركين الهاتفيين غير المسمّين فقط.
- تبقى أرقام الهواتف الخام هي البديل عند عدم العثور على تطابق محلي.
ضبط الإشارات (المجموعات)
يدعم BlueBubbles ضبط الإشارات للمحادثات الجماعية، بما يتطابق مع سلوك iMessage/WhatsApp:- يستخدم
agents.list[].groupChat.mentionPatterns(أوmessages.groupChat.mentionPatterns) لاكتشاف الإشارات. - عند تمكين
requireMentionلمجموعة، لا يرد الوكيل إلا عند الإشارة إليه. - تتجاوز أوامر التحكم من المرسلين المصرح لهم ضبط الإشارات.
ضبط الأوامر
- تتطلب أوامر التحكم (مثل
/configو/model) تفويضًا. - يستخدم
allowFromوgroupAllowFromلتحديد تفويض الأوامر. - يمكن للمرسلين المصرح لهم تشغيل أوامر التحكم حتى بدون إشارة في المجموعات.
ارتباطات محادثات ACP
يمكن تحويل محادثات BlueBubbles إلى مساحات عمل ACP دائمة من دون تغيير طبقة النقل. تدفق المشغل السريع:- شغّل
/acp spawn codex --bind hereداخل الرسالة الخاصة أو الدردشة الجماعية المسموح بها. - تُوجَّه الرسائل المستقبلية في محادثة BlueBubbles نفسها إلى جلسة ACP المنشأة.
- يعيد
/newو/resetتعيين جلسة ACP المرتبطة نفسها في مكانها. - يغلق
/acp closeجلسة ACP ويزيل الارتباط.
bindings[] على المستوى الأعلى مع type: "acp" وmatch.channel: "bluebubbles".
يمكن أن يستخدم match.peer.id أي صيغة هدف BlueBubbles مدعومة:
- مقبض DM مُطبَّع مثل
+15555550123أوuser@example.com chat_id:<id>chat_guid:<guid>chat_identifier:<identifier>
chat_id:* أو chat_identifier:* ويفضل ذلك.
مثال:
الكتابة + إيصالات القراءة
- مؤشرات الكتابة: يتم إرسالها تلقائيًا قبل وأثناء توليد الرد.
- إيصالات القراءة: يتحكم فيها
channels.bluebubbles.sendReadReceipts(الافتراضي:true). - مؤشرات الكتابة: يرسل OpenClaw أحداث بدء الكتابة؛ ويقوم BlueBubbles بمسح حالة الكتابة تلقائيًا عند الإرسال أو انتهاء المهلة (الإيقاف اليدوي عبر DELETE غير موثوق).
الإجراءات المتقدمة
يدعم BlueBubbles إجراءات الرسائل المتقدمة عند تمكينها في التكوين:- react: إضافة/إزالة تفاعلات tapback (
messageIdوemojiوremove) - edit: تحرير رسالة مرسلة (
messageIdوtext) - unsend: إلغاء إرسال رسالة (
messageId) - reply: الرد على رسالة محددة (
messageIdوtextوto) - sendWithEffect: الإرسال مع تأثير iMessage (
textوtoوeffectId) - renameGroup: إعادة تسمية دردشة جماعية (
chatGuidوdisplayName) - setGroupIcon: تعيين أيقونة/صورة دردشة جماعية (
chatGuidوmedia) — غير مستقر على macOS 26 Tahoe (قد تُرجع API نجاحًا لكن الأيقونة لا تتزامن). - addParticipant: إضافة شخص إلى مجموعة (
chatGuidوaddress) - removeParticipant: إزالة شخص من مجموعة (
chatGuidوaddress) - leaveGroup: مغادرة دردشة جماعية (
chatGuid) - upload-file: إرسال وسائط/ملفات (
toوbufferوfilenameوasVoice)- المذكرات الصوتية: اضبط
asVoice: trueمع صوت MP3 أو CAF للإرسال كرسالة صوتية في iMessage. يقوم BlueBubbles بتحويل MP3 → CAF عند إرسال المذكرات الصوتية.
- المذكرات الصوتية: اضبط
- الاسم المستعار القديم: ما زال
sendAttachmentيعمل، لكنupload-fileهو اسم الإجراء المعتمد.
معرفات الرسائل (القصيرة مقابل الكاملة)
قد يعرض OpenClaw معرفات رسائل قصيرة (مثل1 و2) لتوفير الرموز.
- يمكن أن تكون
MessageSid/ReplyToIdمعرفات قصيرة. - تحتوي
MessageSidFull/ReplyToIdFullعلى المعرفات الكاملة للمزوّد. - المعرفات القصيرة موجودة في الذاكرة؛ وقد تنتهي صلاحيتها عند إعادة التشغيل أو إخلاء ذاكرة التخزين المؤقت.
- تقبل الإجراءات
messageIdالقصير أو الكامل، لكن المعرفات القصيرة ستؤدي إلى خطأ إذا لم تعد متاحة.
- القوالب:
{{MessageSidFull}}و{{ReplyToIdFull}} - السياق:
MessageSidFull/ReplyToIdFullفي الحمولات الواردة
تدفق الكتل
تحكم فيما إذا كانت الردود تُرسل كرسالة واحدة أو تُبث على شكل كتل:الوسائط + الحدود
- يتم تنزيل المرفقات الواردة وتخزينها في ذاكرة التخزين المؤقت للوسائط.
- حد الوسائط عبر
channels.bluebubbles.mediaMaxMbللوسائط الواردة والصادرة (الافتراضي: 8 ميجابايت). - يتم تجزئة النص الصادر وفق
channels.bluebubbles.textChunkLimit(الافتراضي: 4000 حرف).
مرجع التكوين
التكوين الكامل: التكوين خيارات المزوّد:channels.bluebubbles.enabled: تمكين/تعطيل القناة.channels.bluebubbles.serverUrl: عنوان URL الأساسي لـ BlueBubbles REST API.channels.bluebubbles.password: كلمة مرور API.channels.bluebubbles.webhookPath: مسار نقطة نهاية webhook (الافتراضي:/bluebubbles-webhook).channels.bluebubbles.dmPolicy: pairing | allowlist | open | disabled(الافتراضي:pairing).channels.bluebubbles.allowFrom: قائمة السماح للرسائل الخاصة (المقابض، والبريد الإلكتروني، وأرقام E.164، وchat_id:*، وchat_guid:*).channels.bluebubbles.groupPolicy: open | allowlist | disabled(الافتراضي:allowlist).channels.bluebubbles.groupAllowFrom: قائمة السماح لمرسلي المجموعات.channels.bluebubbles.enrichGroupParticipantsFromContacts: على macOS، إثراء المشاركين غير المسمّين في المجموعة اختياريًا من Contacts المحلية بعد اجتياز الضبط. الافتراضي:false.channels.bluebubbles.groups: تكوين لكل مجموعة (requireMentionوما إلى ذلك).channels.bluebubbles.sendReadReceipts: إرسال إيصالات القراءة (الافتراضي:true).channels.bluebubbles.blockStreaming: تمكين تدفق الكتل (الافتراضي:false؛ مطلوب للردود المتدفقة).channels.bluebubbles.textChunkLimit: حجم التجزئة الصادرة بالأحرف (الافتراضي: 4000).channels.bluebubbles.chunkMode: يؤديlength(الافتراضي) إلى التقسيم فقط عند تجاوزtextChunkLimit؛ بينما يقسمnewlineعند الأسطر الفارغة (حدود الفقرات) قبل التجزئة حسب الطول.channels.bluebubbles.mediaMaxMb: حد الوسائط الواردة/الصادرة بالميجابايت (الافتراضي: 8).channels.bluebubbles.mediaLocalRoots: قائمة سماح صريحة بالأدلة المحلية المطلقة المسموح بها لمسارات الوسائط المحلية الصادرة. يتم رفض الإرسال عبر المسارات المحلية افتراضيًا ما لم يتم تكوين هذا الخيار. تجاوز لكل حساب:channels.bluebubbles.accounts.<accountId>.mediaLocalRoots.channels.bluebubbles.historyLimit: الحد الأقصى لرسائل المجموعة للسياق (يعطل عند 0).channels.bluebubbles.dmHistoryLimit: حد سجل الرسائل الخاصة.channels.bluebubbles.actions: تمكين/تعطيل إجراءات محددة.channels.bluebubbles.accounts: تكوين متعدد الحسابات.
agents.list[].groupChat.mentionPatterns(أوmessages.groupChat.mentionPatterns).messages.responsePrefix.
الاستهداف / أهداف التسليم
يفضل استخدامchat_guid للتوجيه المستقر:
chat_guid:iMessage;-;+15555550123(مفضل للمجموعات)chat_id:123chat_identifier:...- المقابض المباشرة:
+15555550123وuser@example.com- إذا لم يكن للمقبض المباشر دردشة DM موجودة، فسيقوم OpenClaw بإنشاء واحدة عبر
POST /api/v1/chat/new. وهذا يتطلب تمكين BlueBubbles Private API.
- إذا لم يكن للمقبض المباشر دردشة DM موجودة، فسيقوم OpenClaw بإنشاء واحدة عبر
الأمان
- تتم مصادقة طلبات webhook عبر مقارنة معاملات الاستعلام
guid/passwordأو الرؤوس معchannels.bluebubbles.password. - حافظ على سرية كلمة مرور API ونقطة نهاية webhook (تعامل معها على أنها بيانات اعتماد).
- لا يوجد تجاوز localhost لمصادقة BlueBubbles webhook. إذا كنت تمرر حركة webhook عبر proxy، فاحتفظ بكلمة مرور BlueBubbles داخل الطلب من الطرف إلى الطرف. لا يستبدل
gateway.trustedProxiesقيمةchannels.bluebubbles.passwordهنا. راجع أمان Gateway. - فعّل HTTPS + قواعد الجدار الناري على خادم BlueBubbles إذا كنت ستعرضه خارج شبكتك المحلية.
استكشاف الأخطاء وإصلاحها
- إذا توقفت أحداث الكتابة/القراءة عن العمل، فتحقق من سجلات BlueBubbles webhook وتأكد من أن مسار gateway يطابق
channels.bluebubbles.webhookPath. - تنتهي صلاحية رموز الاقتران بعد ساعة واحدة؛ استخدم
openclaw pairing list bluebubblesوopenclaw pairing approve bluebubbles <code>. - تتطلب التفاعلات BlueBubbles private API (
POST /api/v1/message/react)؛ تأكد من أن إصدار الخادم يوفّرها. - يتطلب التحرير/إلغاء الإرسال macOS 13+ وإصدار BlueBubbles Server متوافقًا. في macOS 26 (Tahoe)، يكون التحرير معطلًا حاليًا بسبب تغييرات في private API.
- قد تكون تحديثات أيقونات المجموعات غير مستقرة على macOS 26 (Tahoe): قد تُرجع API نجاحًا لكن الأيقونة الجديدة لا تتزامن.
- يُخفي OpenClaw تلقائيًا الإجراءات المعروفة بأنها معطلة بناءً على إصدار macOS الخاص بخادم BlueBubbles. إذا استمر ظهور التحرير على macOS 26 (Tahoe)، فعطّله يدويًا باستخدام
channels.bluebubbles.actions.edit=false. - لمعلومات الحالة/السلامة:
openclaw status --allأوopenclaw status --deep.
ذو صلة
- نظرة عامة على القنوات — جميع القنوات المدعومة
- الاقتران — مصادقة الرسائل الخاصة وتدفق الاقتران
- المجموعات — سلوك الدردشة الجماعية وضبط الإشارات
- توجيه القنوات — توجيه الجلسات للرسائل
- الأمان — نموذج الوصول والتقوية