الحالة: تكامل CLI خارجي. يتواصل Gateway معDocumentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
signal-cli عبر HTTP — إما daemon أصلي (JSON-RPC + SSE) أو حاوية bbernhard/signal-cli-rest-api (REST + WebSocket).
المتطلبات الأساسية
- تثبيت OpenClaw على خادمك (مسار Linux أدناه مختبر على Ubuntu 24).
- أحد الخيارين:
- توفر
signal-cliعلى المضيف (الوضع الأصلي)، أو - حاوية Docker باسم
bbernhard/signal-cli-rest-api(وضع الحاوية).
- توفر
- رقم هاتف يمكنه استقبال رسالة SMS واحدة للتحقق (لمسار التسجيل عبر SMS).
- وصول عبر المتصفح إلى اختبار captcha الخاص بـ Signal (
signalcaptchas.org) أثناء التسجيل.
الإعداد السريع (للمبتدئين)
- استخدم رقم Signal منفصلا للبوت (موصى به).
- ثبّت
signal-cli(يتطلب Java إذا كنت تستخدم إصدار JVM). - اختر مسار إعداد واحدا:
- المسار A (ربط QR):
signal-cli link -n "OpenClaw"ثم امسح الرمز باستخدام Signal. - المسار B (تسجيل SMS): سجّل رقما مخصصا باستخدام captcha + تحقق SMS.
- المسار A (ربط QR):
- اضبط OpenClaw وأعد تشغيل Gateway.
- أرسل رسالة مباشرة أولى ووافق على الاقتران (
openclaw pairing approve signal <CODE>).
| الحقل | الوصف |
|---|---|
account | رقم هاتف البوت بصيغة E.164 (+15551234567) |
cliPath | المسار إلى signal-cli (signal-cli إذا كان ضمن PATH) |
dmPolicy | سياسة وصول الرسائل المباشرة (يوصى بـ pairing) |
allowFrom | أرقام الهاتف أو قيم uuid:<id> المسموح لها بإرسال رسائل مباشرة |
ما هو
- قناة Signal عبر
signal-cli(وليست libsignal مضمّنة). - توجيه حتمي: تعود الردود دائما إلى Signal.
- تشارك الرسائل المباشرة الجلسة الرئيسية للوكيل؛ أما المجموعات فمعزولة (
agent:<agentId>:signal:group:<groupId>).
عمليات كتابة الإعدادات
افتراضيا، يُسمح لـ Signal بكتابة تحديثات الإعدادات التي يطلقها/config set|unset (يتطلب commands.config: true).
عطّل ذلك باستخدام:
نموذج الرقم (مهم)
- يتصل Gateway بـ جهاز Signal (حساب
signal-cli). - إذا شغّلت البوت على حساب Signal الشخصي لديك، فسيتجاهل رسائلك أنت (حماية من الحلقات).
- من أجل “أراسل البوت فيرد”، استخدم رقم بوت منفصلا.
مسار الإعداد A: ربط حساب Signal موجود (QR)
- ثبّت
signal-cli(إصدار JVM أو الإصدار الأصلي). - اربط حساب بوت:
signal-cli link -n "OpenClaw"ثم امسح رمز QR في Signal.
- اضبط Signal وابدأ Gateway.
channels.signal.accounts مع إعداد لكل حساب وname اختياري. راجع gateway/configuration للنمط المشترك.
مسار الإعداد B: تسجيل رقم بوت مخصص (SMS، Linux)
استخدم هذا عندما تريد رقم بوت مخصصا بدلا من ربط حساب تطبيق Signal موجود.- احصل على رقم يمكنه استقبال SMS (أو تحقق صوتي للخطوط الأرضية).
- استخدم رقم بوت مخصصا لتجنب تعارضات الحساب/الجلسة.
- ثبّت
signal-cliعلى مضيف Gateway:
signal-cli-${VERSION}.tar.gz)، فثبّت JRE 25+ أولا.
حافظ على تحديث signal-cli؛ يذكر المنبع أن الإصدارات القديمة قد تتعطل مع تغير واجهات API لخادم Signal.
- سجّل الرقم وتحقق منه:
- افتح
https://signalcaptchas.org/registration/generate.html. - أكمل captcha، وانسخ هدف رابط
signalcaptcha://...من “فتح Signal”. - شغّل من عنوان IP الخارجي نفسه لجلسة المتصفح عندما يكون ذلك ممكنا.
- شغّل التسجيل مرة أخرى فورا (تنتهي صلاحية رموز captcha بسرعة):
- اضبط OpenClaw، وأعد تشغيل Gateway، وتحقق من القناة:
- اقرن مرسل رسائلك المباشرة:
- أرسل أي رسالة إلى رقم البوت.
- وافق على الرمز على الخادم:
openclaw pairing approve signal <PAIRING_CODE>. - احفظ رقم البوت كجهة اتصال على هاتفك لتجنب “جهة اتصال غير معروفة”.
- README لـ
signal-cli:https://github.com/AsamK/signal-cli - تدفق captcha:
https://github.com/AsamK/signal-cli/wiki/Registration-with-captcha - تدفق الربط:
https://github.com/AsamK/signal-cli/wiki/Linking-other-devices-(Provisioning)
وضع daemon الخارجي (httpUrl)
إذا كنت تريد إدارةsignal-cli بنفسك (بدء JVM البارد البطيء، أو تهيئة الحاوية، أو وحدات CPU مشتركة)، فشغّل daemon بشكل منفصل ووجّه OpenClaw إليه:
channels.signal.startupTimeoutMs.
وضع الحاوية (bbernhard/signal-cli-rest-api)
بدلا من تشغيلsignal-cli محليا، يمكنك استخدام حاوية Docker bbernhard/signal-cli-rest-api. تغلف هذه الحاوية signal-cli خلف واجهة REST API وواجهة WebSocket.
المتطلبات:
- يجب تشغيل الحاوية مع
MODE=json-rpcلاستقبال الرسائل في الوقت الحقيقي. - سجّل حساب Signal أو اربطه داخل الحاوية قبل توصيل OpenClaw.
docker-compose.yml:
apiMode في البروتوكول الذي يستخدمه OpenClaw:
| القيمة | السلوك |
|---|---|
"auto" | (الافتراضي) يفحص كلا النقلين؛ يتحقق البث من استقبال WebSocket في الحاوية |
"native" | يفرض signal-cli الأصلي (JSON-RPC عند /api/v1/rpc، وSSE عند /api/v1/events) |
"container" | يفرض حاوية bbernhard (REST عند /v2/send، وWebSocket عند /v1/receive/{account}) |
apiMode هي "auto"، يخزن OpenClaw الوضع المكتشف مؤقتا لمدة 30 ثانية لتجنب الفحوصات المتكررة. لا يتم اختيار استقبال الحاوية للبث إلا بعد ترقية /v1/receive/{account} إلى WebSocket، وهذا يتطلب MODE=json-rpc.
يدعم وضع الحاوية عمليات قناة Signal نفسها مثل الوضع الأصلي حيث تعرض الحاوية واجهات API مطابقة: الإرسال، والاستقبال، والمرفقات، ومؤشرات الكتابة، وإيصالات القراءة/العرض، والتفاعلات، والمجموعات، والنص المنسق. يترجم OpenClaw استدعاءات Signal RPC الأصلية الخاصة به إلى حمولات REST الخاصة بالحاوية، بما في ذلك معرفات المجموعات group.{base64(internal_id)} وtext_mode: "styled" للنص المنسق.
ملاحظات تشغيلية:
- استخدم
autoStart: falseمع وضع الحاوية. يجب ألا يشغّل OpenClaw daemon أصليا عند اختيارapiMode: "container". - استخدم
MODE=json-rpcللاستقبال. قد يجعلMODE=normalالمسار/v1/aboutيبدو سليما، لكن/v1/receive/{account}لا يترقى إلى WebSocket، لذلك لن يختار OpenClaw بث استقبال الحاوية في وضعauto. - اضبط
apiMode: "container"عندما تعرف أنhttpUrlيشير إلى REST API الخاصة بـ bbernhard. اضبطapiMode: "native"عندما تعرف أنه يشير إلى JSON-RPC/SSE الأصلي لـsignal-cli. استخدم"auto"عندما قد يختلف النشر. - تحترم تنزيلات مرفقات الحاوية حدود بايت الوسائط نفسها كما في الوضع الأصلي. تُرفض الاستجابات كبيرة الحجم قبل تخزينها بالكامل في الذاكرة عندما يرسل الخادم
Content-Length، وإلا فسيتم رفضها أثناء البث.
التحكم في الوصول (الرسائل المباشرة + المجموعات)
الرسائل المباشرة:- الافتراضي:
channels.signal.dmPolicy = "pairing". - يتلقى المرسلون غير المعروفين رمز اقتران؛ يتم تجاهل الرسائل حتى تتم الموافقة (تنتهي صلاحية الرموز بعد ساعة واحدة).
- وافق عبر:
openclaw pairing list signalopenclaw pairing approve signal <CODE>
- الاقتران هو تبادل الرمز الافتراضي لرسائل Signal المباشرة. التفاصيل: الاقتران
- يتم تخزين المرسلين ذوي UUID فقط (من
sourceUuid) بصيغةuuid:<id>فيchannels.signal.allowFrom.
channels.signal.groupPolicy = open | allowlist | disabled.- يتحكم
channels.signal.groupAllowFromفي المجموعات أو المرسلين الذين يمكنهم تشغيل ردود المجموعة عند تعيينallowlist؛ يمكن أن تكون الإدخالات معرفات مجموعات Signal (خام، أوgroup:<id>، أوsignal:group:<id>)، أو أرقام هواتف المرسلين، أو قيمuuid:<id>، أو*. - يمكن أن يتجاوز
channels.signal.groups["<group-id>" | "*"]سلوك المجموعة باستخدامrequireMentionوtoolsوtoolsBySender. - استخدم
channels.signal.accounts.<id>.groupsللتجاوزات لكل حساب في إعدادات متعددة الحسابات. - لا يؤدي إدراج مجموعة Signal في قائمة السماح عبر
groupAllowFromإلى تعطيل بوابة الإشارة بحد ذاته. يعالج إدخالchannels.signal.groups["<group-id>"]المهيأ تحديدا كل رسالة مجموعة ما لم يتم تعيينrequireMention=true. - ملاحظة وقت التشغيل: إذا كان
channels.signalمفقودا بالكامل، يعود وقت التشغيل إلىgroupPolicy="allowlist"لفحوصات المجموعات (حتى إذا تم تعيينchannels.defaults.groupPolicy).
كيف يعمل (السلوك)
- الوضع الأصلي: يعمل
signal-cliكـ daemon؛ يقرأ Gateway الأحداث عبر SSE. - وضع الحاوية: يرسل Gateway عبر REST API ويستقبل عبر WebSocket.
- تتم تسوية الرسائل الواردة إلى غلاف القناة المشترك.
- تعود الردود دائما إلى الرقم أو المجموعة نفسها.
الوسائط + الحدود
- يتم تقسيم النص الصادر إلى
channels.signal.textChunkLimit(الافتراضي 4000). - التقسيم الاختياري على الأسطر الجديدة: اضبط
channels.signal.chunkMode="newline"للتقسيم عند الأسطر الفارغة (حدود الفقرات) قبل التقسيم حسب الطول. - المرفقات مدعومة (يتم جلب base64 من
signal-cli). - تستخدم مرفقات الملاحظات الصوتية اسم ملف
signal-cliكبديل MIME عندما يكونcontentTypeمفقودا، بحيث يظل بإمكان نسخ الصوت تصنيف مذكرات AAC الصوتية. - حد الوسائط الافتراضي:
channels.signal.mediaMaxMb(الافتراضي 8). - استخدم
channels.signal.ignoreAttachmentsلتخطي تنزيل الوسائط. - يستخدم سياق سجل المجموعة
channels.signal.historyLimit(أوchannels.signal.accounts.*.historyLimit)، مع الرجوع إلىmessages.groupChat.historyLimit. عيّن0للتعطيل (الافتراضي 50).
مؤشرات الكتابة + إيصالات القراءة
- مؤشرات الكتابة: يرسل OpenClaw إشارات الكتابة عبر
signal-cli sendTypingويحدثها أثناء تشغيل الرد. - إيصالات القراءة: عندما تكون
channels.signal.sendReadReceiptsصحيحة، يمرر OpenClaw إيصالات القراءة للرسائل المباشرة المسموح بها. - لا يعرض signal-cli إيصالات القراءة للمجموعات.
التفاعلات (أداة الرسائل)
- استخدم
message action=reactمعchannel=signal. - الأهداف: رقم E.164 للمرسِل أو UUID (استخدم
uuid:<id>من مخرجات الاقتران؛ يعمل UUID المجرد أيضًا). messageIdهو طابع Signal الزمني للرسالة التي تتفاعل معها.- تتطلب تفاعلات المجموعات
targetAuthorأوtargetAuthorUuid.
channels.signal.actions.reactions: تفعيل/تعطيل إجراءات التفاعل (الافتراضي true).channels.signal.reactionLevel:off | ack | minimal | extensive.- يعطّل
off/ackتفاعلات الوكيل (ستُرجع أداة الرسائلreactخطأ). - يفعّل
minimal/extensiveتفاعلات الوكيل ويضبط مستوى الإرشاد.
- يعطّل
- تجاوزات لكل حساب:
channels.signal.accounts.<id>.actions.reactions،channels.signal.accounts.<id>.reactionLevel.
أهداف التسليم (CLI/Cron)
- الرسائل المباشرة:
signal:+15551234567(أو E.164 عادي). - الرسائل المباشرة عبر UUID:
uuid:<id>(أو UUID مجرد). - المجموعات:
signal:group:<groupId>. - أسماء المستخدمين:
username:<name>(إذا كان حساب Signal الخاص بك يدعم ذلك).
استكشاف الأخطاء وإصلاحها
شغّل هذا التسلسل أولًا:- يمكن الوصول إلى الخدمة الخفية لكن لا توجد ردود: تحقق من إعدادات الحساب/الخدمة الخفية (
httpUrl،account) ووضع الاستلام. - يتم تجاهل الرسائل المباشرة: المرسِل ينتظر موافقة الاقتران.
- يتم تجاهل رسائل المجموعات: بوابة مرسِل المجموعة/الإشارة تمنع التسليم.
- أخطاء التحقق من الإعدادات بعد التعديلات: شغّل
openclaw doctor --fix. - Signal غير موجود في التشخيصات: تأكد من
channels.signal.enabled: true.
ملاحظات الأمان
- يخزّن
signal-cliمفاتيح الحساب محليًا (عادةً في~/.local/share/signal-cli/data/). - انسخ حالة حساب Signal احتياطيًا قبل ترحيل الخادم أو إعادة بنائه.
- أبقِ
channels.signal.dmPolicy: "pairing"ما لم تكن تريد صراحةً وصولًا أوسع إلى الرسائل المباشرة. - التحقق عبر SMS مطلوب فقط لتدفقات التسجيل أو الاسترداد، لكن فقدان التحكم في الرقم/الحساب يمكن أن يعقّد إعادة التسجيل.
مرجع الإعدادات (Signal)
الإعداد الكامل: الإعدادات خيارات المزوّد:channels.signal.enabled: تفعيل/تعطيل بدء تشغيل القناة.channels.signal.apiMode:auto | native | container(الافتراضي: auto). راجع وضع الحاوية.channels.signal.account: E.164 لحساب الروبوت.channels.signal.cliPath: المسار إلىsignal-cli.channels.signal.httpUrl: عنوان URL الكامل للخدمة الخفية (يتجاوز المضيف/المنفذ).channels.signal.httpHost،channels.signal.httpPort: ربط الخدمة الخفية (الافتراضي 127.0.0.1:8080).channels.signal.autoStart: تشغيل الخدمة الخفية تلقائيًا (الافتراضي true إذا لم تُضبطhttpUrl).channels.signal.startupTimeoutMs: مهلة انتظار بدء التشغيل بالمللي ثانية (الحد الأقصى 120000).channels.signal.receiveMode:on-start | manual.channels.signal.ignoreAttachments: تخطي تنزيلات المرفقات.channels.signal.ignoreStories: تجاهل القصص من الخدمة الخفية.channels.signal.sendReadReceipts: تمرير إيصالات القراءة.channels.signal.dmPolicy:pairing | allowlist | open | disabled(الافتراضي: pairing).channels.signal.allowFrom: قائمة السماح للرسائل المباشرة (E.164 أوuuid:<id>). يتطلبopenالقيمة"*". لا يحتوي Signal على أسماء مستخدمين؛ استخدم معرّفات الهاتف/UUID.channels.signal.groupPolicy:open | allowlist | disabled(الافتراضي: allowlist).channels.signal.groupAllowFrom: قائمة السماح للمجموعات؛ تقبل معرّفات مجموعات Signal (خام، أوgroup:<id>، أوsignal:group:<id>)، أو أرقام E.164 للمرسلين، أو قيمuuid:<id>.channels.signal.groups: تجاوزات لكل مجموعة مفهرسة بمعرّف مجموعة Signal (أو"*"). الحقول المدعومة:requireMention،tools،toolsBySender.channels.signal.accounts.<id>.groups: نسخة لكل حساب منchannels.signal.groupsلإعدادات متعددة الحسابات.channels.signal.historyLimit: الحد الأقصى لرسائل المجموعة التي تُضمَّن كسياق (0 يعطّل ذلك).channels.signal.dmHistoryLimit: حد سجل الرسائل المباشرة في أدوار المستخدم. تجاوزات لكل مستخدم:channels.signal.dms["<phone_or_uuid>"].historyLimit.channels.signal.textChunkLimit: حجم الجزء الصادر (بالأحرف).channels.signal.chunkMode:length(الافتراضي) أوnewlineللتقسيم عند الأسطر الفارغة (حدود الفقرات) قبل التقسيم حسب الطول.channels.signal.mediaMaxMb: حد الوسائط الواردة/الصادرة (MB).
agents.list[].groupChat.mentionPatterns(لا يدعم Signal الإشارات الأصلية).messages.groupChat.mentionPatterns(احتياطي عام).messages.responsePrefix.
ذات صلة
- نظرة عامة على القنوات — كل القنوات المدعومة
- الاقتران — مصادقة الرسائل المباشرة وتدفق الاقتران
- المجموعات — سلوك دردشة المجموعات وبوابة الإشارات
- توجيه القنوات — توجيه الجلسات للرسائل
- الأمان — نموذج الوصول والتقوية