Developer and self-hosted

Nostr

Nostr هو Plugin قناة قابل للتنزيل (@openclaw/nostr) يتيح لـ OpenClaw تلقي الرسائل المباشرة المشفرة وفق NIP-04 والرد عليها عبر مرحّلات Nostr. حساب واحد لكل Gateway؛ الرسائل المباشرة فقط.

التثبيت

bash
openclaw plugins install @openclaw/nostr

استخدم مواصفة الحزمة المجرّدة لمتابعة وسم الإصدار الرسمي الحالي. ثبّت إصدارًا محددًا بدقة فقط عندما تحتاج إلى تثبيت قابل لإعادة الإنتاج.

من نسخة محلية من المستودع (سير عمل التطوير):

bash
openclaw plugins install --link <path-to-local-nostr-plugin>

أعد تشغيل Gateway بعد تثبيت Plugins أو تمكينها. يعرض الإعداد الأولي (openclaw onboard) والأمر openclaw channels add قناة Nostr من كتالوج القنوات المشترك بعد تثبيت Plugin.

الإعداد غير التفاعلي

bash
openclaw channels add --channel nostr --private-key "$NOSTR_PRIVATE_KEY"openclaw channels add --channel nostr --private-key "$NOSTR_PRIVATE_KEY" --relay-urls "wss://relay.damus.io,wss://relay.primal.net"

استخدم --use-env للاحتفاظ بـ NOSTR_PRIVATE_KEY في البيئة بدلًا من تخزين المفتاح في الإعدادات (للحساب الافتراضي فقط).

الإعداد السريع

  1. أنشئ زوج مفاتيح Nostr (عند الحاجة):
bash
# باستخدام naknak key generate
  1. أضفه إلى الإعدادات:
json5
{  channels: {    nostr: {      privateKey: "${NOSTR_PRIVATE_KEY}",    },  },}
  1. صدّر المفتاح:
bash
export NOSTR_PRIVATE_KEY="nsec1..."
  1. أعد تشغيل Gateway.

مرجع الإعدادات

المفتاح النوع القيمة الافتراضية الوصف
privateKey string مطلوب المفتاح الخاص بتنسيق nsec أو سداسي عشري؛ يُسمح بمراجع الأسرار
relays string[] ['wss://relay.damus.io', 'wss://nos.lol'] عناوين URL للمرحّلات (WebSocket)
dmPolicy string pairing سياسة الوصول إلى الرسائل المباشرة
allowFrom string[] [] المفاتيح العامة للمرسلين المسموح لهم
enabled boolean true تمكين القناة أو تعطيلها
name string - اسم العرض
profile object - بيانات الملف الشخصي الوصفية وفق NIP-01

بيانات الملف الشخصي الوصفية

تُنشر بيانات الملف الشخصي كحدث NIP-01 من النوع kind:0. يمكنك إدارتها من واجهة التحكم (Channels -> Nostr -> Profile) أو تعيينها مباشرة في الإعدادات.

مثال:

json5
{  channels: {    nostr: {      privateKey: "${NOSTR_PRIVATE_KEY}",      profile: {        name: "openclaw",        displayName: "OpenClaw",        about: "روبوت رسائل مباشرة يعمل كمساعد شخصي",        picture: "https://example.com/avatar.png",        banner: "https://example.com/banner.png",        website: "https://example.com",        nip05: "openclaw@example.com",        lud16: "openclaw@example.com",      },    },  },}

ملاحظات:

  • يجب أن تستخدم عناوين URL للملف الشخصي https://.
  • يؤدي الاستيراد من المرحّلات إلى دمج الحقول مع الحفاظ على التجاوزات المحلية.

التحكم في الوصول

سياسات الرسائل المباشرة

  • pairing (الافتراضية): يحصل المرسلون غير المعروفين على رمز إقران.
  • allowlist: لا يمكن إرسال رسائل مباشرة إلا من المفاتيح العامة الموجودة في allowFrom.
  • open: رسائل مباشرة واردة متاحة للعامة (تتطلب allowFrom: ["*"]).
  • disabled: تجاهل الرسائل المباشرة الواردة.

ملاحظات الإنفاذ:

  • يجري التحقق من توقيعات الأحداث الواردة قبل تطبيق سياسة المرسل وفك تشفير NIP-04، لذلك تُرفض الأحداث المزوّرة مبكرًا.
  • تُرسل ردود الإقران دون فك تشفير نص الرسالة المباشرة الأصلية أو معالجته.
  • تخضع الرسائل المباشرة الواردة لتحديد المعدل (عموميًا ولكل مرسل)، وتُسقط الحمولات ذات الحجم الزائد قبل فك التشفير.

مثال على قائمة السماح

json5
{  channels: {    nostr: {      privateKey: "${NOSTR_PRIVATE_KEY}",      dmPolicy: "allowlist",      allowFrom: ["npub1abc...", "npub1xyz..."],    },  },}

تنسيقات المفاتيح

التنسيقات المقبولة:

  • المفتاح الخاص: nsec... أو قيمة سداسية عشرية من 64 محرفًا
  • المفاتيح العامة (allowFrom): npub... أو قيمة سداسية عشرية

المرحّلات

القيم الافتراضية: relay.damus.io وnos.lol.

json5
{  channels: {    nostr: {      privateKey: "${NOSTR_PRIVATE_KEY}",      relays: ["wss://relay.damus.io", "wss://relay.primal.net", "wss://nostr.wine"],    },  },}

نصائح:

  • استخدم مرحّلين أو ثلاثة مرحّلات لتحقيق التكرار الاحتياطي.
  • تجنّب استخدام عدد كبير جدًا من المرحّلات (بسبب زمن الاستجابة والتكرار).
  • يمكن للمرحّلات المدفوعة تحسين الموثوقية.
  • المرحّلات المحلية مناسبة للاختبار (ws://localhost:7777).

دعم البروتوكولات

NIP الحالة الوصف
NIP-01 مدعوم تنسيق الأحداث الأساسي وبيانات الملف الشخصي الوصفية
NIP-04 مدعوم رسائل مباشرة مشفرة (kind:4)
NIP-17 مخطط له رسائل مباشرة مغلّفة كهدية
NIP-44 مخطط له تشفير بإصدارات

الاختبار

مرحّل محلي

bash
# تشغيل strfrydocker run -p 7777:7777 ghcr.io/hoytech/strfry
json5
{  channels: {    nostr: {      privateKey: "${NOSTR_PRIVATE_KEY}",      relays: ["ws://localhost:7777"],    },  },}

اختبار يدوي

  1. دوّن المفتاح العام للروبوت من سجلات Gateway أو من openclaw channels status (بتنسيق سداسي عشري؛ حوّله إلى npub في عميلك عند الحاجة).
  2. افتح عميل Nostr ‏(Amethyst أو Damus أو غيرهما).
  3. أرسل رسالة مباشرة إلى المفتاح العام للروبوت.
  4. تحقّق من الرد.

استكشاف الأخطاء وإصلاحها

عدم تلقي الرسائل

  • تحقّق من صلاحية المفتاح الخاص.
  • تأكد من إمكانية الوصول إلى عناوين URL للمرحّلات ومن أنها تستخدم wss:// (أو ws:// للاتصال المحلي).
  • تأكد من أن enabled ليست false.
  • افحص سجلات Gateway بحثًا عن أخطاء الاتصال بالمرحّلات.

عدم إرسال الردود

  • تحقّق من أن المرحّل يقبل عمليات الكتابة.
  • تحقّق من الاتصال الصادر.
  • راقب حدود المعدل التي تفرضها المرحّلات.

الردود المكررة

  • هذا متوقع عند استخدام مرحّلات متعددة.
  • تُزال الرسائل المكررة استنادًا إلى معرّف الحدث؛ ولا يؤدي إلى تشغيل رد سوى أول تسليم.

الأمان

  • لا تُضمّن المفاتيح الخاصة في المستودع مطلقًا.
  • استخدم متغيرات البيئة للمفاتيح.
  • فكّر في استخدام allowlist لروبوتات بيئة الإنتاج.
  • يجري التحقق من التوقيعات قبل تطبيق سياسة المرسل، وتُطبّق سياسة المرسل قبل فك التشفير، لذلك تُرفض الأحداث المزوّرة مبكرًا ولا يمكن للمرسلين غير المعروفين فرض تنفيذ عمليات التشفير كاملة.

القيود (الحد الأدنى من المنتج القابل للاستخدام)

  • الرسائل المباشرة فقط (لا توجد محادثات جماعية).
  • لا توجد مرفقات وسائط.
  • NIP-04 فقط (من المخطط دعم التغليف كهدية وفق NIP-17).

ذو صلة

Was this useful?
On this page

On this page