Developer and self-hosted

Nostr

الحالة: Plugin مضمّن اختياري (معطّل افتراضيًا حتى تتم تهيئته).

Nostr هو بروتوكول لامركزي للتواصل الاجتماعي. تتيح هذه القناة لـ OpenClaw استقبال الرسائل المباشرة المشفّرة (DMs) والرد عليها عبر NIP-04.

Plugin مضمّن

تتضمن إصدارات OpenClaw الحالية Nostr باعتباره Plugin مضمّنًا، لذلك لا تحتاج الحزم المبنية العادية إلى تثبيت منفصل.

التثبيتات الأقدم/المخصصة

  • لا يزال الإعداد الأولي (openclaw onboard) وopenclaw channels add يعرضان Nostr من كتالوج القنوات المشترك.
  • إذا كان البناء لديك يستثني Nostr المضمّن، فثبّت حزمة npm مباشرة.
openclaw plugins install @openclaw/nostr

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

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

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

أعد تشغيل Gateway بعد تثبيت Plugins أو تمكينها.

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

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 (إذا لزم الأمر):
# Using nak
nak key generate
  1. أضفه إلى الإعدادات:
{
  channels: {
    nostr: {
      privateKey: "${NOSTR_PRIVATE_KEY}",
    },
  },
}
  1. صدّر المفتاح:
export NOSTR_PRIVATE_KEY="nsec1..."
  1. أعد تشغيل Gateway.

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

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

بيانات تعريف الملف الشخصي

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

مثال:

{
  channels: {
    nostr: {
      privateKey: "${NOSTR_PRIVATE_KEY}",
      profile: {
        name: "openclaw",
        displayName: "OpenClaw",
        about: "Personal assistant DM bot",
        picture: "https://example.com/avatar.png",
        banner: "https://example.com/banner.png",
        website: "https://example.com",
        nip05: "[email protected]",
        lud16: "[email protected]",
      },
    },
  },
}

ملاحظات:

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

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

سياسات DM

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

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

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

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

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

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

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

  • المفتاح الخاص: nsec... أو hex بطول 64 حرفًا
  • مفاتيح Pubkeys (allowFrom): npub... أو hex

Relays

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

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

نصائح:

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

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

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

الاختبار

Relay محلي

# Start strfry
docker run -p 7777:7777 ghcr.io/hoytech/strfry
{
  channels: {
    nostr: {
      privateKey: "${NOSTR_PRIVATE_KEY}",
      relays: ["ws://localhost:7777"],
    },
  },
}

اختبار يدوي

  1. لاحظ pubkey الخاص بالبوت (npub) من السجلات.
  2. افتح عميل Nostr (Damus، Amethyst، إلخ).
  3. أرسل DM إلى pubkey الخاص بالبوت.
  4. تحقق من الرد.

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

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

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

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

  • تحقق من أن Relay يقبل الكتابة.
  • تحقق من الاتصال الصادر.
  • راقب حدود معدل Relay.

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

  • متوقعة عند استخدام عدة Relays.
  • تُزال الرسائل المكررة حسب معرّف الحدث؛ ولا يؤدي إلا التسليم الأول إلى إطلاق رد.

الأمان

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

القيود (MVP)

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

ذات صلة