Mainstream messaging
iMessage
الحالة: تكامل CLI خارجي أصلي. يشغّل Gateway العملية imsg rpc ويتواصل عبر JSON-RPC من خلال الإدخال والإخراج القياسيين — دون خدمة خفية أو منفذ منفصل. يُوصى بشدة بوضع API الخاص لتوفير قناة iMessage متكاملة؛ إذ تتطلب الردود وردود الفعل والتأثيرات والاستطلاعات والردود على المرفقات وإجراءات المجموعات imsg launch واجتياز فحص API الخاص بنجاح.
في الإعداد المحلي الشائع، يمكن لإعداد OpenClaw عرض تثبيت imsg أو تحديثه عبر Homebrew على جهاز Mac المسجّل الدخول إلى Messages بعد تأكيد المستخدم. تظل الإعدادات اليدوية والبنى التي تستخدم مغلّف SSH تحت إدارة المشغّل: ثبّت imsg أو حدّثه ضمن سياق المستخدم نفسه الذي سيشغّل Gateway أو المغلّف.
الردود وردود الفعل والتأثيرات والاستطلاعات والمرفقات وإدارة المجموعات.
تستخدم رسائل iMessage المباشرة وضع الاقتران افتراضيًا.
استخدم مغلّف SSH عندما لا يعمل Gateway على جهاز Mac الخاص بـ Messages.
المرجع الكامل لحقول iMessage.
الإعداد السريع
جهاز Mac محلي (المسار السريع)
تثبيت imsg والتحقق منه
brew install steipete/tap/imsgbrew update && brew upgrade imsgimsg rpc --helpimsg launchopenclaw channels status --probeعندما يكتشف معالج الإعداد المحلي غياب أمر imsg الافتراضي، يمكنه طلب تثبيت steipete/tap/imsg عبر Homebrew. وإذا اكتشف imsg مُدارًا بواسطة Homebrew، فيمكنه طلب إعادة تثبيته أو تحديثه. لا تُعدَّل مغلّفات cliPath المخصصة.
إعداد OpenClaw
{channels: {imessage: {enabled: true,cliPath: "/usr/local/bin/imsg",dbPath: "/Users/user/Library/Messages/chat.db",},},}تشغيل Gateway
openclaw gatewayالموافقة على اقتران أول رسالة مباشرة (dmPolicy الافتراضية)
openclaw pairing list imessageopenclaw pairing approve imessage <CODE>تنتهي صلاحية طلبات الاقتران بعد 1 hour.
جهاز Mac بعيد عبر SSH
لا تحتاج معظم الإعدادات إلى SSH. استخدم هذه البنية فقط عندما يتعذر تشغيل Gateway على جهاز Mac المسجّل الدخول إلى Messages. لا يتطلب OpenClaw سوى cliPath متوافق مع الإدخال والإخراج القياسيين، لذا يمكنك توجيه cliPath إلى نص برمجي مغلّف يتصل بجهاز Mac بعيد عبر SSH ويشغّل imsg.
ثبّت imsg وحدّثه على جهاز Mac البعيد، لا على مضيف Gateway:
ssh messages-mac 'brew install steipete/tap/imsg && brew update && brew upgrade imsg'#!/usr/bin/env bashexec ssh -T messages-mac imsg "$@"الإعداد الموصى به عند تمكين المرفقات:
{channels: {imessage: { enabled: true, cliPath: "~/.openclaw/scripts/imsg-ssh", remoteHost: "user@gateway-host", // يُستخدم لجلب المرفقات عبر SCP includeAttachments: true, // اختياري: جذور إضافية مسموح بها للمرفقات (تُدمج مع الجذر الافتراضي // /Users/*/Library/Messages/Attachments). attachmentRoots: ["/Users/*/Library/Messages/Attachments"], remoteAttachmentRoots: ["/Users/*/Library/Messages/Attachments"],},},}إذا لم تُضبط remoteHost، يحاول OpenClaw اكتشافها تلقائيًا عبر تحليل النص البرمجي لمغلّف SSH.
يجب أن تكون remoteHost إما host أو user@host (دون مسافات أو خيارات SSH)؛ وتُتجاهل القيم غير الآمنة.
يستخدم OpenClaw تحققًا صارمًا من مفتاح المضيف في SCP، لذا يجب أن يكون مفتاح مضيف الترحيل موجودًا مسبقًا في ~/.ssh/known_hosts.
تُتحقق مسارات المرفقات بالاستناد إلى الجذور المسموح بها (attachmentRoots / remoteAttachmentRoots).
المتطلبات والأذونات (macOS)
- يجب تسجيل الدخول إلى Messages على جهاز Mac الذي يشغّل
imsg. - يلزم منح الوصول الكامل إلى القرص لسياق العملية الذي يشغّل OpenClaw/
imsg(للوصول إلى قاعدة بيانات Messages). - يلزم إذن الأتمتة لإرسال الرسائل عبر Messages.app.
- بالنسبة إلى الإجراءات المتقدمة (التفاعل / التعديل / إلغاء الإرسال / الرد المتسلسل / التأثيرات / الاستطلاعات / عمليات المجموعات)، يجب تعطيل حماية تكامل النظام — راجع تمكين API الخاص لـ imsg. يعمل الإرسال والاستقبال الأساسيان للنصوص والوسائط من دون تعطيلها.
فشل الإرسال عبر مغلّف SSH مع AppleEvents -1743
يمكن لإعداد SSH بعيد قراءة المحادثات واجتياز channels status --probe ومعالجة الرسائل الواردة، بينما يستمر فشل الإرسال الصادر بسبب خطأ في تفويض AppleEvents:
غير مصرّح بإرسال أحداث Apple إلى Messages. (-1743)تحقق من قاعدة بيانات TCC لمستخدم جهاز Mac المسجّل دخوله أو من System Settings > Privacy & Security > Automation. إذا كان إدخال Automation مسجّلًا للعملية /usr/libexec/sshd-keygen-wrapper بدلًا من العملية imsg أو عملية الصدفة المحلية، فقد لا يعرض macOS مفتاح تبديل صالحًا لـ Messages لعميل SSH الموجود على جانب الخادم:
kTCCServiceAppleEvents | /usr/libexec/sshd-keygen-wrapper | auth_value=0 | com.apple.MobileSMSفي هذه الحالة، قد يستمر فشل تكرار 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.
الإعداد
-
ثبّت (أو رقِّ)
imsgعلى جهاز Mac الذي يشغّل Messages.app:bash brew install steipete/tap/imsgbrew update && brew upgrade imsgimsg --versionimsg status --jsonتعرض مخرجات
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. تتبع إعدادات الأجهزة الافتراضية مسارًا منفصلًا، لذا التقط لقطة للجهاز الافتراضي أولًا.
في macOS 11 والإصدارات الأحدث، لا يكفي
csrutil disableوحده عادةً. تواصل Apple فرض التحقق من صحة المكتبات علىMessages.appبصفته ملفًا ثنائيًا للنظام الأساسي، ولذلك تُرفض الأداة المساعدة الموقّعة بتوقيع مخصص (Library Validation failed: ... platform binary, but mapped file is not) حتى مع تعطيل SIP. بعد تعطيل SIP، عطّل أيضًا التحقق من صحة المكتبات وأعد التشغيل:bash sudo defaults write /Library/Preferences/com.apple.security.libraryvalidation.plist DisableLibraryValidation -bool truemacOS 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:
bash imsg launchيرفض
imsg launchإجراء الحقن عندما يظل SIP مفعّلًا، لذا يُعد ذلك أيضًا تأكيدًا على تنفيذ الخطوة 2. -
تحقّق من الجسر من OpenClaw:
bash openclaw channels status --probeينبغي أن يُبلغ إدخال 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 الرقمية.
سياسة المجموعات + الإشارات
يتحكم channels.imessage.groupPolicy في معالجة المجموعات:
allowlist(الافتراضي)opendisabled
قائمة السماح لمرسلي المجموعات: channels.imessage.groupAllowFrom.
يمكن لإدخالات groupAllowFrom أيضًا الإشارة إلى مجموعات الوصول الثابتة للمرسلين (accessGroup:<name>).
الإجراء الاحتياطي وقت التشغيل: إذا لم تُعيّن groupAllowFrom، تستخدم عمليات التحقق من مرسلي مجموعات iMessage القيمة allowFrom؛ عيّن groupAllowFrom عندما ينبغي اختلاف قبول الرسائل المباشرة والمجموعات. لا ترجع groupAllowFrom: [] الفارغة صراحةً إلى قيمة احتياطية — بل تحظر جميع مرسلي المجموعات ضمن allowlist.
ملاحظة وقت التشغيل: إذا كانت channels.imessage مفقودة تمامًا، يرجع وقت التشغيل إلى groupPolicy="allowlist" ويسجّل تحذيرًا (حتى إذا كانت channels.defaults.groupPolicy معيّنة).
بوابة الإشارات للمجموعات:
- لا يوفّر iMessage بيانات وصفية أصلية للإشارات
- يستخدم اكتشاف الإشارات أنماط التعبيرات النمطية (
agents.list[].groupChat.mentionPatterns، مع الإجراء الاحتياطيmessages.groupChat.mentionPatterns) - من دون أنماط مضبوطة، لا يمكن فرض بوابة الإشارات
- تتجاوز أوامر التحكم الصادرة عن المرسلين المصرّح لهم بوابة الإشارات
systemPrompt لكل مجموعة:
يقبل كل إدخال ضمن channels.imessage.groups.* سلسلة systemPrompt اختيارية تُحقن في موجّه النظام الخاص بالوكيل في كل دورة تتعامل مع رسالة في تلك المجموعة. يماثل تحديد القيمة channels.whatsapp.groups:
- موجّه النظام الخاص بالمجموعة (
groups["<chat_id>"].systemPrompt): يُستخدم عندما يوجد إدخال المجموعة المحددة في الخريطة ويكون مفتاحsystemPromptالخاص به معرّفًا. إذا كانتsystemPromptسلسلة فارغة ("")، يُعطّل حرف البدل ولا يُطبّق أي موجّه نظام على تلك المجموعة. - موجّه نظام حرف البدل للمجموعات (
groups["*"].systemPrompt): يُستخدم عندما يكون إدخال المجموعة المحددة غائبًا تمامًا من الخريطة، أو عندما يكون موجودًا لكنه لا يعرّف مفتاحsystemPrompt.
{ channels: { imessage: { groupPolicy: "allowlist", groupAllowFrom: ["+15555550123"], groups: { "*": { systemPrompt: "استخدم التهجئة البريطانية." }, "8421": { requireMention: true, systemPrompt: "هذه محادثة مناوبة الدعم. اجعل الردود أقل من 3 جمل.", }, "9907": { // تعطيل صريح: لا ينطبق حرف البدل "استخدم التهجئة البريطانية." هنا systemPrompt: "", }, }, }, },}لا تنطبق الموجّهات الخاصة بكل مجموعة إلا على رسائل المجموعات — ولا تتأثر الرسائل المباشرة.
الجلسات والردود الحتمية
- تستخدم الرسائل المباشرة التوجيه المباشر؛ وتستخدم المجموعات توجيه المجموعات.
- مع القيمة الافتراضية
session.dmScope=main، تُدمج رسائل iMessage المباشرة في الجلسة الرئيسية للوكيل. - تكون جلسات المجموعات معزولة (
agent:<agentId>:imessage:group:<chat_id>). - تُوجّه الردود مجددًا إلى iMessage باستخدام البيانات الوصفية للقناة/الهدف الأصليين.
سلوك سلاسل المحادثات الشبيهة بالمجموعات:
قد تصل بعض سلاسل محادثات iMessage متعددة المشاركين مع is_group=false.
إذا ضُبطت chat_id هذه صراحةً ضمن channels.imessage.groups، يعاملها OpenClaw كحركة مرور جماعية (بوابة المجموعات + عزل جلسة المجموعة).
ارتباطات محادثات 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>
مثال:
{ agents: { list: [ { id: "codex", runtime: { type: "acp", acp: { agent: "codex", backend: "acpx", mode: "persistent" }, }, }, ], }, bindings: [ { type: "acp", agentId: "codex", match: { channel: "imessage", accountId: "default", peer: { kind: "group", id: "chat_id:123" }, }, acp: { label: "codex-group" }, }, ],}راجع وكلاء ACP لمعرفة سلوك ارتباط ACP المشترك.
أنماط النشر
مستخدم macOS مخصص للبوت (هوية iMessage منفصلة)
استخدم Apple ID ومستخدم macOS مخصصين لعزل حركة مرور البوت عن ملفك الشخصي في Messages.
التدفق المعتاد:
- أنشئ مستخدمًا مخصصًا في macOS أو سجّل الدخول إليه.
- سجّل الدخول إلى Messages باستخدام Apple ID الخاص بالبوت ضمن ذلك المستخدم.
- ثبّت
imsgضمن ذلك المستخدم. - أنشئ برنامج تغليف لـ SSH كي يتمكن OpenClaw من تشغيل
imsgضمن سياق ذلك المستخدم. - وجّه
channels.imessage.accounts.<id>.cliPathو.dbPathإلى ملف تعريف ذلك المستخدم.
قد يتطلب التشغيل الأول موافقات عبر واجهة المستخدم الرسومية (Automation + Full Disk Access) في جلسة مستخدم البوت تلك.
جهاز Mac بعيد عبر Tailscale (مثال)
البنية الشائعة:
- يعمل Gateway على Linux/VM
- يعمل iMessage و
imsgعلى جهاز Mac ضمن شبكتك الطرفية - يستخدم برنامج تغليف
cliPathبروتوكول SSH لتشغيلimsg - يتيح
remoteHostجلب المرفقات عبر SCP
مثال:
{ channels: { imessage: { enabled: true, cliPath: "~/.openclaw/scripts/imsg-ssh", remoteHost: "bot@mac-mini.tailnet-1234.ts.net", includeAttachments: true, dbPath: "/Users/bot/Library/Messages/chat.db", }, },}#!/usr/bin/env bashexec ssh -T bot@mac-mini.tailnet-1234.ts.net imsg "$@"استخدم مفاتيح 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.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
imsg chats --limit 20إجراءات واجهة API الخاصة
عندما يكون imsg launch قيد التشغيل ويبلغ openclaw channels status --probe عن privateApi.available: true، يمكن لأداة الرسائل استخدام إجراءات iMessage الأصلية بالإضافة إلى عمليات إرسال النص العادية.
تكون جميع الإجراءات مفعّلة افتراضيًا؛ استخدم channels.imessage.actions لتعطيل إجراءات فردية:
{ channels: { imessage: { actions: { reactions: true, edit: true, unsend: true, reply: true, sendWithEffect: true, sendAttachment: true, renameGroup: true, setGroupIcon: true, addParticipant: true, removeParticipant: true, leaveGroup: true, polls: true, }, }, },}الإجراءات المتاحة
- التفاعل: أضف/أزل ردود 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 الخاصة قيد التشغيل، تُعلّم المحادثات الواردة المقبولة كمقروءة وتُظهر المحادثات المباشرة فقاعة كتابة بمجرد قبول الدورة، بينما يُعِد الوكيل السياق ويولّد الاستجابة. عطّل تعليم الرسائل كمقروءة باستخدام:
{ channels: { imessage: { sendReadReceipts: false, }, },}تعطّل إصدارات imsg الأقدم من قائمة الإمكانات لكل طريقة الكتابة/القراءة بصمت؛ ويسجل OpenClaw تحذيرًا لمرة واحدة عند كل إعادة تشغيل كي يمكن عزو الإيصال المفقود إلى سببه.
ردود tapback الواردة
يشترك 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).
للتعطيل:
{ channels: { imessage: { configWrites: false, }, },}دمج الرسائل الخاصة المجزّأة عند الإرسال (أمر + عنوان URL في إنشاء واحد)
عندما يكتب مستخدم أمرًا وعنوان URL معًا — مثل Dump https://example.com/article — يقسّم تطبيق Messages من Apple الإرسال إلى صفَّي chat.db منفصلين:
- رسالة نصية (
"Dump"). - فقاعة معاينة لعنوان 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 إلى جانب الأوامر.
- يمكن قبول زمن الاستجابة الإضافي لتفاعل الرسائل الخاصة (انظر أدناه).
اتركه معطّلًا عندما:
- تحتاج إلى أدنى زمن استجابة للأوامر في مشغّلات الرسائل الخاصة المكوّنة من كلمة واحدة.
- تكون جميع التدفقات أوامر تُنفَّذ مرة واحدة من دون حمولات لاحقة.
التفعيل
{ channels: { imessage: { coalesceSameSenderDms: true, // تفعيل اختياري (الافتراضي: false) }, },}عند تفعيل العلامة وعدم وجود messages.inbound.byChannel.imessage صريح أو messages.inbound.debounceMs عام، تتسع نافذة إزالة الارتداد إلى 7000 ms (القيمة الافتراضية القديمة هي 0 ms — من دون إزالة ارتداد). النافذة الأوسع مطلوبة لأن وتيرة الإرسال المجزّأ لمعاينة عنوان URL لدى Apple قد تمتد إلى عدة ثوانٍ أثناء إصدار Messages.app لصف المعاينة.
لضبط النافذة بنفسك:
{ messages: { inbound: { byChannel: { // تغطي 7000 ms تأخيرات معاينة عنوان URL الملحوظة في Messages.app. imessage: 7000, }, }, },}المفاضلات
- يتطلب الدمج الدقيق البيانات الوصفية الحالية لحمولة
imsg. عند وجودballoon_bundle_id، لا يُدمج إلا الإرسال المجزّأ الحقيقي؛ أما الدمج الاحتياطي من دون بيانات وصفية الموصوف أعلاه فهو توافق مؤقت مع الإصدارات السابقة، ويُزال بمجرد أن يدمجimsgعمليات الإرسال المجزّأة في المنبع. - زمن استجابة إضافي لرسائل DM. عند تفعيل العلامة، تنتظر كل رسالة DM (بما في ذلك أوامر التحكم المستقلة والمتابعات النصية المفردة) حتى مدة نافذة إزالة الارتداد قبل الإرسال، تحسبًا لوصول صف معاينة عنوان URL. تحتفظ رسائل المحادثات الجماعية بالإرسال الفوري.
- الناتج المدمج محدود. يُحد النص المدمج عند 4000 محرف مع علامة
…[truncated]صريحة؛ وتُحد المرفقات عند 20؛ وتُحد إدخالات المصدر عند 10 (مع الاحتفاظ بالأول والأحدث بعد ذلك). ويُتتبَّع كل GUID مصدر فيcoalescedMessageGuidsلأغراض القياس عن بُعد في المراحل اللاحقة. - للرسائل الخاصة فقط. تستخدم المحادثات الجماعية الإرسال لكل رسالة على حدة ليظل الروبوت سريع الاستجابة عند كتابة عدة أشخاص.
- تفعيل اختياري لكل قناة. لا تتأثر القنوات الأخرى (Discord وSlack وTelegram وWhatsApp و…). ينبغي لإعدادات BlueBubbles القديمة التي تضبط
channels.bluebubbles.coalesceSameSenderDmsترحيل تلك القيمة إلىchannels.imessage.coalesceSameSenderDms.
السيناريوهات وما يراه الوكيل
يعرض عمود «العلامة مفعّلة» السلوك في إصدار imsg يرسل balloon_bundle_id. في إصدارات imsg الأقدم التي لا ترسل أي بيانات وصفية للفقاعة إطلاقًا، تعود الصفوف أدناه المعلَّمة «تفاعلان» / «N من التفاعلات» بدلًا من ذلك إلى الدمج القديم (تفاعل واحد): لا يستطيع OpenClaw بنيويًا تمييز الإرسال المجزّأ من عمليات الإرسال المنفصلة، لذا يحافظ على الدمج السابق للبيانات الوصفية. يبدأ الفصل الدقيق بمجرد أن يرسل الإصدار بيانات وصفية للفقاعة.
| ما ينشئه المستخدم | ما ينتجه chat.db |
العلامة معطّلة (الافتراضي) | العلامة مفعّلة + النافذة (يرسل imsg بيانات وصفية للفقاعة) |
|---|---|---|---|
Dump https://example.com (إرسال واحد) |
صفّان بفاصل ~1 s | تفاعلان للوكيل: "Dump" وحده، ثم عنوان URL | تفاعل واحد: النص المدمج Dump https://example.com |
Save this 📎image.jpg caption (مرفق + نص) |
صفّان من دون بيانات وصفية لفقاعة عنوان URL | تفاعلان | تفاعلان بعد ملاحظة البيانات الوصفية؛ تفاعل مدمج واحد في الجلسات القديمة/السابقة للرصد والخالية من البيانات الوصفية |
/status (أمر مستقل) |
صف واحد | إرسال فوري | الانتظار حتى مدة النافذة، ثم الإرسال |
| لصق عنوان URL وحده | صف واحد | إرسال فوري | الانتظار حتى مدة النافذة، ثم الإرسال |
| إرسال نص + عنوان URL كرسالتين منفصلتين عمدًا، بفاصل دقائق | صفّان خارج النافذة | تفاعلان | تفاعلان (تنتهي النافذة بينهما) |
| تدفق سريع (>10 رسائل DM صغيرة داخل النافذة) | N من الصفوف من دون بيانات وصفية لفقاعة عنوان URL | N من التفاعلات | N من التفاعلات بعد ملاحظة البيانات الوصفية؛ تفاعل مدمج محدود واحد في الجلسات القديمة/السابقة للرصد والخالية من البيانات الوصفية |
| شخصان يكتبان في محادثة جماعية | N من الصفوف من M من المرسلين | M+ من التفاعلات (واحد لكل دفعة مرسل) | M+ من التفاعلات — لا تُدمج المحادثات الجماعية |
استرداد الرسائل الواردة بعد إعادة تشغيل الجسر أو 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 النافذة المطبقة):
imessage: تم منع تراكم وارد قديم account=<id> sent=<iso> recovery=<bool> (تم منع <N> منذ البدء)الترحيل
أصبح channels.imessage.catchup.* مهمَلًا — فالاسترداد بعد التوقف تلقائي ولا يحتاج إلى إعدادات في عمليات الإعداد الجديدة. تظل الإعدادات الحالية التي تتضمن catchup.enabled: true مُحترمة بوصفها ملف توافق لنافذة إعادة تشغيل الاسترداد. أما كتل الاستدراك المعطّلة (enabled: false أو عدم وجود enabled: true) فقد أُحيلت إلى التقاعد؛ ويزيلها openclaw doctor --fix.
استكشاف الأخطاء وإصلاحها
تعذّر العثور على imsg أو RPC غير مدعوم
تحقّق من الملف الثنائي ودعم RPC:
imsg rpc --helpimsg status --jsonopenclaw channels status --probeإذا أفاد الفحص بأن RPC غير مدعوم، فحدّث imsg. إذا لم تكن إجراءات API الخاصة متاحة، فشغّل imsg launch في جلسة مستخدم macOS المسجّل دخوله وأعد الفحص. إذا لم يكن Gateway يعمل على macOS، فاستخدم إعداد جهاز Mac البعيد عبر SSH الوارد أعلاه بدلًا من مسار imsg المحلي الافتراضي.
تُرسل Messages لكن رسائل iMessage الواردة لا تصل
أثبت أولًا ما إذا كانت الرسالة قد وصلت إلى جهاز Mac المحلي. إذا لم يتغير chat.db، فلن يتمكن OpenClaw من استلام الرسالة حتى عندما يفيد imsg status --json بأن الجسر سليم.
imsg chats --limit 10 --jsonimsg watch --chat-id <chat-id> --jsonsqlite3 ~/Library/Messages/chat.db \"select datetime(max(date)/1000000000 + 978307200, 'unixepoch', 'localtime'), max(ROWID) from message;"إذا لم تنشئ الرسائل المرسلة من الهاتف صفوفًا جديدة، فأصلح طبقتَي Messages في macOS وApple Push قبل تغيير إعدادات OpenClaw. وغالبًا ما تكفي إعادة تنشيط الخدمات لمرة واحدة:
launchctl kickstart -k system/com.apple.apsdlaunchctl kickstart -k gui/$(id -u)/com.apple.CommCenterlaunchctl kickstart -k gui/$(id -u)/com.apple.identityservicesdlaunchctl kickstart -k gui/$(id -u)/com.apple.imagentimsg launchopenclaw gateway restartأرسل رسالة iMessage جديدة من الهاتف وتأكد من ظهور صف chat.db جديد أو حدث imsg watch قبل تصحيح أخطاء جلسات OpenClaw. لا تشغّل هذا كحلقة دورية لإعادة تشغيل الجسر؛ فقد تؤدي عمليات imsg launch المتكررة إلى جانب إعادة تشغيل Gateway أثناء العمل النشط إلى مقاطعة عمليات التسليم وترك عمليات القناة الجارية عالقة.
Gateway لا يعمل على macOS
يجب تشغيل cliPath: "imsg" الافتراضي على جهاز Mac المسجّل الدخول إلى Messages. على Linux أو Windows، اضبط channels.imessage.cliPath على برنامج نصي مغلّف يتصل بجهاز Mac هذا عبر SSH ويشغّل imsg "$@".
#!/usr/bin/env bashexec ssh -T messages-mac imsg "$@"ثم شغّل:
openclaw channels status --probe --channel imessageيتم تجاهل الرسائل المباشرة
تحقّق مما يلي:
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
أعِد التشغيل في طرفية ذات واجهة رسومية تفاعلية ضمن سياق المستخدم/الجلسة نفسه، ووافق على المطالبات:
imsg chats --limit 1imsg send <handle> "test"تأكّد من منح صلاحيتَي الوصول الكامل إلى القرص والأتمتة لسياق العملية الذي يشغّل OpenClaw/imsg.
مؤشرات مرجع الإعداد
ذو صلة
- نظرة عامة على القنوات — جميع القنوات المدعومة
- إزالة BlueBubbles ومسار iMessage عبر imsg — ملخص الإعلان والترحيل
- الانتقال من BlueBubbles — جدول تحويل الإعداد وخطوات الانتقال التفصيلية
- الإقران — مصادقة الرسائل المباشرة ومسار الإقران
- المجموعات — سلوك المحادثات الجماعية وتقييد الاستجابة بالإشارات
- توجيه القنوات — توجيه جلسات الرسائل
- الأمان — نموذج الوصول والتعزيز الأمني