Skip to main content
في نشر iMessage المعتاد لـ OpenClaw، شغّل Gateway وimsg على مضيف macOS نفسه المسجّل الدخول إلى Messages. إذا كان Gateway يعمل في مكان آخر، فوجّه channels.imessage.cliPath إلى مغلّف SSH شفاف يشغّل imsg على جهاز Mac.الاسترداد الوارد تلقائي. بعد إعادة تشغيل الجسر أو Gateway، يعيد iMessage تشغيل الرسائل التي فاتت أثناء توقفه ويمنع «دفعة التراكم القديمة» التي قد يرسلها Apple بعد استرداد Push، مع إزالة التكرار كي لا يُرسَل أي شيء مرتين. لا يوجد إعداد لتمكين ذلك — راجع الاسترداد الوارد بعد إعادة تشغيل الجسر أو Gateway.
أُزيل دعم BlueBubbles. رحّل إعدادات channels.bluebubbles إلى channels.imessage؛ لا يدعم OpenClaw بروتوكول iMessage إلا عبر imsg. ابدأ بـإزالة BlueBubbles ومسار imsg لـ iMessage للاطلاع على الإعلان المختصر، أو الانتقال من BlueBubbles للاطلاع على جدول الترحيل الكامل.
الحالة: تكامل CLI خارجي أصلي. يشغّل Gateway العملية imsg rpc ويتواصل عبر JSON-RPC من خلال الإدخال والإخراج القياسيين — دون خدمة خفية أو منفذ منفصل. يُوصى بشدة بوضع API الخاص لتوفير قناة iMessage متكاملة؛ إذ تتطلب الردود وردود الفعل والتأثيرات والاستطلاعات والردود على المرفقات وإجراءات المجموعات imsg launch واجتياز فحص API الخاص بنجاح. في الإعداد المحلي الشائع، يمكن لإعداد OpenClaw عرض تثبيت imsg أو تحديثه عبر Homebrew على جهاز Mac المسجّل الدخول إلى Messages بعد تأكيد المستخدم. تظل الإعدادات اليدوية والبنى التي تستخدم مغلّف SSH تحت إدارة المشغّل: ثبّت imsg أو حدّثه ضمن سياق المستخدم نفسه الذي سيشغّل Gateway أو المغلّف.

إجراءات API الخاص

الردود وردود الفعل والتأثيرات والاستطلاعات والمرفقات وإدارة المجموعات.

الاقتران

تستخدم رسائل iMessage المباشرة وضع الاقتران افتراضيًا.

جهاز Mac بعيد

استخدم مغلّف SSH عندما لا يعمل Gateway على جهاز Mac الخاص بـ Messages.

مرجع الإعدادات

المرجع الكامل لحقول iMessage.

الإعداد السريع

1

تثبيت imsg والتحقق منه

عندما يكتشف معالج الإعداد المحلي غياب أمر imsg الافتراضي، يمكنه طلب تثبيت steipete/tap/imsg عبر Homebrew. وإذا اكتشف imsg مُدارًا بواسطة Homebrew، فيمكنه طلب إعادة تثبيته أو تحديثه. لا تُعدَّل مغلّفات cliPath المخصصة.
2

إعداد OpenClaw

3

تشغيل Gateway

4

الموافقة على اقتران أول رسالة مباشرة (dmPolicy الافتراضية)

تنتهي صلاحية طلبات الاقتران بعد 1 hour.

المتطلبات والأذونات (macOS)

  • يجب تسجيل الدخول إلى Messages على جهاز Mac الذي يشغّل imsg.
  • يلزم منح الوصول الكامل إلى القرص لسياق العملية الذي يشغّل OpenClaw‏/imsg (للوصول إلى قاعدة بيانات Messages).
  • يلزم إذن الأتمتة لإرسال الرسائل عبر Messages.app.
  • بالنسبة إلى الإجراءات المتقدمة (التفاعل / التعديل / إلغاء الإرسال / الرد المتسلسل / التأثيرات / الاستطلاعات / عمليات المجموعات)، يجب تعطيل حماية تكامل النظام — راجع تمكين API الخاص لـ imsg. يعمل الإرسال والاستقبال الأساسيان للنصوص والوسائط من دون تعطيلها.
تُمنح الأذونات لكل سياق عملية على حدة. إذا كان Gateway يعمل دون واجهة مستخدم (LaunchAgent/SSH)، فنفّذ أمرًا تفاعليًا لمرة واحدة ضمن السياق نفسه لإظهار مطالبات الأذونات:
يمكن لإعداد SSH بعيد قراءة المحادثات واجتياز channels status --probe ومعالجة الرسائل الواردة، بينما يستمر فشل الإرسال الصادر بسبب خطأ في تفويض AppleEvents:
تحقق من قاعدة بيانات TCC لمستخدم جهاز Mac المسجّل دخوله أو من System Settings > Privacy & Security > Automation. إذا كان إدخال Automation مسجّلًا للعملية /usr/libexec/sshd-keygen-wrapper بدلًا من العملية imsg أو عملية الصدفة المحلية، فقد لا يعرض macOS مفتاح تبديل صالحًا لـ Messages لعميل SSH الموجود على جانب الخادم:
في هذه الحالة، قد يستمر فشل تكرار tccutil reset AppleEvents أو إعادة تشغيل imsg send عبر مغلّف SSH نفسه، لأن سياق العملية الذي يحتاج إلى أتمتة Messages هو مغلّف SSH، وليس تطبيقًا تستطيع واجهة المستخدم منحه الإذن.استخدم بدلًا من ذلك أحد سياقات عمليات imsg المدعومة:
  • شغّل Gateway، أو جسر imsg على الأقل، ضمن الجلسة المحلية لمستخدم Messages المسجّل دخوله.
  • ابدأ تشغيل Gateway باستخدام LaunchAgent لذلك المستخدم بعد منح الوصول الكامل إلى القرص وإذن الأتمتة من الجلسة نفسها.
  • إذا أبقيت على بنية SSH ذات المستخدمين، فتحقق من نجاح إرسال صادر فعلي عبر imsg send من خلال المغلّف نفسه قبل تمكين القناة. إذا تعذر منحه إذن الأتمتة، فأعد الإعداد إلى بنية imsg ذات مستخدم واحد بدلًا من الاعتماد على مغلّف SSH للإرسال.

تمكين API الخاص لـ imsg

يأتي imsg بوضعين تشغيليين. بالنسبة إلى OpenClaw، يُعد وضع API الخاص الإعداد الموصى به لأنه يمنح القناة إجراءات iMessage الأصلية التي يتوقعها المستخدمون. ويظل الوضع الأساسي مفيدًا للتثبيتات منخفضة المخاطر أو التحقق الأولي أو المضيفات التي لا يمكن تعطيل SIP عليها.
  • الوضع الأساسي (الافتراضي، لا يلزم إجراء تغييرات على SIP): إرسال النصوص والوسائط عبر send، ومراقبة الرسائل الواردة وسجلها، وقائمة المحادثات. هذا ما تحصل عليه مباشرة من تثبيت brew install steipete/tap/imsg جديد مع أذونات macOS القياسية المذكورة أعلاه.
  • وضع API الخاص: يحقن imsg مكتبة dylib مساعدة في Messages.app لاستدعاء وظائف IMCore الداخلية. يتيح ذلك react وedit وunsend وreply (المتسلسل) وsendWithEffect وpoll وpoll-vote (استطلاعات Messages الأصلية) وrenameGroup وsetGroupIcon وaddParticipant وremoveParticipant وleaveGroup، بالإضافة إلى مؤشرات الكتابة وإيصالات القراءة.
يتطلب نطاق الإجراءات الموصى به في هذه الصفحة وضع API الخاص. ويوضح README الخاص بـimsg هذا المتطلب صراحةً:
الميزات المتقدمة مثل read وtyping وlaunch، والإرسال الغني المدعوم بالجسر، وتعديل الرسائل، وإدارة المحادثات اختيارية. وتتطلب تعطيل SIP وحقن مكتبة dylib مساعدة في Messages.app. يرفض imsg launch إجراء الحقن عندما تكون SIP مفعّلة.
تستخدم تقنية حقن المكتبة المساعدة مكتبة dylib الخاصة بـimsg للوصول إلى واجهات API الخاصة بـ Messages. لا يوجد خادم تابع لجهة خارجية أو بيئة تشغيل BlueBubbles ضمن مسار iMessage في OpenClaw.
ينطوي تعطيل SIP على مقايضة أمنية حقيقية. تُعد SIP إحدى وسائل الحماية الأساسية في macOS ضد تشغيل شيفرة نظام معدّلة؛ ويؤدي تعطيلها على مستوى النظام إلى فتح سطح هجوم إضافي وآثار جانبية. ومن الجدير بالذكر أن تعطيل SIP على أجهزة Mac المزودة بـ Apple Silicon يعطّل أيضًا إمكانية تثبيت تطبيقات iOS وتشغيلها على جهاز Mac.تعامل مع ذلك بوصفه خيارًا تشغيليًا متعمدًا، ولا سيما على جهاز Mac شخصي أساسي. للحصول على iMessage بجودة إنتاجية في OpenClaw، يُفضّل استخدام جهاز Mac مخصص أو مستخدم macOS مخصص للروبوت حيث يكون تمكين الجسر مقبولًا. إذا كان نموذج التهديد لديك لا يسمح بتعطيل SIP في أي مكان، فسيقتصر iMessage المضمّن على الوضع الأساسي — إرسال النصوص والوسائط واستقبالها فقط، دون ردود فعل / تعديل / إلغاء إرسال / تأثيرات / عمليات مجموعات.

الإعداد

  1. ثبّت (أو رقِّ) imsg على جهاز Mac الذي يشغّل Messages.app:
    تعرض مخرجات imsg status --json القيم bridge_version وrpc_methods وselectors لكل طريقة، حتى تتمكن من معرفة ما يدعمه الإصدار الحالي قبل البدء.
  2. عطّل حماية تكامل النظام، و(في إصدارات macOS الحديثة) التحقق من صحة المكتبات. يتطلب حقن مكتبة dylib مساعدة غير تابعة لـ Apple في Messages.app الموقّع من Apple تعطيل SIP وكذلك تخفيف قيود التحقق من صحة المكتبات. تعتمد خطوة SIP في وضع الاسترداد على إصدار macOS:
    • macOS 10.13-10.15 (Sierra-Catalina): عطّل التحقق من صحة المكتبات عبر Terminal، وأعد التشغيل في وضع الاسترداد، وشغّل csrutil disable، ثم أعد التشغيل.
    • macOS 11+ (Big Sur والإصدارات الأحدث)، Intel: ادخل وضع الاسترداد (أو الاسترداد عبر الإنترنت)، وشغّل csrutil disable، ثم أعد التشغيل.
    • macOS 11+، Apple Silicon: استخدم تسلسل بدء التشغيل بزر الطاقة للدخول إلى وضع الاسترداد؛ وفي إصدارات macOS الحديثة، اضغط باستمرار على مفتاح Left Shift عند النقر على Continue، ثم شغّل csrutil disable. تتبع إعدادات الأجهزة الافتراضية مسارًا منفصلًا، لذا التقط لقطة للجهاز الافتراضي أولًا.
    في macOS 11 والإصدارات الأحدث، لا يكفي csrutil disable وحده عادةً. تواصل Apple فرض التحقق من صحة المكتبات على Messages.app بصفته ملفًا ثنائيًا للنظام الأساسي، ولذلك تُرفض الأداة المساعدة الموقّعة بتوقيع مخصص (Library Validation failed: ... platform binary, but mapped file is not) حتى مع تعطيل SIP. بعد تعطيل SIP، عطّل أيضًا التحقق من صحة المكتبات وأعد التشغيل:
    macOS 26 (Tahoe)، تم التحقق منه على 26.5.1: يكفي تعطيل SIP بالإضافة إلى أمر DisableLibraryValidation أعلاه لحقن الأداة المساعدة في الإصدارات من 26.0 إلى 26.5.x. لا يلزم استخدام أي boot-args. ملف plist هو العامل الحاسم والخطوة المفقودة الأكثر شيوعًا عند فشل الحقن على Tahoe:
    • مع ملف plist: يحقن imsg launch وتُبلغ imsg status عن advanced_features: true.
    • من دون ملف plist (حتى مع تعطيل SIP): يفشل imsg launch مع Failed to launch: Timeout waiting for Messages.app to initialize. يرفض AMFI الأداة المساعدة الموقّعة بتوقيع مخصص عند التحميل، فلا يصبح الجسر جاهزًا أبدًا وتنتهي مهلة التشغيل. انتهاء المهلة هذا هو العَرَض الذي يواجهه معظم الأشخاص على Tahoe؛ والحل هو ملف plist أعلاه، وليس إجراءً أكثر تشددًا.
    إذا بدأ حقن imsg launch أو إجراءات selectors معينة بإرجاع false بعد ترقية macOS، فعادةً ما تكون هذه البوابة هي السبب. تحقّق من حالة SIP والتحقق من صحة المكتبات قبل افتراض فشل خطوة SIP نفسها. إذا كانت هذه الإعدادات صحيحة وما زال الجسر غير قادر على الحقن، فاجمع imsg status --json مع مخرجات imsg launch وأبلغ عنها إلى مشروع imsg بدلًا من إضعاف ضوابط أمان إضافية على مستوى النظام بأكمله.
  3. احقن الأداة المساعدة. مع تعطيل SIP وتسجيل الدخول إلى Messages.app:
    يرفض imsg launch إجراء الحقن عندما يظل SIP مفعّلًا، لذا يُعد ذلك أيضًا تأكيدًا على تنفيذ الخطوة 2.
  4. تحقّق من الجسر من OpenClaw:
    ينبغي أن يُبلغ إدخال iMessage عن works، وينبغي أن يعرض imsg status --json | jq '{rpc_methods, selectors}' الإمكانات التي يوفّرها إصدار macOS لديك. يتطلب إنشاء استطلاعات الرأي selectors.pollPayloadMessage؛ ويتطلب التصويت كلًا من selectors.pollVoteMessage وطريقة RPC المسماة poll.vote. لا يعلن Plugin الخاص بـ OpenClaw إلا عن الإجراءات التي يدعمها الفحص المخزّن مؤقتًا، بينما تظل ذاكرة التخزين المؤقت الفارغة متفائلة وتجري الفحص عند أول إرسال.
إذا أبلغ openclaw channels status --probe عن القناة باعتبارها works لكن إجراءات معينة طرحت الخطأ “iMessage <action> requires the imsg private API bridge” وقت الإرسال، فشغّل imsg launch مجددًا — قد تنفصل الأداة المساعدة (بسبب إعادة تشغيل Messages.app أو تحديث نظام التشغيل، وما إلى ذلك)، وستواصل حالة available: true المخزّنة مؤقتًا الإعلان عن الإجراءات حتى يحدّثها الفحص التالي.

عند إبقاء SIP مفعّلًا

إذا كان تعطيل SIP غير مقبول وفق نموذج التهديد لديك:
  • يرجع imsg إلى الوضع الأساسي — النصوص والوسائط والاستقبال فقط.
  • يواصل Plugin الخاص بـ OpenClaw الإعلان عن إرسال النصوص/الوسائط ومراقبة الرسائل الواردة؛ ويخفي react وedit وunsend وreply وsendWithEffect وعمليات المجموعات من سطح الإجراءات (وفق بوابة الإمكانات الخاصة بكل طريقة).
  • يمكن تشغيل جهاز Mac منفصل لا يعتمد Apple Silicon (أو جهاز Mac مخصص للبوت) مع تعطيل SIP لأحمال عمل iMessage، مع إبقاء SIP مفعّلًا على أجهزتك الأساسية. راجع مستخدم macOS مخصص للبوت (هوية iMessage منفصلة) أدناه.

التحكم في الوصول والتوجيه

يتحكم channels.imessage.dmPolicy في الرسائل المباشرة:
  • pairing (الافتراضي)
  • allowlist (يتطلب إدخالًا واحدًا على الأقل في allowFrom)
  • open (يتطلب أن يتضمن allowFrom القيمة "*")
  • disabled
حقل قائمة السماح: channels.imessage.allowFrom.يجب أن تحدد إدخالات قائمة السماح المرسلين: المعرّفات أو مجموعات الوصول الثابتة للمرسلين (accessGroup:<name>). استخدم channels.imessage.groupAllowFrom لأهداف المحادثات مثل chat_id:* أو chat_guid:* أو chat_identifier:*؛ واستخدم channels.imessage.groups لمفاتيح سجل chat_id الرقمية.

ارتباطات محادثات ACP

يمكن ربط محادثات iMessage بجلسات ACP. تدفق سريع للمشغّل:
  • شغّل /acp spawn codex --bind here داخل الرسالة المباشرة أو محادثة المجموعة المسموح بها.
  • تُوجّه الرسائل المستقبلية في محادثة iMessage نفسها إلى جلسة ACP المنشأة.
  • تعيد /new و/reset ضبط جلسة ACP المرتبطة نفسها في موضعها.
  • تغلق /acp close جلسة ACP وتزيل الارتباط.
تستخدم الارتباطات الدائمة المضبوطة إدخالات bindings[] ذات المستوى الأعلى مع type: "acp" وmatch.channel: "imessage". يمكن أن تستخدم match.peer.id:
  • معرّف رسالة مباشرة مطبّعًا مثل +15555550123 أو user@example.com
  • chat_id:<id> (موصى به لارتباطات المجموعات المستقرة)
  • chat_guid:<guid>
  • chat_identifier:<identifier>
مثال:
راجع وكلاء ACP لمعرفة سلوك ارتباط ACP المشترك.

أنماط النشر

استخدم Apple ID ومستخدم macOS مخصصين لعزل حركة مرور البوت عن ملفك الشخصي في Messages.التدفق المعتاد:
  1. أنشئ مستخدمًا مخصصًا في macOS أو سجّل الدخول إليه.
  2. سجّل الدخول إلى Messages باستخدام Apple ID الخاص بالبوت ضمن ذلك المستخدم.
  3. ثبّت imsg ضمن ذلك المستخدم.
  4. أنشئ برنامج تغليف لـ SSH كي يتمكن OpenClaw من تشغيل imsg ضمن سياق ذلك المستخدم.
  5. وجّه channels.imessage.accounts.<id>.cliPath و.dbPath إلى ملف تعريف ذلك المستخدم.
قد يتطلب التشغيل الأول موافقات عبر واجهة المستخدم الرسومية (Automation + Full Disk Access) في جلسة مستخدم البوت تلك.
البنية الشائعة:
  • يعمل Gateway على Linux/VM
  • يعمل iMessage وimsg على جهاز Mac ضمن شبكتك الطرفية
  • يستخدم برنامج تغليف cliPath بروتوكول SSH لتشغيل imsg
  • يتيح remoteHost جلب المرفقات عبر SCP
مثال:
استخدم مفاتيح SSH كي يعمل كل من SSH وSCP دون تفاعل. تأكد أولًا من الوثوق بمفتاح المضيف (على سبيل المثال ssh bot@mac-mini.tailnet-1234.ts.net) كي تتم تعبئة known_hosts.
يدعم iMessage إعدادات لكل حساب ضمن channels.imessage.accounts.يمكن لكل حساب تجاوز حقول مثل cliPath وdbPath وallowFrom وgroupPolicy وmediaMaxMb وإعدادات السجل وقوائم السماح لجذور المرفقات.
عيّن channels.imessage.dmHistoryLimit لتهيئة جلسات الرسائل المباشرة الجديدة بالسجل الحديث المفكوك ترميزه من imsg لتلك المحادثة. استخدم channels.imessage.dms["<sender>"].historyLimit لإجراء تجاوزات لكل مرسل، بما في ذلك 0 لتعطيل السجل لمرسل معين.يُجلب سجل رسائل iMessage المباشرة عند الطلب من imsg. يؤدي ترك dmHistoryLimit دون تعيين إلى تعطيل التهيئة العامة لسجل الرسائل المباشرة، لكن تظل القيمة الموجبة لـ channels.imessage.dms["<sender>"].historyLimit الخاصة بمرسل معين مفعّلة للتهيئة لذلك المرسل.

الوسائط والتقسيم ووجهات التسليم

  • يكون استيعاب المرفقات الواردة معطّلًا افتراضيًا — عيّن channels.imessage.includeAttachments: true لإعادة توجيه الصور والمذكرات الصوتية ومقاطع الفيديو والمرفقات الأخرى إلى الوكيل. عند تعطيله، تُسقط رسائل iMessage التي تحتوي على مرفقات فقط قبل وصولها إلى الوكيل، وقد لا تُنتج أي سطر سجل Inbound message إطلاقًا.
  • يمكن جلب مسارات المرفقات البعيدة عبر SCP عند تعيين remoteHost
  • يجب أن تطابق مسارات المرفقات الجذور المسموح بها:
    • channels.imessage.attachmentRoots (محلي)
    • channels.imessage.remoteAttachmentRoots (وضع SCP البعيد)
    • توسّع الجذور المضبوطة نمط الجذر الافتراضي /Users/*/Library/Messages/Attachments (تُدمج ولا تستبدله)
  • يستخدم SCP تحققًا صارمًا من مفتاح المضيف (StrictHostKeyChecking=yes)
  • يستخدم حجم الوسائط الصادرة channels.imessage.mediaMaxMb (الافتراضي 16 MB)
  • حد تقسيم النص: channels.imessage.textChunkLimit (الافتراضي 4000)
  • وضع التقسيم: channels.imessage.streaming.chunkMode
    • length (الافتراضي)
    • newline (التقسيم بحسب الفقرات أولًا)
  • يُحوّل الخط العريض والمائل والتسطير والشطب في Markdown الصادر إلى نص ذي تنسيق أصلي (يعرض المستلمون على macOS 15+ التنسيق؛ ويرى المستلمون على الإصدارات الأقدم نصًا عاديًا دون العلامات)؛ وتُحوّل جداول Markdown وفق وضع جداول Markdown الخاص بالقناة
  • يحدد channels.imessage.sendTransport (الافتراضي auto، وbridge، وapplescript) كيفية تسليم imsg لعمليات الإرسال
الوجهات الصريحة المفضلة:
  • chat_id:123 (موصى به للتوجيه المستقر)
  • chat_guid:...
  • chat_identifier:...
تُدعم أيضًا الوجهات المستندة إلى المعرّفات:
  • imessage:+1555...
  • sms:+1555...
  • user@example.com

إجراءات واجهة API الخاصة

عندما يكون imsg launch قيد التشغيل ويبلغ openclaw channels status --probe عن privateApi.available: true، يمكن لأداة الرسائل استخدام إجراءات iMessage الأصلية بالإضافة إلى عمليات إرسال النص العادية. تكون جميع الإجراءات مفعّلة افتراضيًا؛ استخدم channels.imessage.actions لتعطيل إجراءات فردية:
  • التفاعل: أضف/أزل ردود tapback في iMessage ‏(messageId وemoji وremove). تتطابق ردود tapback المدعومة مع الحب والإعجاب وعدم الإعجاب والضحك والتشديد والسؤال. تؤدي الإزالة دون رمز تعبيري إلى مسح أي رد tapback تم تعيينه.
  • الرد: أرسل ردًا مترابطًا على رسالة موجودة (messageId، وtext أو message، بالإضافة إلى chatGuid أو chatId أو chatIdentifier أو to). يتطلب الرد مع مرفق أيضًا إصدار imsg يدعم فيه send-rich الخيار --file.
  • الإرسال مع تأثير: أرسل نصًا مع تأثير iMessage ‏(text أو message، وeffect أو effectId). الأسماء المختصرة: slam، loud، gentle، invisibleink، confetti، lasers، fireworks، balloon، heart، echo، happybirthday، shootingstar، sparkles، spotlight.
  • التحرير: حرّر رسالة مرسلة على إصدارات macOS/واجهة API الخاصة المدعومة (messageId، وtext أو newText). لا يمكن تحرير سوى الرسائل التي أرسلها Gateway نفسه.
  • إلغاء الإرسال: اسحب رسالة مرسلة على إصدارات macOS/واجهة API الخاصة المدعومة (messageId). لا يمكن إلغاء إرسال سوى الرسائل التي أرسلها Gateway نفسه.
  • رفع ملف: أرسل الوسائط/الملفات (buffer بترميز base64 أو media/path/filePath مُهيّأ، وfilename، وasVoice اختياريًا). الاسم البديل القديم: sendAttachment.
  • إعادة تسمية المجموعة وتعيين أيقونة المجموعة وإضافة مشارك وإزالة مشارك ومغادرة المجموعة: أدِر محادثات المجموعة عندما تكون الوجهة الحالية محادثة جماعية. تعدّل هذه الإجراءات هوية Messages على المضيف، لذا تتطلب مرسلًا مالكًا أو عميل Gateway من operator.admin.
  • استطلاع: أنشئ استطلاعًا أصليًا في Apple Messages ‏(pollQuestion، وتكرار pollOption من 2 إلى 12 مرة، بالإضافة إلى chatGuid أو chatId أو chatIdentifier أو to). يراه المستلمون على iOS/iPadOS/macOS 26+ ويصوّتون عليه بشكل أصلي؛ وتحصل إصدارات أنظمة التشغيل الأقدم على نص “تم إرسال استطلاع” احتياطي. يتطلب selectors.pollPayloadMessage.
  • التصويت في استطلاع: صوّت في استطلاع موجود (pollId أو messageId، بالإضافة إلى واحد بالضبط من pollOptionIndex أو pollOptionId أو pollOptionText). يتطلب selectors.pollVoteMessage وطريقة RPC المسماة poll.vote.
تُعرض الاستطلاعات الواردة المقبولة للوكيل متضمنة السؤال وتسميات الخيارات المرقمة وأعداد الأصوات ومعرّف رسالة الاستطلاع الذي يحتاج إليه poll-vote.
يتضمن سياق iMessage الوارد قيم MessageSid القصيرة ومعرّفات GUID الكاملة للرسائل (MessageSidFull) عند توفرها. تقتصر المعرّفات القصيرة على ذاكرة التخزين المؤقت الحديثة للردود المدعومة بـ SQLite ويُتحقق منها مقابل المحادثة الحالية قبل الاستخدام. إذا انتهت صلاحية معرّف قصير، فأعد المحاولة باستخدام MessageSidFull الخاص به مع استهداف المحادثة التي قدمته. لا تتجاوز المعرّفات الكاملة ربط المحادثة أو الحساب، لذا استبدل المعرّف الوارد من محادثة أخرى بمعرّف من الوجهة الحالية. قد ترفض الاستدعاءات المفوضة عن بُعد المعرّفات الكاملة القديمة عندما لا يتوفر دليل على المحادثة الحالية.
يخفي OpenClaw إجراءات واجهة API الخاصة فقط عندما تشير حالة الفحص المخزنة مؤقتًا إلى أن الجسر غير متاح. إذا كانت الحالة مجهولة، تظل الإجراءات مرئية وتُشغّل عمليات الفحص عند الطلب كي ينجح الإجراء الأول بعد imsg launch دون تحديث يدوي منفصل للحالة.
عندما يكون جسر واجهة API الخاصة قيد التشغيل، تُعلّم المحادثات الواردة المقبولة كمقروءة وتُظهر المحادثات المباشرة فقاعة كتابة بمجرد قبول الدورة، بينما يُعِد الوكيل السياق ويولّد الاستجابة. عطّل تعليم الرسائل كمقروءة باستخدام:
تعطّل إصدارات imsg الأقدم من قائمة الإمكانات لكل طريقة الكتابة/القراءة بصمت؛ ويسجل OpenClaw تحذيرًا لمرة واحدة عند كل إعادة تشغيل كي يمكن عزو الإيصال المفقود إلى سببه.
يشترك OpenClaw في ردود tapback في iMessage ويوجّه التفاعلات المقبولة كأحداث نظام بدلًا من نص رسالة عادي، لذا لا يؤدي رد tapback من المستخدم إلى تشغيل حلقة رد عادية.يتحكم channels.imessage.reactionNotifications في وضع الإشعارات:
  • "own" (الافتراضي): أرسل إشعارًا فقط عندما يتفاعل المستخدمون مع رسائل كتبها البوت.
  • "all": أرسل إشعارًا لجميع ردود tapback الواردة من المرسلين المصرح لهم.
  • "off": تجاهل ردود tapback الواردة.
تستخدم التجاوزات الخاصة بكل حساب channels.imessage.accounts.<id>.reactionNotifications.
عندما تكون قيمة approvals.exec.enabled أو approvals.plugin.enabled صحيحة ويُوجّه الطلب إلى iMessage، يسلّم Gateway مطالبة موافقة بشكل أصلي ويقبل رد tapback لحسمها:
  • 👍 (رد tapback للإعجاب) → allow-once
  • 👎 (رد tapback لعدم الإعجاب) → deny
  • يظل allow-always خيارًا احتياطيًا يدويًا: أرسل /approve <id> allow-always كرد عادي.
تتطلب معالجة التفاعل أن يكون معرّف المستخدم المتفاعل مدرجًا صراحةً ضمن الموافقين. تُقرأ قائمة الموافقين من channels.imessage.allowFrom (أو channels.imessage.accounts.<id>.allowFrom)؛ أضف رقم هاتف المستخدم بصيغة E.164 أو بريده الإلكتروني في Apple ID (لا تُعد وجهات المحادثة مثل chat_id:* إدخالات صالحة للموافقين). يُحترم إدخال حرف البدل "*" لكنه يسمح لأي مرسل بالموافقة؛ وتعطّل قائمة الموافقين الفارغة اختصار التفاعل بالكامل. يتجاوز اختصار التفاعل عمدًا reactionNotifications وdmPolicy وgroupAllowFrom لأن قائمة السماح الصريحة للموافقين هي البوابة الوحيدة المهمة لحسم الموافقة.يتبع تفويض أمر النص /approve القائمة نفسها: عندما تكون channels.imessage.allowFrom غير فارغة، يُصرّح لـ /approve <id> <decision> وفق قائمة الموافقين تلك (وليس قائمة السماح الأوسع للرسائل المباشرة)، ويتلقى المرسلون المسموح لهم في قائمة السماح للرسائل المباشرة لكن غير المدرجين في allowFrom رفضًا صريحًا. عندما تكون allowFrom فارغة، يظل الخيار الاحتياطي ضمن المحادثة نفسها ساريًا ويمنح /approve التفويض لكل من تسمح له قائمة السماح للرسائل المباشرة. أضف كل مشغّل ينبغي أن يوافق — عبر /approve أو عبر التفاعلات — إلى allowFrom.ملاحظات المشغّل:
  • يُخزَّن ربط التفاعل في الذاكرة وفي مخزن Gateway الدائم ذي المفاتيح (مع مطابقة مدة TTL لانتهاء صلاحية الموافقة)، كما يستطلع Gateway المطالبات المعلّقة بحثًا عن ردود tapback، لذلك يظل بإمكان رد tapback يصل بعد وقت قصير من إعادة تشغيل Gateway حسم الموافقة.
  • يحسم رد tapback الخاص بالمشغّل نفسه is_from_me=true (على سبيل المثال من جهاز Apple مقترن) الموافقة عندما يكون ذلك المعرّف مُعتمدًا صريحًا.
  • لا تُوجَّه مطالبات الموافقة إلى محادثة جماعية إلا عند تهيئة معتمدين صريحين؛ وإلا فسيتمكن أي عضو في المجموعة من الموافقة.
  • لا يمكن لردود tapback النصية القديمة (Liked "…" كنص عادي من عملاء Apple القدامى جدًا) حسم الموافقات لأنها لا تحمل GUID للرسالة؛ إذ يتطلب حسم التفاعل بيانات tapback الوصفية المنظَّمة التي ترسلها عملاء macOS / iOS الحالية.

عمليات كتابة الإعدادات

تسمح iMessage افتراضيًا بعمليات كتابة الإعدادات التي تبدأها القناة (لأجل /config set|unset عندما commands.config: true). للتعطيل:

دمج الرسائل الخاصة المجزّأة عند الإرسال (أمر + عنوان URL في إنشاء واحد)

عندما يكتب مستخدم أمرًا وعنوان URL معًا — مثل Dump https://example.com/article — يقسّم تطبيق Messages من Apple الإرسال إلى صفَّي chat.db منفصلين:
  1. رسالة نصية ("Dump").
  2. فقاعة معاينة لعنوان URL‏ ("https://...") تتضمن صور معاينة OG كمرفقات.
يصل الصفّان إلى OpenClaw بفاصل يقارب 0.8-2.0 s في معظم الإعدادات. من دون الدمج، يتلقى الوكيل الأمر وحده في التفاعل 1 (وغالبًا ما يرد «أرسل إليّ عنوان URL») قبل وصول عنوان URL في التفاعل 2. هذا ناتج عن مسار إرسال Apple، وليس شيئًا يضيفه OpenClaw أو imsg. يُدخل channels.imessage.coalesceSameSenderDms الرسائل الخاصة في تخزين مؤقت للصفوف المتتالية من المرسل نفسه. عندما يكشف imsg علامة معاينة عنوان URL البنيوية balloon_bundle_id: "com.apple.messages.URLBalloonProvider" في أحد صفوف المصدر، يدمج OpenClaw الإرسال الحقيقي المجزّأ وحده ويُبقي أي صفوف أخرى مخزّنة مؤقتًا كتفاعلات منفصلة. في إصدارات imsg الأقدم التي لا ترسل أي بيانات وصفية للفقاعة إطلاقًا، لا يستطيع OpenClaw تمييز الإرسال المجزّأ من عمليات الإرسال المنفصلة، لذا يعود إلى دمج الدفعة. يحافظ ذلك على السلوك السابق للبيانات الوصفية بدلًا من إرجاع عمليات الإرسال المجزّأة في Dump <url> إلى تفاعلين. تستمر المحادثات الجماعية في الإرسال لكل رسالة على حدة للحفاظ على بنية التفاعلات متعددة المستخدمين.
فعِّله عندما:
  • توفّر skills تتوقع command + payload في رسالة واحدة (التفريغ، اللصق، الحفظ، الإدراج في قائمة الانتظار، وما إلى ذلك).
  • يلصق المستخدمون عناوين URL إلى جانب الأوامر.
  • يمكن قبول زمن الاستجابة الإضافي لتفاعل الرسائل الخاصة (انظر أدناه).
اتركه معطّلًا عندما:
  • تحتاج إلى أدنى زمن استجابة للأوامر في مشغّلات الرسائل الخاصة المكوّنة من كلمة واحدة.
  • تكون جميع التدفقات أوامر تُنفَّذ مرة واحدة من دون حمولات لاحقة.

السيناريوهات وما يراه الوكيل

يعرض عمود «العلامة مفعّلة» السلوك في إصدار imsg يرسل balloon_bundle_id. في إصدارات imsg الأقدم التي لا ترسل أي بيانات وصفية للفقاعة إطلاقًا، تعود الصفوف أدناه المعلَّمة «تفاعلان» / «N من التفاعلات» بدلًا من ذلك إلى الدمج القديم (تفاعل واحد): لا يستطيع OpenClaw بنيويًا تمييز الإرسال المجزّأ من عمليات الإرسال المنفصلة، لذا يحافظ على الدمج السابق للبيانات الوصفية. يبدأ الفصل الدقيق بمجرد أن يرسل الإصدار بيانات وصفية للفقاعة.

استرداد الرسائل الواردة بعد إعادة تشغيل الجسر أو Gateway

تسترد iMessage الرسائل الفائتة أثناء توقف Gateway، وفي الوقت نفسه تمنع «قنبلة التراكم» القديمة التي قد تفرغها Apple بعد استعادة Push. السلوك الافتراضي مفعّل دائمًا ومبني على إزالة تكرار الوارد.
  • إزالة تكرار إعادة التشغيل. تُسجَّل كل رسالة واردة تم إرسالها بواسطة GUID الخاص بها لدى Apple في حالة Plugin الدائمة (imessage.inbound-dedupe)، وتُحجز عند الإدخال وتُثبَّت بعد المعالجة (ويُحرَّر الحجز عند حدوث فشل عابر لتتمكن من إعادة المحاولة). يُسقط أي شيء سبق التعامل معه بدلًا من إرساله مرتين. وهذا ما يتيح لإعادة الاسترداد أن تعمل بقوة من دون مسك سجلات لكل رسالة.
  • الاسترداد بعد التوقف. عند بدء التشغيل، تتذكر أداة المراقبة آخر rowid لصف chat.db تم إرساله (مؤشر دائم لكل حساب) وتمرره إلى imsg watch.subscribe بوصفه since_rowid، فيعيد imsg تشغيل الصفوف التي وصلت أثناء توقف Gateway، ثم يتابع الرسائل الحية. تقتصر إعادة التشغيل على أحدث 500 صف وعلى الرسائل التي لا يزيد عمرها على ~2 hours، وتُسقط إزالة التكرار أي شيء سبق التعامل معه.
  • حاجز عمر التراكم القديم. الصفوف التي تتجاوز حد بدء التشغيل حية فعلًا؛ ويُمنع أي صف يزيد تاريخ إرساله على وقت وصوله بأكثر من ~15 minutes لأنه يمثل التراكم الناتج عن تفريغ Push. أما الصفوف المعاد تشغيلها (عند الحد أو دونه) فتستخدم نافذة الاسترداد الأوسع بدلًا من ذلك، بحيث تُسلَّم الرسالة الفائتة حديثًا بينما لا يُسلَّم السجل القديم.
يعمل الاسترداد عبر إعدادات cliPath المحلية والبعيدة على حد سواء، لأن إعادة تشغيل since_rowid تعمل عبر اتصال RPC نفسه في imsg. يكمن الاختلاف في النافذة: عندما يستطيع Gateway قراءة chat.db (محليًا)، فإنه يثبّت حد rowid لبدء التشغيل، ويحد نطاق إعادة التشغيل، ويسلّم الرسائل الفائتة التي يصل عمرها إلى نحو ساعتين. عبر cliPath بعيد باستخدام SSH، لا يمكنه قراءة قاعدة البيانات، لذا لا تكون إعادة التشغيل محدودة ويستخدم كل صف حاجز العمر الحي — ويظل يسترد الرسائل الفائتة حديثًا ويمنع التراكم القديم، ولكن ضمن النافذة الحية الأضيق. شغّل Gateway على جهاز Mac الذي يستضيف Messages للحصول على نافذة الاسترداد الأوسع.

إشارة مرئية للمشغّل

يُسجَّل التراكم الممنوع بالمستوى الافتراضي، ولا يُسقط بصمت أبدًا (توضح علامة recovery النافذة المطبقة):

الترحيل

أصبح channels.imessage.catchup.* مهمَلًا — فالاسترداد بعد التوقف تلقائي ولا يحتاج إلى إعدادات في عمليات الإعداد الجديدة. تظل الإعدادات الحالية التي تتضمن catchup.enabled: true مُحترمة بوصفها ملف توافق لنافذة إعادة تشغيل الاسترداد. أما كتل الاستدراك المعطّلة (enabled: false أو عدم وجود enabled: true) فقد أُحيلت إلى التقاعد؛ ويزيلها openclaw doctor --fix.

استكشاف الأخطاء وإصلاحها

تحقّق من الملف الثنائي ودعم RPC:
إذا أفاد الفحص بأن RPC غير مدعوم، فحدّث imsg. إذا لم تكن إجراءات API الخاصة متاحة، فشغّل imsg launch في جلسة مستخدم macOS المسجّل دخوله وأعد الفحص. إذا لم يكن Gateway يعمل على macOS، فاستخدم إعداد جهاز Mac البعيد عبر SSH الوارد أعلاه بدلًا من مسار imsg المحلي الافتراضي.
أثبت أولًا ما إذا كانت الرسالة قد وصلت إلى جهاز Mac المحلي. إذا لم يتغير chat.db، فلن يتمكن OpenClaw من استلام الرسالة حتى عندما يفيد imsg status --json بأن الجسر سليم.
إذا لم تنشئ الرسائل المرسلة من الهاتف صفوفًا جديدة، فأصلح طبقتَي Messages في macOS وApple Push قبل تغيير إعدادات OpenClaw. وغالبًا ما تكفي إعادة تنشيط الخدمات لمرة واحدة:
أرسل رسالة iMessage جديدة من الهاتف وتأكد من ظهور صف chat.db جديد أو حدث imsg watch قبل تصحيح أخطاء جلسات OpenClaw. لا تشغّل هذا كحلقة دورية لإعادة تشغيل الجسر؛ فقد تؤدي عمليات imsg launch المتكررة إلى جانب إعادة تشغيل Gateway أثناء العمل النشط إلى مقاطعة عمليات التسليم وترك عمليات القناة الجارية عالقة.
يجب تشغيل cliPath: "imsg" الافتراضي على جهاز Mac المسجّل الدخول إلى Messages. على Linux أو Windows، اضبط channels.imessage.cliPath على برنامج نصي مغلّف يتصل بجهاز Mac هذا عبر SSH ويشغّل imsg "$@".
ثم شغّل:
تحقّق مما يلي:
  • channels.imessage.dmPolicy
  • channels.imessage.allowFrom
  • موافقات الاقتران (openclaw pairing list imessage)
تحقّق مما يلي:
  • channels.imessage.groupPolicy
  • channels.imessage.groupAllowFrom
  • channels.imessage.groups سلوك قائمة السماح
  • إعداد نمط الإشارة (agents.list[].groupChat.mentionPatterns)
تحقّق مما يلي:
  • channels.imessage.remoteHost
  • channels.imessage.remoteAttachmentRoots
  • مصادقة مفتاح SSH/SCP من مضيف Gateway
  • وجود مفتاح المضيف في ~/.ssh/known_hosts على مضيف Gateway
  • إمكانية قراءة المسار البعيد على جهاز Mac الذي يشغّل Messages
أعِد التشغيل في طرفية ذات واجهة رسومية تفاعلية ضمن سياق المستخدم/الجلسة نفسه، ووافق على المطالبات:
تأكّد من منح صلاحيتَي الوصول الكامل إلى القرص والأتمتة لسياق العملية الذي يشغّل OpenClaw/imsg.

مؤشرات مرجع الإعداد

ذو صلة