iMessage (قديم: imsg)
موصى به: استخدم BlueBubbles لإعدادات iMessage الجديدة.
قناة imsg هي تكامل خارجي قديم عبر CLI وقد تتم إزالتها في إصدار مستقبلي.
الحالة: تكامل خارجي قديم عبر CLI. يقوم Gateway بتشغيل imsg rpc (JSON-RPC عبر stdio).
البدء السريع (للمبتدئين)
- تأكّد من تسجيل الدخول إلى Messages على هذا الـ Mac.
- ثبّت
imsg:brew install steipete/tap/imsg
- هيّئ OpenClaw باستخدام
channels.imessage.cliPathوchannels.imessage.dbPath. - ابدأ تشغيل Gateway ووافق على أي مطالبات من macOS (Automation + Full Disk Access).
ما هو
- قناة iMessage مدعومة بواسطة
imsgعلى macOS. - توجيه حتمي: تعود الردود دائمًا إلى iMessage.
- تشارك الرسائل الخاصة (DMs) جلسة الوكيل الرئيسية؛ بينما تكون المجموعات معزولة (
agent:<agentId>:imessage:group:<chat_id>). - إذا وصل خيط متعدد المشاركين مع
is_group=false، فلا يزال بإمكانك عزله عبرchat_idباستخدامchannels.imessage.groups(انظر «الخيوط الشبيهة بالمجموعات» أدناه).
كتابات التهيئة
افتراضيًا، يُسمح لـ iMessage بكتابة تحديثات التهيئة المُحفَّزة بواسطة/config set|unset (يتطلب commands.config: true).
للتعطيل:
المتطلبات
- macOS مع تسجيل الدخول إلى Messages.
- Full Disk Access لـ OpenClaw +
imsg(الوصول إلى قاعدة بيانات Messages). - إذن Automation عند الإرسال.
- يمكن أن يشير
channels.imessage.cliPathإلى أي أمر يوكّل stdin/stdout (على سبيل المثال، سكربت غلاف يتصل عبر SSH بجهاز Mac آخر ويشغّلimsg rpc).
استكشاف أخطاء خصوصية وأمان macOS TCC وإصلاحها
إذا فشل الإرسال/الاستقبال (على سبيل المثال، خروجimsg rpc بقيمة غير صفرية، أو انتهاء المهلة، أو ظهور Gateway وكأنه عالق)، فسبب شائع هو مطالبة أذونات macOS لم تتم الموافقة عليها.
يمنح macOS أذونات TCC لكل تطبيق/سياق عملية. وافق على المطالبات في السياق نفسه الذي يشغّل imsg (مثل Terminal/iTerm، أو جلسة LaunchAgent، أو عملية أُطلقت عبر SSH).
قائمة التحقق:
- Full Disk Access: اسمح بالوصول للعملية التي تشغّل OpenClaw (وأي غلاف shell/SSH ينفّذ
imsg). هذا مطلوب لقراءة قاعدة بيانات Messages (chat.db). - Automation → Messages: اسمح للعملية التي تشغّل OpenClaw (و/أو الطرفية لديك) بالتحكم في Messages.app للإرسال الصادر.
- سلامة CLI لـ
imsg: تحقّق من تثبيتimsgودعمه لـ RPC (imsg rpc --help).
الإعداد (المسار السريع)
- تأكّد من تسجيل الدخول إلى Messages على هذا الـ Mac.
- هيّئ iMessage وابدأ تشغيل Gateway.
مستخدم macOS مخصّص للبوت (لهوية معزولة)
إذا أردت أن يرسل البوت من هوية iMessage منفصلة (وإبقاء Messages الشخصية نظيفة)، فاستخدم Apple ID مخصّصًا + مستخدم macOS مخصّصًا.- أنشئ Apple ID مخصّصًا (مثال:
[email protected]).- قد تطلب Apple رقم هاتف للتحقق/المصادقة الثنائية.
- أنشئ مستخدم macOS (مثال:
openclawhome) وسجّل الدخول إليه. - افتح Messages ضمن مستخدم macOS هذا وسجّل الدخول إلى iMessage باستخدام Apple ID الخاص بالبوت.
- فعّل Remote Login (إعدادات النظام → عام → المشاركة → Remote Login).
- ثبّت
imsg:brew install steipete/tap/imsg
- اضبط SSH بحيث يعمل
ssh <bot-macos-user>@localhost trueدون كلمة مرور. - وجّه
channels.imessage.accounts.bot.cliPathإلى غلاف SSH يشغّلimsgكمستخدم البوت.
imsg rpc عالقًا أو خرج، فسجّل الدخول إلى ذلك المستخدم (يساعد Screen Sharing)، وشغّل أمرًا لمرة واحدة imsg chats --limit 1 / imsg send ...، ووافق على المطالبات، ثم أعد المحاولة. راجع استكشاف أخطاء خصوصية وأمان macOS TCC وإصلاحها.
غلاف مثال (chmod +x). استبدل <bot-macos-user> باسم مستخدم macOS الفعلي لديك:
channels.imessage.cliPath، channels.imessage.dbPath) بدل خريطة accounts.
متغير عن بُعد/SSH (اختياري)
إذا أردت iMessage على Mac آخر، فاضبطchannels.imessage.cliPath على غلاف يشغّل imsg على مضيف macOS البعيد عبر SSH. يحتاج OpenClaw فقط إلى stdio.
غلاف مثال:
cliPath إلى مضيف بعيد عبر SSH، فإن مسارات المرفقات في قاعدة بيانات Messages تشير إلى ملفات على الجهاز البعيد. يمكن لـ OpenClaw جلبها تلقائيًا عبر SCP بتعيين channels.imessage.remoteHost:
remoteHost، يحاول OpenClaw اكتشافه تلقائيًا عبر تحليل أمر SSH في سكربت الغلاف لديك. يُنصَح بالتهيئة الصريحة للموثوقية.
Mac بعيد عبر Tailscale (مثال)
إذا كان Gateway يعمل على مضيف/آلة افتراضية Linux لكن يجب أن يعمل iMessage على Mac، فإن Tailscale هو الجسر الأبسط: يتواصل Gateway مع الـ Mac عبر tailnet، ويشغّلimsg عبر SSH، ويجلب المرفقات عبر SCP.
البنية:
مثال تهيئة عملي (اسم مضيف Tailscale):
~/.openclaw/scripts/imsg-ssh):
- تأكّد من تسجيل الدخول إلى Messages على الـ Mac، وتمكين Remote Login.
- استخدم مفاتيح SSH لكي يعمل
ssh [email protected]دون مطالبات. - يجب أن يطابق
remoteHostهدف SSH حتى يتمكن SCP من جلب المرفقات.
channels.imessage.accounts مع تهيئة لكل حساب وname اختياري. راجع gateway/configuration للنمط المشترك. لا تُدرج ~/.openclaw/openclaw.json في المستودع (غالبًا ما يحتوي على رموز).
التحكم في الوصول (الرسائل الخاصة + المجموعات)
DMs:- الافتراضي:
channels.imessage.dmPolicy = "pairing". - يتلقى المرسلون غير المعروفين رمز اقتران؛ تُتجاهل الرسائل حتى تتم الموافقة (تنتهي صلاحية الرموز بعد ساعة واحدة).
- الموافقة عبر:
openclaw pairing list imessageopenclaw pairing approve imessage <CODE>
- الاقتران هو تبادل الرموز الافتراضي لرسائل iMessage الخاصة. التفاصيل: الاقتران
channels.imessage.groupPolicy = open | allowlist | disabled.- يتحكم
channels.imessage.groupAllowFromبمن يمكنه الإطلاق في المجموعات عند تعيينallowlist. - يعتمد تقييد الذِكر على
agents.list[].groupChat.mentionPatterns(أوmessages.groupChat.mentionPatterns) لأن iMessage لا يملك بيانات وصفية أصلية للذِكر. - تجاوز متعدد الوكلاء: عيّن أنماطًا لكل وكيل على
agents.list[].groupChat.mentionPatterns.
كيف يعمل (السلوك)
- يقوم
imsgببث أحداث الرسائل؛ ويقوم Gateway بتوحيدها ضمن غلاف القناة المشترك. - تُوجَّه الردود دائمًا إلى المعرّف نفسه للمحادثة أو المقبض.
الخيوط الشبيهة بالمجموعات (is_group=false)
قد تحتوي بعض خيوط iMessage على عدة مشاركين لكنها تصل مع is_group=false اعتمادًا على كيفية تخزين Messages لمعرّف الدردشة.
إذا قمت بتهيئة chat_id صراحةً ضمن channels.imessage.groups، فسيتعامل OpenClaw مع ذلك الخيط باعتباره «مجموعة» من أجل:
- عزل الجلسات (مفتاح جلسة
agent:<agentId>:imessage:group:<chat_id>منفصل) - سلوك قوائم السماح للمجموعات / تقييد الذِكر
الوسائط + الحدود
- استيعاب اختياري للمرفقات عبر
channels.imessage.includeAttachments. - حد الوسائط عبر
channels.imessage.mediaMaxMb.
الحدود
- يُجزَّأ النص الصادر إلى
channels.imessage.textChunkLimit(الافتراضي 4000). - تجزئة اختيارية حسب الأسطر الجديدة: عيّن
channels.imessage.chunkMode="newline"للتقسيم عند الأسطر الفارغة (حدود الفقرات) قبل التجزئة حسب الطول. - تُقيَّد تحميلات الوسائط بواسطة
channels.imessage.mediaMaxMb(الافتراضي 16).
العنونة / أهداف التسليم
فضّلchat_id للتوجيه المستقر:
chat_id:123(المفضّل)chat_guid:...chat_identifier:...- مقابض مباشرة:
imessage:+1555/sms:+1555/[email protected]
مرجع التهيئة (iMessage)
التهيئة الكاملة: التهيئة خيارات الموفّر:channels.imessage.enabled: تمكين/تعطيل بدء القناة.channels.imessage.cliPath: مسارimsg.channels.imessage.dbPath: مسار قاعدة بيانات Messages.channels.imessage.remoteHost: مضيف SSH لنقل مرفقات SCP عندما يشيرcliPathإلى Mac بعيد (مثلuser@gateway-host). يتم الاكتشاف تلقائيًا من غلاف SSH إذا لم يُضبط.channels.imessage.service:imessage | sms | auto.channels.imessage.region: منطقة SMS.channels.imessage.dmPolicy:pairing | allowlist | open | disabled(الافتراضي: الاقتران).channels.imessage.allowFrom: قائمة السماح للرسائل الخاصة (مقابض، بريد إلكتروني، أرقام E.164، أوchat_id:*). يتطلبopen"*". لا يملك iMessage أسماء مستخدمين؛ استخدم المقابض أو أهداف الدردشة.channels.imessage.groupPolicy:open | allowlist | disabled(الافتراضي: قائمة السماح).channels.imessage.groupAllowFrom: قائمة سماح مرسلي المجموعات.channels.imessage.historyLimit/channels.imessage.accounts.*.historyLimit: الحد الأقصى لرسائل المجموعات المُضمَّنة كسياق (0 يعطّل).channels.imessage.dmHistoryLimit: حد سجل الرسائل الخاصة بوحدات أدوار المستخدم. تجاوزات لكل مستخدم:channels.imessage.dms["<handle>"].historyLimit.channels.imessage.groups: افتراضيات لكل مجموعة + قائمة السماح (استخدم"*"للافتراضيات العامة).channels.imessage.includeAttachments: استيعاب المرفقات ضمن السياق.channels.imessage.mediaMaxMb: حد الوسائط الواردة/الصادرة (ميغابايت).channels.imessage.textChunkLimit: حجم تجزئة الإرسال (محارف).channels.imessage.chunkMode:length(الافتراضي) أوnewlineللتقسيم عند الأسطر الفارغة (حدود الفقرات) قبل التجزئة حسب الطول.
agents.list[].groupChat.mentionPatterns(أوmessages.groupChat.mentionPatterns).messages.responsePrefix.