imsg على مضيف macOS نفسه المسجّل الدخول إلى Messages. إذا كان Gateway يعمل في مكان آخر، فوجّه channels.imessage.cliPath إلى مغلّف SSH شفاف يشغّل imsg على جهاز Mac.الاسترداد الوارد تلقائي. بعد إعادة تشغيل الجسر أو Gateway، يعيد iMessage تشغيل الرسائل التي فاتت أثناء توقفه ويمنع «دفعة التراكم القديمة» التي قد يرسلها Apple بعد استرداد Push، مع إزالة التكرار كي لا يُرسَل أي شيء مرتين. لا يوجد إعداد لتمكين ذلك — راجع الاسترداد الوارد بعد إعادة تشغيل الجسر أو Gateway.imsg rpc ويتواصل عبر JSON-RPC من خلال الإدخال والإخراج القياسيين — دون خدمة خفية أو منفذ منفصل. يُوصى بشدة بوضع API الخاص لتوفير قناة iMessage متكاملة؛ إذ تتطلب الردود وردود الفعل والتأثيرات والاستطلاعات والردود على المرفقات وإجراءات المجموعات imsg launch واجتياز فحص API الخاص بنجاح.
في الإعداد المحلي الشائع، يمكن لإعداد OpenClaw عرض تثبيت imsg أو تحديثه عبر Homebrew على جهاز Mac المسجّل الدخول إلى Messages بعد تأكيد المستخدم. تظل الإعدادات اليدوية والبنى التي تستخدم مغلّف SSH تحت إدارة المشغّل: ثبّت imsg أو حدّثه ضمن سياق المستخدم نفسه الذي سيشغّل Gateway أو المغلّف.
إجراءات API الخاص
الاقتران
جهاز Mac بعيد
مرجع الإعدادات
الإعداد السريع
- جهاز Mac محلي (المسار السريع)
- جهاز Mac بعيد عبر SSH
تثبيت imsg والتحقق منه
imsg الافتراضي، يمكنه طلب تثبيت steipete/tap/imsg عبر Homebrew. وإذا اكتشف imsg مُدارًا بواسطة Homebrew، فيمكنه طلب إعادة تثبيته أو تحديثه. لا تُعدَّل مغلّفات cliPath المخصصة.إعداد OpenClaw
تشغيل Gateway
الموافقة على اقتران أول رسالة مباشرة (dmPolicy الافتراضية)
المتطلبات والأذونات (macOS)
- يجب تسجيل الدخول إلى Messages على جهاز Mac الذي يشغّل
imsg. - يلزم منح الوصول الكامل إلى القرص لسياق العملية الذي يشغّل OpenClaw/
imsg(للوصول إلى قاعدة بيانات Messages). - يلزم إذن الأتمتة لإرسال الرسائل عبر Messages.app.
- بالنسبة إلى الإجراءات المتقدمة (التفاعل / التعديل / إلغاء الإرسال / الرد المتسلسل / التأثيرات / الاستطلاعات / عمليات المجموعات)، يجب تعطيل حماية تكامل النظام — راجع تمكين API الخاص لـ imsg. يعمل الإرسال والاستقبال الأساسيان للنصوص والوسائط من دون تعطيلها.
فشل الإرسال عبر مغلّف SSH مع AppleEvents -1743
فشل الإرسال عبر مغلّف SSH مع AppleEvents -1743
channels status --probe ومعالجة الرسائل الواردة، بينما يستمر فشل الإرسال الصادر بسبب خطأ في تفويض AppleEvents:/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، بالإضافة إلى مؤشرات الكتابة وإيصالات القراءة.
imsg هذا المتطلب صراحةً:
الميزات المتقدمة مثلتستخدم تقنية حقن المكتبة المساعدة مكتبة dylib الخاصة بـreadوtypingوlaunch، والإرسال الغني المدعوم بالجسر، وتعديل الرسائل، وإدارة المحادثات اختيارية. وتتطلب تعطيل SIP وحقن مكتبة dylib مساعدة فيMessages.app. يرفضimsg launchإجراء الحقن عندما تكون SIP مفعّلة.
imsg للوصول إلى واجهات API الخاصة بـ Messages. لا يوجد خادم تابع لجهة خارجية أو بيئة تشغيل BlueBubbles ضمن مسار iMessage في OpenClaw.
الإعداد
-
ثبّت (أو رقِّ)
imsgعلى جهاز Mac الذي يشغّل Messages.app:تعرض مخرجاتimsg status --jsonالقيمbridge_versionوrpc_methodsوselectorsلكل طريقة، حتى تتمكن من معرفة ما يدعمه الإصدار الحالي قبل البدء. -
عطّل حماية تكامل النظام، و(في إصدارات 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. تتبع إعدادات الأجهزة الافتراضية مسارًا منفصلًا، لذا التقط لقطة للجهاز الافتراضي أولًا.
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بدلًا من إضعاف ضوابط أمان إضافية على مستوى النظام بأكمله. - macOS 10.13-10.15 (Sierra-Catalina): عطّل التحقق من صحة المكتبات عبر Terminal، وأعد التشغيل في وضع الاسترداد، وشغّل
-
احقن الأداة المساعدة. مع تعطيل SIP وتسجيل الدخول إلى Messages.app:
يرفض
imsg launchإجراء الحقن عندما يظل SIP مفعّلًا، لذا يُعد ذلك أيضًا تأكيدًا على تنفيذ الخطوة 2. -
تحقّق من الجسر من 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>
أنماط النشر
مستخدم macOS مخصص للبوت (هوية iMessage منفصلة)
مستخدم macOS مخصص للبوت (هوية iMessage منفصلة)
- أنشئ مستخدمًا مخصصًا في macOS أو سجّل الدخول إليه.
- سجّل الدخول إلى Messages باستخدام Apple ID الخاص بالبوت ضمن ذلك المستخدم.
- ثبّت
imsgضمن ذلك المستخدم. - أنشئ برنامج تغليف لـ SSH كي يتمكن OpenClaw من تشغيل
imsgضمن سياق ذلك المستخدم. - وجّه
channels.imessage.accounts.<id>.cliPathو.dbPathإلى ملف تعريف ذلك المستخدم.
جهاز Mac بعيد عبر Tailscale (مثال)
جهاز Mac بعيد عبر Tailscale (مثال)
- يعمل Gateway على Linux/VM
- يعمل iMessage و
imsgعلى جهاز Mac ضمن شبكتك الطرفية - يستخدم برنامج تغليف
cliPathبروتوكول SSH لتشغيلimsg - يتيح
remoteHostجلب المرفقات عبر SCP
ssh bot@mac-mini.tailnet-1234.ts.net) كي تتم تعبئة known_hosts.نمط الحسابات المتعددة
نمط الحسابات المتعددة
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.chunkModelength(الافتراضي)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.معرّفات الرسائل
معرّفات الرسائل
MessageSid القصيرة ومعرّفات GUID الكاملة للرسائل (MessageSidFull) عند توفرها. تقتصر المعرّفات القصيرة على ذاكرة التخزين المؤقت الحديثة للردود المدعومة بـ SQLite ويُتحقق منها مقابل المحادثة الحالية قبل الاستخدام. إذا انتهت صلاحية معرّف قصير، فأعد المحاولة باستخدام MessageSidFull الخاص به مع استهداف المحادثة التي قدمته. لا تتجاوز المعرّفات الكاملة ربط المحادثة أو الحساب، لذا استبدل المعرّف الوارد من محادثة أخرى بمعرّف من الوجهة الحالية. قد ترفض الاستدعاءات المفوضة عن بُعد المعرّفات الكاملة القديمة عندما لا يتوفر دليل على المحادثة الحالية.اكتشاف الإمكانات
اكتشاف الإمكانات
imsg launch دون تحديث يدوي منفصل للحالة.إيصالات القراءة والكتابة
إيصالات القراءة والكتابة
imsg الأقدم من قائمة الإمكانات لكل طريقة الكتابة/القراءة بصمت؛ ويسجل OpenClaw تحذيرًا لمرة واحدة عند كل إعادة تشغيل كي يمكن عزو الإيصال المفقود إلى سببه.ردود tapback الواردة
ردود 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 منفصلين:
- رسالة نصية (
"Dump"). - فقاعة معاينة لعنوان URL (
"https://...") تتضمن صور معاينة OG كمرفقات.
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.
استكشاف الأخطاء وإصلاحها
تعذّر العثور على imsg أو RPC غير مدعوم
تعذّر العثور على imsg أو RPC غير مدعوم
imsg. إذا لم تكن إجراءات API الخاصة متاحة، فشغّل imsg launch في جلسة مستخدم macOS المسجّل دخوله وأعد الفحص. إذا لم يكن Gateway يعمل على macOS، فاستخدم إعداد جهاز Mac البعيد عبر SSH الوارد أعلاه بدلًا من مسار imsg المحلي الافتراضي.تُرسل Messages لكن رسائل iMessage الواردة لا تصل
تُرسل Messages لكن رسائل iMessage الواردة لا تصل
chat.db، فلن يتمكن OpenClaw من استلام الرسالة حتى عندما يفيد imsg status --json بأن الجسر سليم.chat.db جديد أو حدث imsg watch قبل تصحيح أخطاء جلسات OpenClaw. لا تشغّل هذا كحلقة دورية لإعادة تشغيل الجسر؛ فقد تؤدي عمليات imsg launch المتكررة إلى جانب إعادة تشغيل Gateway أثناء العمل النشط إلى مقاطعة عمليات التسليم وترك عمليات القناة الجارية عالقة.Gateway لا يعمل على macOS
Gateway لا يعمل على macOS
cliPath: "imsg" الافتراضي على جهاز Mac المسجّل الدخول إلى Messages. على Linux أو Windows، اضبط channels.imessage.cliPath على برنامج نصي مغلّف يتصل بجهاز Mac هذا عبر SSH ويشغّل imsg "$@".يتم تجاهل الرسائل المباشرة
يتم تجاهل الرسائل المباشرة
channels.imessage.dmPolicychannels.imessage.allowFrom- موافقات الاقتران (
openclaw pairing list imessage)
يتم تجاهل رسائل المجموعة
يتم تجاهل رسائل المجموعة
channels.imessage.groupPolicychannels.imessage.groupAllowFromchannels.imessage.groupsسلوك قائمة السماح- إعداد نمط الإشارة (
agents.list[].groupChat.mentionPatterns)
فشل المرفقات البعيدة
فشل المرفقات البعيدة
channels.imessage.remoteHostchannels.imessage.remoteAttachmentRoots- مصادقة مفتاح SSH/SCP من مضيف Gateway
- وجود مفتاح المضيف في
~/.ssh/known_hostsعلى مضيف Gateway - إمكانية قراءة المسار البعيد على جهاز Mac الذي يشغّل Messages
تم تفويت مطالبات أذونات macOS
تم تفويت مطالبات أذونات macOS
imsg.مؤشرات مرجع الإعداد
ذو صلة
- نظرة عامة على القنوات — جميع القنوات المدعومة
- إزالة BlueBubbles ومسار iMessage عبر imsg — ملخص الإعلان والترحيل
- الانتقال من BlueBubbles — جدول تحويل الإعداد وخطوات الانتقال التفصيلية
- الإقران — مصادقة الرسائل المباشرة ومسار الإقران
- المجموعات — سلوك المحادثات الجماعية وتقييد الاستجابة بالإشارات
- توجيه القنوات — توجيه جلسات الرسائل
- الأمان — نموذج الوصول والتعزيز الأمني