Signal (signal-cli)
الحالة: تكامل CLI خارجي. يتواصل Gateway معsignal-cli عبر HTTP JSON-RPC + SSE.
المتطلبات الأساسية
- تثبيت OpenClaw على خادمك (تم اختبار التدفق أدناه على Ubuntu 24).
- توفر
signal-cliعلى المضيف الذي يعمل عليه gateway. - رقم هاتف يمكنه استلام رسالة 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.
- أرسل أول رسالة مباشرة ووافق على pairing (
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؛ إذ تشير ملاحظات المنبع إلى أن الإصدارات القديمة قد تتعطل مع تغيّر واجهات Signal server API.
- سجّل الرقم وتحقق منه:
- افتح
https://signalcaptchas.org/registration/generate.html. - أكمل captcha، ثم انسخ هدف الرابط
signalcaptcha://...من “Open Signal”. - شغّل من نفس عنوان IP الخارجي الخاص بجلسة المتصفح إن أمكن.
- أعد تشغيل التسجيل فورًا (تنتهي صلاحية رموز captcha بسرعة):
- اضبط OpenClaw، وأعد تشغيل gateway، وتحقق من القناة:
- نفّذ pairing لمرسل الرسائل المباشرة:
- أرسل أي رسالة إلى رقم الروبوت.
- وافق على الرمز على الخادم:
openclaw pairing approve signal <PAIRING_CODE>. - احفظ رقم الروبوت كجهة اتصال على هاتفك لتجنب “Unknown contact”.
signal-cli إلى إلغاء مصادقة جلسة تطبيق Signal الرئيسية لذلك الرقم. يُفضّل استخدام رقم روبوت مخصص، أو استخدام وضع الربط عبر QR إذا كنت بحاجة إلى الاحتفاظ بإعداد تطبيق الهاتف الحالي.
مراجع المنبع:
- ملف
signal-cliREADME: 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.
التحكم في الوصول (الرسائل المباشرة + المجموعات)
الرسائل المباشرة:- الافتراضي:
channels.signal.dmPolicy = "pairing". - يتلقى المرسلون غير المعروفين رمز pairing؛ ويتم تجاهل الرسائل حتى الموافقة عليها (تنتهي صلاحية الرموز بعد ساعة واحدة).
- تتم الموافقة عبر:
openclaw pairing list signalopenclaw pairing approve signal <CODE>
- pairing هو تبادل الرموز الافتراضي لرسائل Signal المباشرة. التفاصيل: Pairing
- يتم تخزين المرسلين الذين لديهم UUID فقط (من
sourceUuid) كـuuid:<id>فيchannels.signal.allowFrom.
channels.signal.groupPolicy = open | allowlist | disabled.- يتحكم
channels.signal.groupAllowFromفي من يمكنه التفعيل في المجموعات عند تعيينallowlist. - يمكن لـ
channels.signal.groups["<group-id>" | "*"]تجاوز سلوك المجموعات باستخدامrequireMentionوtoolsوtoolsBySender. - استخدم
channels.signal.accounts.<id>.groupsلعمليات التجاوز لكل حساب في إعدادات الحسابات المتعددة. - ملاحظة وقت التشغيل: إذا كان
channels.signalمفقودًا بالكامل، فسيعود وقت التشغيل إلىgroupPolicy="allowlist"لفحوصات المجموعات (حتى إذا تم تعيينchannels.defaults.groupPolicy).
كيف يعمل (السلوك)
- يعمل
signal-cliكـ daemon؛ ويقرأ gateway الأحداث عبر SSE. - تُطبّع الرسائل الواردة إلى غلاف القناة المشترك.
- تُوجَّه الردود دائمًا إلى الرقم أو المجموعة نفسها.
الوسائط والحدود
- يُجزّأ النص الصادر إلى
channels.signal.textChunkLimit(الافتراضي 4000). - تجزئة اختيارية حسب الأسطر الجديدة: اضبط
channels.signal.chunkMode="newline"للتقسيم عند الأسطر الفارغة (حدود الفقرات) قبل التجزئة حسب الطول. - المرفقات مدعومة (يتم جلب base64 من
signal-cli). - الحد الافتراضي للوسائط:
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>من مخرجات pairing؛ يعمل 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 لديك يدعمها).
استكشاف الأخطاء وإصلاحها
شغّل هذا التسلسل أولًا:- يمكن الوصول إلى daemon ولكن لا توجد ردود: تحقق من إعدادات الحساب/daemon (
httpUrl,account) ووضع الاستقبال. - يتم تجاهل الرسائل المباشرة: المرسل بانتظار موافقة pairing.
- يتم تجاهل رسائل المجموعات: تقييد المرسل/الإشارة في المجموعة يمنع التسليم.
- أخطاء التحقق من التكوين بعد التعديلات: شغّل
openclaw doctor --fix. - غياب Signal من أدوات التشخيص: تأكد من
channels.signal.enabled: true.
ملاحظات أمنية
- يخزّن
signal-cliمفاتيح الحساب محليًا (عادةً~/.local/share/signal-cli/data/). - انسخ حالة حساب Signal احتياطيًا قبل ترحيل الخادم أو إعادة بنائه.
- أبقِ
channels.signal.dmPolicy: "pairing"ما لم تكن تريد صراحةً وصولًا أوسع للرسائل المباشرة. - لا يلزم التحقق عبر SMS إلا لمسارات التسجيل أو الاستعادة، لكن فقدان التحكم في الرقم/الحساب قد يعقّد إعادة التسجيل.
مرجع التكوين (Signal)
التكوين الكامل: Configuration خيارات المزوّد:channels.signal.enabled: تمكين/تعطيل بدء تشغيل القناة.channels.signal.account: E.164 لحساب الروبوت.channels.signal.cliPath: مسارsignal-cli.channels.signal.httpUrl: عنوان URL الكامل للـ daemon (يتجاوز المضيف/المنفذ).channels.signal.httpHost,channels.signal.httpPort: ربط daemon (الافتراضي 127.0.0.1:8080).channels.signal.autoStart: تشغيل daemon تلقائيًا (الافتراضي true إذا لم يتم تعيينhttpUrl).channels.signal.startupTimeoutMs: مهلة انتظار بدء التشغيل بالمللي ثانية (الحد الأقصى 120000).channels.signal.receiveMode: on-start | manual.channels.signal.ignoreAttachments: تخطي تنزيل المرفقات.channels.signal.ignoreStories: تجاهل القصص من daemon.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: قائمة سماح مرسلي المجموعات.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.
ذو صلة
- نظرة عامة على القنوات — جميع القنوات المدعومة
- Pairing — مصادقة الرسائل المباشرة وتدفق pairing
- المجموعات — سلوك الدردشة الجماعية وتقييد الإشارات
- توجيه القنوات — توجيه الجلسات للرسائل
- الأمان — نموذج الوصول والتقوية