أصبحDocumentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
imessage Plugin المضمّن يصل الآن إلى سطح API الخاص نفسه الذي تستخدمه BlueBubbles (react، edit، unsend، reply، sendWithEffect، إدارة المجموعات، المرفقات) عبر تشغيل steipete/imsg باستخدام JSON-RPC. إذا كنت تشغّل بالفعل جهاز Mac مثبّتًا عليه imsg، يمكنك الاستغناء عن خادم BlueBubbles وترك Plugin يتواصل مع Messages.app مباشرة.
أُزيل دعم BlueBubbles. يدعم OpenClaw iMessage عبر imsg فقط. هذا الدليل مخصص لترحيل إعدادات channels.bluebubbles القديمة إلى channels.imessage؛ ولا يوجد مسار ترحيل آخر مدعوم.
متى يكون هذا الترحيل مناسبًا
- أنت تشغّل بالفعل
imsgعلى جهاز Mac نفسه (أو جهاز يمكن الوصول إليه عبر SSH) حيث يكون Messages.app مسجّل الدخول. - تريد تقليل جزء متحرك واحد — لا خادم BlueBubbles منفصل، ولا نقطة نهاية REST للمصادقة، ولا توصيل Webhook. ملف CLI ثنائي واحد بدلًا من خادم + تطبيق عميل + مساعد.
- أنت تستخدم إصدار macOS /
imsgمدعومًا حيث يبلّغ فحص API الخاص عنavailable: true.
ما الذي يفعله imsg
imsg هو CLI محلي على macOS لتطبيق Messages. يبدأ OpenClaw تشغيل imsg rpc كعملية فرعية ويتواصل عبر JSON-RPC باستخدام stdin/stdout. لا يوجد خادم HTTP، ولا عنوان URL لـ Webhook، ولا عفريت خلفي، ولا وكيل تشغيل، ولا منفذ يجب كشفه.
- تأتي القراءات من
~/Library/Messages/chat.dbباستخدام مقبض SQLite للقراءة فقط. - تأتي الرسائل الواردة المباشرة من
imsg watch/watch.subscribe، والذي يتابع أحداث نظام ملفاتchat.dbمع بديل يعتمد على الاستقصاء. - تستخدم عمليات الإرسال أتمتة Messages.app لإرسال النصوص والملفات العادية.
- تستخدم الإجراءات المتقدمة
imsg launchلحقن مساعدimsgفي Messages.app. هذا هو ما يفتح إيصالات القراءة، ومؤشرات الكتابة، والإرسال الغني، والتعديل، والتراجع عن الإرسال، والرد ضمن سلسلة، وtapbacks، وإدارة المجموعات. - يمكن لإصدارات Linux فحص نسخة من
chat.db، لكنها لا تستطيع الإرسال، أو مراقبة قاعدة بيانات Mac المباشرة، أو تشغيل Messages.app. بالنسبة إلى OpenClaw iMessage، شغّلimsgعلى جهاز Mac المسجّل الدخول أو عبر غلاف SSH إلى ذلك الجهاز.
قبل أن تبدأ
-
ثبّت
imsgعلى جهاز Mac الذي يشغّل Messages.app:إذا فشلimsg chatsمعunable to open database file، أو مخرجات فارغة، أوauthorization denied، فامنح Full Disk Access للطرفية أو المحرر أو عملية Node أو خدمة Gateway أو عملية SSH الأصلية التي تشغّلimsg، ثم أعد فتح تلك العملية الأصلية. -
تحقّق من أسطح القراءة والمراقبة والإرسال وRPC قبل تغيير إعدادات OpenClaw:
استبدل
42بمعرّف محادثة حقيقي منimsg chats. يتطلب الإرسال إذن Automation لـ Messages.app. إذا كان OpenClaw سيعمل عبر SSH، فشغّل هذه الأوامر من خلال غلاف SSH نفسه أو سياق المستخدم نفسه الذي سيستخدمه OpenClaw. -
فعّل جسر API الخاص عندما تحتاج إلى إجراءات متقدمة:
يتطلب
imsg launchتعطيل SIP. يعمل الإرسال الأساسي، والسجل، والمراقبة بدونimsg launch؛ أما الإجراءات المتقدمة فلا تعمل. -
تحقّق من الجسر عبر OpenClaw:
تريد
imessage.privateApi.available: true. إذا أبلغ عنfalse، فأصلح ذلك أولًا — راجع اكتشاف القدرات. -
خذ لقطة من إعداداتك:
ترجمة الإعدادات
يشترك iMessage وBlueBubbles في قدر كبير من إعدادات مستوى القناة. المفاتيح التي تتغير هي غالبًا مفاتيح النقل (خادم REST مقابل CLI محلي). تحتفظ مفاتيح السلوك (dmPolicy، groupPolicy، allowFrom، إلخ) بالمعنى نفسه.
| BlueBubbles | iMessage المضمّن | ملاحظات |
|---|---|---|
channels.bluebubbles.enabled | channels.imessage.enabled | نفس الدلالات. |
channels.bluebubbles.serverUrl | (أُزيل) | لا يوجد خادم REST — يشغّل Plugin imsg rpc عبر stdio. |
channels.bluebubbles.password | (أُزيل) | لا حاجة إلى مصادقة Webhook. |
| (ضمني) | channels.imessage.cliPath | المسار إلى imsg (الافتراضي imsg)؛ استخدم سكربت تغليف لـ SSH. |
| (ضمني) | channels.imessage.dbPath | تجاوز اختياري لـ Messages.app chat.db؛ يُكتشف تلقائيًا عند حذفه. |
| (ضمني) | channels.imessage.remoteHost | host أو user@host — لا يلزم إلا عندما يكون cliPath سكربت تغليف لـ SSH وتريد جلب مرفقات SCP. |
channels.bluebubbles.dmPolicy | channels.imessage.dmPolicy | نفس القيم (pairing / allowlist / open / disabled). |
channels.bluebubbles.allowFrom | channels.imessage.allowFrom | تنتقل موافقات الإقران حسب المعرّف، لا حسب الرمز. |
channels.bluebubbles.groupPolicy | channels.imessage.groupPolicy | نفس القيم (allowlist / open / disabled). |
channels.bluebubbles.groupAllowFrom | channels.imessage.groupAllowFrom | نفسها. |
channels.bluebubbles.groups | channels.imessage.groups | انسخ هذا حرفيًا، بما في ذلك أي إدخال بدل groups: { "*": { ... } }. تنتقل إعدادات requireMention وtools وtoolsBySender لكل مجموعة. مع groupPolicy: "allowlist"، تؤدي كتلة groups الفارغة أو المفقودة إلى إسقاط كل رسالة مجموعة بصمت — انظر “فخ سجل المجموعات” أدناه. |
channels.bluebubbles.sendReadReceipts | channels.imessage.sendReadReceipts | الافتراضي true. مع Plugin المضمّن، لا ينطلق هذا إلا عندما يكون مسبار واجهة API الخاصة قيد التشغيل. |
channels.bluebubbles.includeAttachments | channels.imessage.includeAttachments | نفس الشكل، ونفس التعطيل افتراضيًا. إذا كانت المرفقات تتدفق لديك على BlueBubbles، فيجب أن تعيد ضبط هذا صراحةً في كتلة iMessage — فهو لا ينتقل ضمنيًا، وستُسقط الصور/الوسائط الواردة بصمت من دون سطر سجل Inbound message إلى أن تفعل ذلك. |
channels.bluebubbles.attachmentRoots | channels.imessage.attachmentRoots | الجذور المحلية؛ نفس قواعد البدل. |
| (غير متاح) | channels.imessage.remoteAttachmentRoots | لا يُستخدم إلا عند ضبط remoteHost لجلب SCP. |
channels.bluebubbles.mediaMaxMb | channels.imessage.mediaMaxMb | الافتراضي 16 ميغابايت في iMessage (كان افتراضي BlueBubbles هو 8 ميغابايت). اضبطه صراحةً إذا أردت الإبقاء على الحد الأدنى. |
channels.bluebubbles.textChunkLimit | channels.imessage.textChunkLimit | الافتراضي 4000 في كليهما. |
channels.bluebubbles.coalesceSameSenderDms | channels.imessage.coalesceSameSenderDms | نفس الاشتراك الصريح. للرسائل المباشرة فقط — تحتفظ محادثات المجموعات بالإرسال الفوري لكل رسالة على القناتين. يوسّع تأخير إزالة الارتداد الافتراضي للوارد إلى 2500 مللي ثانية عند تفعيله من دون messages.inbound.byChannel.imessage صريح. انظر مستندات iMessage § دمج الرسائل المباشرة المرسلة على أجزاء. |
channels.bluebubbles.enrichGroupParticipantsFromContacts | (غير متاح) | يقرأ iMessage أسماء عرض المرسلين بالفعل من chat.db. |
channels.bluebubbles.actions.* | channels.imessage.actions.* | مفاتيح تبديل لكل إجراء: reactions وedit وunsend وreply وsendWithEffect وrenameGroup وsetGroupIcon وaddParticipant وremoveParticipant وleaveGroup وsendAttachment. |
channels.bluebubbles.accounts.*) واحدًا لواحد إلى channels.imessage.accounts.*.
فخ سجل المجموعات
يشغّل Plugin iMessage المضمّن بوابتي قائمة سماح منفصلتين للمجموعات بالتتابع. يجب أن تنجح كلتاهما حتى تصل رسالة المجموعة إلى الوكيل:- قائمة سماح المرسل / هدف المحادثة (
channels.imessage.groupAllowFrom) — يفحصهاisAllowedIMessageSender. تطابق الرسائل الواردة حسب معرّف المرسل أوchat_guidأوchat_identifierأوchat_id. نفس شكل BlueBubbles. - سجل المجموعات (
channels.imessage.groups) — يفحصهresolveChannelGroupPolicyمنinbound-processing.ts:199. معgroupPolicy: "allowlist"، تتطلب هذه البوابة أحد الأمرين:- إدخال بدل
groups: { "*": { ... } }(يضبطallowAll = true)، أو - إدخالًا صريحًا لكل
chat_idضمنgroups.
- إدخال بدل
warn حتى لا يبقى هذا صامتًا عند مستوى السجل الافتراضي:
- تحذير
warnلمرة واحدة عند بدء التشغيل لكل حساب عندما يُضبطgroupPolicy: "allowlist"لكنchannels.imessage.groupsيكون فارغًا (لا بدل"*"، ولا إدخالات لكلchat_id) — ينطلق قبل وصول أي رسائل. - تحذير
warnلمرة واحدة لكلchat_idعند إسقاط مجموعة محددة لأول مرة في وقت التشغيل، مع تسمية chat_id والمفتاح الدقيق الذي يجب إضافته إلىgroupsللسماح بها.
groupAllowFrom وgroupPolicy لكن يتخطون كتلة groups، لأن groups: { "*": { "requireMention": true } } في BlueBubbles يبدو كإعداد إشارة غير ذي صلة. لكنه في الحقيقة ضروري لبوابة السجل.
الحد الأدنى من الإعداد للحفاظ على تدفق رسائل المجموعات بعد groupPolicy: "allowlist":
requireMention: true ضمن * غير ضار عندما لا تكون أنماط الإشارة مهيأة: يضبط وقت التشغيل canDetectMention = false ويتجاوز إسقاط الإشارة عند inbound-processing.ts:512. عند تهيئة أنماط الإشارة (agents.list[].groupChat.mentionPatterns)، يعمل كما هو متوقع.
إذا سجّل Gateway الرسالة imessage: dropping group message from chat_id=<id> أو سطر بدء التشغيل imessage: groupPolicy="allowlist" but channels.imessage.groups is empty، فهذا يعني أن البوابة 2 تسقط الرسائل — أضف كتلة groups.
خطوة بخطوة
-
أضف كتلة iMessage بجانب كتلة BlueBubbles الحالية. أبقِ الكتلة القديمة كمصدر نسخ فقط حتى يتم التحقق من المسار الجديد:
-
فحص تجريبي — شغّل Gateway وتأكد من أن iMessage يبلغ عن حالة سليمة:
بما أن
imessage.enabledلا يزالfalse، فلن يتم توجيه أي حركة iMessage واردة بعد — لكن--probeيختبر الجسر حتى تكتشف مشكلات الأذونات/التثبيت قبل التحويل. -
حوّل المسار. أزل تهيئة BlueBubbles وفعّل iMessage في تعديل تهيئة واحد:
أعد تشغيل Gateway. ستتدفق حركة iMessage الواردة الآن عبر الـ Plugin المضمّن.
- تحقق من الرسائل المباشرة. أرسل رسالة مباشرة إلى الوكيل؛ تأكد من وصول الرد.
-
تحقق من المجموعات بشكل منفصل. الرسائل المباشرة والمجموعات تسلك مسارات كود مختلفة — نجاح الرسائل المباشرة لا يثبت أن المجموعات تُوجَّه. أرسل رسالة إلى الوكيل في دردشة جماعية مقترنة وتأكد من وصول الرد. إذا أصبحت المجموعة صامتة (لا رد من الوكيل، ولا خطأ)، فتحقق من سجل Gateway بحثًا عن
imessage: dropping group message from chat_id=<id>أو سطر بدء التشغيلimessage: groupPolicy="allowlist" but channels.imessage.groups is empty— كلاهما يظهر عند مستوى السجل الافتراضي. إذا ظهر أي منهما، فإن كتلةgroupsمفقودة أو فارغة — راجع “مشكلة سجل المجموعات الخفية” أعلاه. -
تحقق من سطح الإجراءات — من رسالة مباشرة مقترنة، اطلب من الوكيل أن يتفاعل، ويعدل، ويلغي الإرسال، ويرد، ويرسل صورة، و(في مجموعة) يعيد تسمية المجموعة / يضيف مشاركًا أو يزيله. يجب أن يصل كل إجراء محليًا في Messages.app. إذا ألقى أي إجراء “iMessage
<action>requires the imsg private API bridge”، فشغّلimsg launchمرة أخرى وحدّثchannels status --probe. -
أزل خادم BlueBubbles وتهيئته بعد التحقق من رسائل iMessage المباشرة والمجموعات والإجراءات. لن يستخدم OpenClaw
channels.bluebubbles.
تكافؤ الإجراءات بنظرة سريعة
| الإجراء | BlueBubbles القديم | iMessage المضمّن |
|---|---|---|
| إرسال نص / رجوع إلى SMS | ✅ | ✅ |
| إرسال وسائط (صورة، فيديو، ملف، صوت) | ✅ | ✅ |
رد ضمن سلسلة (reply_to_guid) | ✅ | ✅ (يغلق #51892) |
Tapback (react) | ✅ | ✅ |
| تعديل / إلغاء إرسال (مستلمو macOS 13+) | ✅ | ✅ |
| إرسال مع تأثير شاشة | ✅ | ✅ (يغلق جزءًا من #9394) |
| نص منسق عريض / مائل / مسطر / يتوسطه خط | ✅ | ✅ (تنسيق typed-run عبر attributedBody) |
| إعادة تسمية مجموعة / تعيين أيقونة مجموعة | ✅ | ✅ |
| إضافة / إزالة مشارك، مغادرة مجموعة | ✅ | ✅ |
| إيصالات القراءة ومؤشر الكتابة | ✅ | ✅ (محكوم بفحص API الخاص) |
| دمج الرسائل المباشرة من المرسل نفسه | ✅ | ✅ (للرسائل المباشرة فقط؛ تفعيل اختياري عبر channels.imessage.coalesceSameSenderDms) |
| استدراك الرسائل الواردة المستلمة أثناء تعطل Gateway | ✅ (إعادة تشغيل Webhook + جلب السجل) | ✅ (تفعيل اختياري عبر channels.imessage.catchup.enabled؛ يغلق #78649) |
channels.imessage.catchup.enabled يساوي true، يشغّل Gateway مرورًا واحدًا من chats.list + messages.history لكل دردشة مقابل عميل JSON-RPC نفسه المستخدم بواسطة imsg watch، ويعيد تشغيل كل صف وارد فائت عبر مسار الإرسال الحي (قوائم السماح، سياسة المجموعات، مزيل الارتداد، ذاكرة صدى الرسائل)، ويحفظ مؤشرًا لكل حساب حتى تتابع عمليات بدء التشغيل اللاحقة من حيث توقفت. راجع الاستدراك بعد توقف Gateway للضبط.
الاقتران، والجلسات، وارتباطات ACP
- موافقات الاقتران تنتقل حسب المعرّف. لا تحتاج إلى إعادة الموافقة على المرسلين المعروفين — يتعرف
channels.imessage.allowFromعلى سلاسل+15555550123/user@example.comنفسها التي استخدمها BlueBubbles. - الجلسات تبقى محددة النطاق لكل وكيل + دردشة. تُدمج الرسائل المباشرة في الجلسة الرئيسية للوكيل تحت
session.dmScope=mainالافتراضي؛ وتبقى جلسات المجموعات معزولة لكلchat_id. تختلف مفاتيح الجلسات (agent:<id>:imessage:group:<chat_id>مقابل مكافئ BlueBubbles) — لا ينتقل سجل المحادثات القديم تحت مفاتيح جلسات BlueBubbles إلى جلسات iMessage. - ارتباطات ACP التي تشير إلى
match.channel: "bluebubbles"يجب تحديثها إلى"imessage". أشكالmatch.peer.id(chat_id:، وchat_guid:، وchat_identifier:، والمعرّف المجرّد) متطابقة.
لا توجد قناة للرجوع
لا يوجد وقت تشغيل BlueBubbles مدعوم يمكن الرجوع إليه. إذا فشل التحقق من iMessage، فاضبطchannels.imessage.enabled: false، وأعد تشغيل Gateway، وأصلح عائق imsg، ثم أعد محاولة التحويل.
توجد ذاكرة الرد المؤقتة في ~/.openclaw/state/imessage/reply-cache.jsonl (الوضع 0600، والدليل الأصل 0700). من الآمن حذفها إذا أردت بداية نظيفة.
ذات صلة
- iMessage — مرجع قناة iMessage الكامل، بما في ذلك إعداد
imsg launchواكتشاف القدرات. /channels/bluebubbles— عنوان URL قديم يعيد التوجيه إلى دليل الترحيل هذا.- الاقتران — مصادقة الرسائل المباشرة وتدفق الاقتران.
- توجيه القنوات — كيف يختار Gateway قناة للردود الصادرة.