Signal (signal-cli)
الحالة: تكامل خارجي عبر CLI. يتواصل Gateway معsignal-cli عبر HTTP JSON-RPC + SSE.
المتطلبات المسبقة
- تثبيت OpenClaw على الخادم الخاص بك (تم اختبار مسار Linux أدناه على Ubuntu 24).
- توفّر
signal-cliعلى المضيف الذي يعمل عليه Gateway. - رقم هاتف يمكنه استقبال رسالة تحقق SMS واحدة (لمسار التسجيل عبر SMS).
- إمكانية الوصول إلى المتصفح لحل captcha الخاصة بـ Signal (
signalcaptchas.org) أثناء التسجيل.
الإعداد السريع (للمبتدئين)
- استخدم رقم Signal منفصل للبوت (موصى به).
- ثبّت
signal-cli(يتطلب Java). - اختر أحد مساري الإعداد:
signal-cli link -n "OpenClaw"- المسار B (التسجيل عبر SMS): تسجيل رقم مخصص باستخدام captcha + تحقق عبر SMS.
- هيّئ OpenClaw وابدأ Gateway.
- أرسل أول رسالة خاصة ووافق على الاقتران (
openclaw pairing approve signal <CODE>).
| الحقل | الوصف |
|---|---|
account | رقم هاتف البوت بصيغة E.164 (+15551234567) |
| الإعداد (المسار السريع) | ثبّت signal-cli (يتطلب Java). |
dmPolicy | سياسة الوصول إلى الرسائل الخاصة (pairing موصى بها) |
allowFrom | أرقام هواتف أو قيم uuid:<id> المسموح لها بإرسال رسائل خاصة |
ما هو
- قناة Signal عبر
signal-cli(وليست libsignal مدمجة). - توجيه حتمي: تعود الردود دائمًا إلى Signal.
- تشارك الرسائل الخاصة (DMs) جلسة الوكيل الرئيسية؛ بينما تكون المجموعات معزولة (
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على جهاز الاستضافة الخاص بالبوابة:
signal-cli-${VERSION}.tar.gz)، فثبّت JRE 25+ أولاً.
احرص على تحديث signal-cli باستمرار؛ إذ تشير ملاحظات المصدر إلى أن الإصدارات القديمة قد تتعطل مع تغيّر واجهات API الخاصة بخادم Signal.
- سجّل الرقم وأكّد التحقق منه:
- Open
https://signalcaptchas.org/registration/generate.html. - أكمل captcha، ثم انسخ رابط
signalcaptcha://...من خيار “Open Signal”. - شغّل الأمر من نفس عنوان IP الخارجي لجلسة المتصفح إن أمكن.
- أعِد تشغيل التسجيل فورًا (تنتهي صلاحية رموز captcha بسرعة):
- قم بتهيئة OpenClaw، ثم أعد تشغيل البوابة وتحقق من القناة:
- قم بإقران مُرسل الرسائل الخاصة (DM):
- أرسل أي رسالة إلى رقم البوت.
- وافق على الرمز في الخادم:
openclaw pairing approve signal <PAIRING_CODE>. - احفظ رقم البوت كجهة اتصال على هاتفك لتجنب ظهور “Unknown contact”.
signal-cli قد يؤدي إلى إلغاء توثيق جلسة تطبيق Signal الرئيسية لذلك الرقم. يفضَّل استخدام رقم بوت مخصص، أو استخدام وضع الربط عبر QR إذا كنت بحاجة إلى الاحتفاظ بإعداد تطبيق الهاتف الحالي.
مراجع المصدر:
signal-cliREADME:https://github.com/AsamK/signal-cli- Captcha flow:
https://github.com/AsamK/signal-cli/wiki/Registration-with-captcha - Linking flow:
https://github.com/AsamK/signal-cli/wiki/Linking-other-devices-(Provisioning)
وضع الخدمة الخارجية (httpUrl)
إذا رغبت في إدارةsignal-cli بنفسك (بدء JVM البارد البطيء، تهيئة الحاويات، أو وحدات CPU مشتركة)، شغّل الخدمة بشكل منفصل ووجّه OpenClaw إليها:
channels.signal.startupTimeoutMs.
التحكم في الوصول (الرسائل الخاصة + المجموعات)
DMs:- الافتراضي:
channels.signal.dmPolicy = "pairing". - يتلقى المُرسِلون غير المعروفين رمز إقران؛ وتُتجاهل الرسائل حتى الموافقة (تنتهي الرموز بعد ساعة).
- الموافقة عبر:
openclaw pairing list signalopenclaw pairing approve signal <CODE>
- الإقران هو تبادل الرموز الافتراضي لرسائل Signal الخاصة. التفاصيل: Pairing
- تُخزَّن المُرسِلات ذات UUID فقط (من
sourceUuid) كـuuid:<id>فيchannels.signal.allowFrom.
channels.signal.groupPolicy = open | allowlist | disabled.- يتحكم
channels.signal.groupAllowFromبمن يمكنه التحفيز في المجموعات عند تعيينallowlist.
كيف يعمل (السلوك)
- يعمل
signal-cliكخدمة؛ ويقرأ 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.sendReadReceiptstrue، يمرّر 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 قبل ترحيل الخادم أو إعادة بنائه.
- اربط جهاز البوت وابدأ الخدمة:
- التحقق عبر SMS مطلوب فقط لعمليات التسجيل أو الاستعادة، لكن فقدان التحكم بالرقم/الحساب قد يعقّد إعادة التسجيل.
مرجع التهيئة (Signal)
التهيئة الكاملة: Configuration خيارات الموفّر:channels.signal.enabled: تمكين/تعطيل بدء القناة.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(الافتراضي: الإقران).channels.signal.allowFrom: قائمة سماح للرسائل الخاصة (E.164 أوuuid:<id>). يتطلبopenوجود"*". لا يدعم Signal أسماء المستخدمين؛ استخدم معرفات الهاتف/UUID.channels.signal.groupPolicy:open | allowlist | disabled(الافتراضي: قائمة السماح).channels.signal.groupAllowFrom: قائمة سماح مُرسِلي المجموعات.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: حد الوسائط الواردة/الصادرة (ميغابايت).
agents.list[].groupChat.mentionPatterns(لا يدعم Signal الإشارات الأصلية).messages.groupChat.mentionPatterns(الاحتياطي العام).messages.responsePrefix.