Nodes and media
التقاط الصور بالكاميرا
يدعم OpenClaw التقاط الصور بالكاميرا لسير عمل الوكيل على عُقد iOS وAndroid وmacOS وLinux المقترنة: التقاط صورة (jpg) أو مقطع فيديو قصير (mp4، مع صوت اختياري) عبر node.invoke في Gateway.
يخضع كل وصول إلى الكاميرا لإعداد يتحكم فيه المستخدم على كل منصة.
عقدة iOS
إعداد المستخدم في iOS
- علامة تبويب iOS Settings → Camera → Allow Camera (
camera.enabled).- الإعداد الافتراضي: مفعّل (يُعامل المفتاح المفقود على أنه مفعّل).
- عند إيقافه: تُرجع أوامر
camera.*القيمةCAMERA_DISABLED.
أوامر iOS (عبر node.invoke في Gateway)
-
camera.list- حمولة الاستجابة:
devices— مصفوفة من{ id, name, position, deviceType }.
- حمولة الاستجابة:
-
camera.snap- المعاملات:
facing: front|back(الافتراضي:front)maxWidth: رقم (اختياري؛ الافتراضي1600)quality: 0..1(اختياري؛ الافتراضي0.9، ويُقيّد إلى[0.05, 1.0])format: حاليًاjpgdelayMs: رقم (اختياري؛ الافتراضي0، ويُحد داخليًا عند10000)deviceId: سلسلة نصية (اختياري؛ منcamera.list)
- حمولة الاستجابة:
format: "jpg"، وbase64، وwidth، وheight. - حاجز الحمولة: يُعاد ضغط الصور لإبقاء الحمولة المرمّزة باستخدام base64 دون 5MB.
- المعاملات:
-
camera.clip- المعاملات:
facing: front|back(الافتراضي:front)durationMs: رقم (الافتراضي3000، ويُقيّد إلى[250, 60000])includeAudio: قيمة منطقية (الافتراضيtrue)format: حاليًاmp4deviceId: سلسلة نصية (اختياري؛ منcamera.list)
- حمولة الاستجابة:
format: "mp4"، وbase64، وdurationMs، وhasAudio.
- المعاملات:
متطلب وجود iOS في المقدمة
مثل canvas.*، لا تسمح عقدة iOS بأوامر camera.* إلا في المقدمة. تُرجع الاستدعاءات في الخلفية NODE_BACKGROUND_UNAVAILABLE.
أداة CLI المساعدة
أسهل طريقة للحصول على ملفات الوسائط هي استخدام أداة CLI المساعدة، التي تكتب الوسائط المفككة الترميز إلى ملف مؤقت وتطبع المسار المحفوظ.
openclaw nodes camera snap --node <id> # الافتراضي: الأمامية والخلفية معًا (سطران MEDIA)openclaw nodes camera snap --node <id> --facing frontopenclaw nodes camera clip --node <id> --duration 3000openclaw nodes camera clip --node <id> --no-audioالقيمة الافتراضية لـ nodes camera snap هي --facing both، ما يلتقط من الكاميرتين الأمامية والخلفية لمنح الوكيل كلا المنظورين؛ مرّر --device-id مع اتجاه واحد محدد صراحةً (يُرفض both عند تعيين --device-id). تكون ملفات الإخراج مؤقتة (في دليل الملفات المؤقتة لنظام التشغيل) ما لم تنشئ غلافك الخاص.
عقدة Android
إعداد المستخدم في Android
- لوحة Android Settings → Camera → Allow Camera (
camera.enabled).- تكون القيمة الافتراضية للتثبيتات الجديدة هي الإيقاف. تُرحّل التثبيتات الحالية التي تسبق هذا الإعداد إلى التشغيل كي لا تفقد الترقيات بصمت إمكانية الوصول إلى الكاميرا التي كانت تعمل سابقًا.
- عند إيقافه: تُرجع أوامر
camera.*القيمةCAMERA_DISABLED: enable Camera in Settings.
الأذونات
- يلزم
CAMERAلكل منcamera.snapوcamera.clip؛ ويؤدي غياب الإذن أو رفضه إلى إرجاعCAMERA_PERMISSION_REQUIRED. - يلزم
RECORD_AUDIOلـcamera.clipعندما تكون قيمةincludeAudioهيtrue؛ ويؤدي غياب الإذن أو رفضه إلى إرجاعMIC_PERMISSION_REQUIRED.
يطالب التطبيق بأذونات وقت التشغيل متى أمكن ذلك.
متطلب وجود Android في المقدمة
مثل canvas.*، لا تسمح عقدة Android بأوامر camera.* إلا في المقدمة. تُرجع الاستدعاءات في الخلفية NODE_BACKGROUND_UNAVAILABLE: command requires foreground.
أوامر Android (عبر node.invoke في Gateway)
-
camera.list- حمولة الاستجابة:
devices— مصفوفة من{ id, name, position, deviceType }.
- حمولة الاستجابة:
-
camera.snap- المعاملات:
facing (front|back، الافتراضيfront)، وquality(الافتراضي0.95، ويُقيّد إلى[0.1, 1.0])، وmaxWidth(الافتراضي1600)، وdeviceId(اختياري؛ يؤدي المعرّف غير المعروف إلى الفشل معINVALID_REQUEST). - حمولة الاستجابة:
format: "jpg"، وbase64، وwidth، وheight. - حاجز الحمولة: يُعاد الضغط لإبقاء base64 دون 5MB (الميزانية نفسها المستخدمة في iOS).
- المعاملات:
-
camera.clip- المعاملات:
facing(الافتراضيfront)، وdurationMs(الافتراضي3000، ويُقيّد إلى[200, 60000])، وincludeAudio(الافتراضيtrue)، وdeviceId(اختياري). - حمولة الاستجابة:
format: "mp4"، وbase64، وdurationMs، وhasAudio. - حاجز الحمولة: يُحد حجم ملف MP4 الخام عند 18MB قبل ترميز base64؛ وتفشل المقاطع التي تتجاوز الحد مع
PAYLOAD_TOO_LARGE(قلّلdurationMsوأعد المحاولة).
- المعاملات:
تطبيق macOS
إعداد المستخدم في macOS
يعرض تطبيق macOS المصاحب مربع اختيار:
- Settings → General → Allow Camera (
openclaw.cameraEnabled).- الإعداد الافتراضي: إيقاف.
- عند إيقافه: تُرجع طلبات الكاميرا
CAMERA_DISABLED: enable Camera in Settings.
أداة CLI المساعدة (استدعاء العقدة)
استخدم CLI الرئيسي openclaw لاستدعاء أوامر الكاميرا على عقدة macOS.
openclaw nodes camera list --node <id> # يسرد معرّفات الكاميراopenclaw nodes camera snap --node <id> # يطبع المسار المحفوظopenclaw nodes camera snap --node <id> --max-width 1280openclaw nodes camera snap --node <id> --delay-ms 2000openclaw nodes camera snap --node <id> --device-id <id>openclaw nodes camera clip --node <id> --duration 10s # يطبع المسار المحفوظopenclaw nodes camera clip --node <id> --duration-ms 3000 # يطبع المسار المحفوظ (علامة قديمة)openclaw nodes camera clip --node <id> --device-id <id>openclaw nodes camera clip --node <id> --no-audio- تكون القيمة الافتراضية لـ
openclaw nodes camera snapهيmaxWidth=1600ما لم تُستبدل. - ينتظر
camera.snapمدةdelayMs(الافتراضي 2000ms، ويُقيّد إلى[0, 10000]) بعد استقرار الإحماء/التعريض قبل الالتقاط. - يُعاد ضغط حمولات الصور لإبقاء base64 دون 5MB.
مضيف عقدة Linux
يضيف Plugin عقدة Linux المضمّن إمكانية التقاط الكاميرا إلى خدمة openclaw node في CLI. ويعمل على مضيف بلا واجهة رسومية ولا يتطلب تطبيق سطح مكتب Linux.
يكون الوصول إلى الكاميرا معطّلًا افتراضيًا. فعّله ضمن إدخال Plugin، ثم أعد تشغيل خدمة العقدة لكي يُعاد إنشاء إعلانها في Gateway:
{ plugins: { entries: { "linux-node": { config: { camera: { enabled: true }, }, }, }, },}المتطلبات:
- FFmpeg مع إدخال V4L2، و
libx264، ودعم AAC - جهاز
/dev/video*يمكن لمستخدم خدمة العقدة قراءته؛ وفي التوزيعات الشائعة، أضف ذلك المستخدم إلى مجموعةvideo - للمقاطع ذات الإعداد الافتراضي
includeAudio: true، يلزم خادم PulseAudio يعمل أو طبقة توافق PipeWire مع PulseAudio تتضمن مصدرًا افتراضيًا
يعيد Linux مسارات أجهزة V4L2 القابلة للالتقاط والقراءة من camera.list؛ ويفحص FFmpeg كل مرشح /dev/video* ويستبعد عُقد البيانات الوصفية أو عُقد الإخراج فقط. يكون position للجهاز هو unknown، لذلك تنتج طلبات الاتجاه التي لا تتضمن deviceId صورة أو مقطعًا واحدًا بالموضع unknown بدلًا من الادعاء بأنها كاميرا أمامية أو خلفية. استخدم deviceId عندما يحتوي المضيف على عدة كاميرات. يستخدم camera.snap إحماء إدخال FFmpeg لمدة delayMs ويحافظ على نسبة العرض إلى الارتفاع مع تقييد العرض. يسجل camera.clip صوت الميكروفون بصفته مسار الصوت في MP4؛ ولا يعرض OpenClaw عمدًا أي أمر مستقل للميكروفون.
يستخدم Plugin الترميز libx264 لفيديو MP4 ولا يغيّر برامج الترميز بصمت. يُرجع إصدار FFmpeg الذي يفتقر إلى الإدخال أو برامج الترميز المطلوبة CAMERA_UNAVAILABLE. تفشل الصور والمقاطع التي ستتجاوز ميزانية حمولة base64 البالغة 25MB مع PAYLOAD_TOO_LARGE.
يظل camera.snap وcamera.clip أمرين خطيرين. أضفهما إلى gateway.nodes.allowCommands فقط عندما تنوي تسليح الالتقاط؛ فتفعيل Plugin وحده لا يتجاوز سياسة Gateway.
السلامة والحدود العملية
- يؤدي الوصول إلى الكاميرا والميكروفون إلى تشغيل مطالبات الأذونات المعتادة لنظام التشغيل (ويتطلب سلاسل الاستخدام في
Info.plist). - تُحد مقاطع الفيديو عند 60s لتجنب حمولات العقدة كبيرة الحجم (الحمل الإضافي لـ base64 إضافةً إلى حدود الرسائل).
فيديو شاشة macOS (على مستوى نظام التشغيل)
لفيديو الشاشة (وليس الكاميرا)، استخدم تطبيق macOS المصاحب:
openclaw nodes screen record --node <id> --duration 10s --fps 15 # يطبع المسار المحفوظيتطلب إذن Screen Recording في macOS (TCC).