مكون إضافي ActivityPub

@hellekin شكراً على التقرير. سيحدث دائمًا قدر معين من الطلبات الفاشلة في خدمة ActivityPub حيث يأتي الفاعلون في الفيديفيرس ويذهبون. على سبيل المثال، يبدو أن:

  • عنوان URL https://activitypub.example من السجل الأول ليس عنوان URL حقيقيًا (هل قمت بتغييره؟)
  • المستخدم https://mas.to/users/rikvipcode من السجل الثاني لم يعد موجودًا
  • المستخدم https://mastodon.social/users/ejovoni46709 في السجل الثالث لم يعد موجودًا

إن تفصيل السجلات موجود للمساعدة في تصحيح الأخطاء، ولكن إذا كانت تسبب فوضى في سجلاتك، فيمكنك تبديلها باستخدام إعداد الموقع activity pub verbose logging. الإعداد الافتراضي هو “إيقاف”.

سنتطلع إلى إجراء تحسينات على معالجة الأخطاء في المرحلة الثانية إذا لزم الأمر، ولكن حتى الآن يبدو أن المقتطفات التي نشرتها متوقعة، أي أن الفاعلين لم يعودوا موجودين في الفيديفيرس.

حاليًا، الطريقة التي يتعامل بها المكون الإضافي مع فشل التسليم هي تتبعها بنفس الطريقة التي يتعامل بها Mastodon، وهي أنه إذا كان هناك 7 أيام من الفشل لنقطة نهاية، فسيتم تمييزها على أنها “غير متاحة” ولن يتم محاولة الطلبات بعد ذلك.

3 إعجابات

نعم، كما هو موضح في السطر الذي يسبقه.

بالفعل، ولكن رمز الحالة هو 410، مما يعني أن الحساب قد يكون قد انتقل (إذا كان هناك شاهد قبر - هل تم التحقق من هذا الشرط؟)

إعجاب واحد (1)

لا. إنه الخطأ 410 Gone ويعني أنه تم حذف المورد. ما الذي فاتني الآن؟

إعجاب واحد (1)

لقد فاتك هذا:

مرحباً @angus،

لقد قمت للتو بإعداد نسخة مستضافة ذاتيًا جديدة تمامًا من Discourse باستخدام إضافة AP الخاصة بك على https://federation.cafe، وأرى بعض أخطاء 403 في سجلات أخطاء Discourse (والمشاركات لا تتم مشاركتها).

أتساءل عما إذا كان ذلك قد يكون بسبب وجود شرطات ربما؟

[Discourse Activity Pub] GET request to https://bofh.social/internal/fetch failed: Expected([200, 201, 202, 301, 302, 307, 308]) <=> Actual(403 Forbidden)

/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/request.rb:66:in `rescue in perform'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/request.rb:50:in `perform'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/request.rb:34:in `get_json_ld'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/request.rb:106:in `get_json_ld'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/json_ld.rb:52:in `request_object'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/json_ld.rb:48:in `resolve_object'
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/ap/actor.rb:103:in `resolve_and_store'
/var/www/discourse/plugins/discourse-activity-pub/app/controllers/concerns/discourse_activity_pub/signature_verification.rb:192:in `actor_from_key_id'
/var/www/discourse/plugins/discourse-activity-pub/app/controllers/concerns/discourse_activity_pub/signature_verification.rb:57:in `signed_request_actor'
/var/www/discourse/plugins/discourse-activity-pub/app/controllers/concerns/discourse_activity_pub/signature_verification.rb:27:in `ensure_verified_signature'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:400:in `block in make_lambda'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:180:in `block (2 levels) in halting_and_conditional'
actionpack-7.0.4.3/lib/abstract_controller/callbacks.rb:34:in `block (2 levels) in <module:Callbacks>'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:181:in `block in halting_and_conditional'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:595:in `block in invoke_before'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:595:in `each'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:595:in `invoke_before'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:116:in `block in run_callbacks'
/var/www/discourse/app/controllers/application_controller.rb:418:in `block in with_resolved_locale'
i18n-1.14.1/lib/i18n.rb:322:in `with_locale'
/var/www/discourse/app/controllers/application_controller.rb:418:in `with_resolved_locale'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:127:in `block in run_callbacks'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:138:in `run_callbacks'
actionpack-7.0.4.3/lib/abstract_controller/callbacks.rb:233:in `process_action'
actionpack-7.0.4.3/lib/action_controller/metal/rescue.rb:22:in `process_action'
actionpack-7.0.4.3/lib/action_controller/metal/instrumentation.rb:67:in `block in process_action'
activesupport-7.0.4.3/lib/active_support/notifications.rb:206:in `block in instrument'
activesupport-7.0.4.3/lib/active_support/notifications/instrumenter.rb:24:in `instrument'
activesupport-7.0.4.3/lib/active_support/notifications.rb:206:in `instrument'
actionpack-7.0.4.3/lib/action_controller/metal/instrumentation.rb:66:in `process_action'
actionpack-7.0.4.3/lib/action_controller/metal/params_wrapper.rb:259:in `process_action'
activerecord-7.0.4.3/lib/active_record/railties/controller_runtime.rb:27:in `process_action'
actionpack-7.0.4.3/lib/abstract_controller/base.rb:151:in `process'
actionview-7.0.4.3/lib/action_view/rendering.rb:39:in `process'
rack-mini-profiler-3.1.0/lib/mini_profiler/profiling_methods.rb:85:in `block in profile_method'
actionpack-7.0.4.3/lib/action_controller/metal.rb:188:in `dispatch'
actionpack-7.0.4.3/lib/action_controller/metal.rb:251:in `dispatch'
actionpack-7.0.4.3/lib/action_dispatch/routing/route_set.rb:49:in `dispatch'
actionpack-7.0.4.3/lib/action_dispatch/routing/route_set.rb:32:in `serve'
actionpack-7.0.4.3/lib/action_dispatch/journey/router.rb:50:in `block in serve'
actionpack-7.0.4.3/lib/action_dispatch/journey/router.rb:32:in `each'
actionpack-7.0.4.3/lib/action_dispatch/journey/router.rb:32:in `serve'
actionpack-7.0.4.3/lib/action_dispatch/routing/route_set.rb:852:in `call'
railties-7.0.4.3/lib/rails/engine.rb:530:in `call'
railties-7.0.4.3/lib/rails/railtie.rb:226:in `public_send'
railties-7.0.4.3/lib/rails/railtie.rb:226:in `method_missing'
actionpack-7.0.4.3/lib/action_dispatch/routing/mapper.rb:19:in `block in <class:Constraints>'
actionpack-7.0.4.3/lib/action_dispatch/routing/mapper.rb:48:in `serve'
actionpack-7.0.4.3/lib/action_dispatch/journey/router.rb:50:in `block in serve'
actionpack-7.0.4.3/lib/action_dispatch/journey/router.rb:32:in `each'
actionpack-7.0.4.3/lib/action_dispatch/journey/router.rb:32:in `serve'
actionpack-7.0.4.3/lib/action_dispatch/routing/route_set.rb:852:in `call'
/var/www/discourse/lib/middleware/omniauth_bypass_middleware.rb:74:in `call'
rack-2.2.7/lib/rack/tempfile_reaper.rb:15:in `call'
rack-2.2.7/lib/rack/conditional_get.rb:27:in `call'
rack-2.2.7/lib/rack/head.rb:12:in `call'
actionpack-7.0.4.3/lib/action_dispatch/http/permissions_policy.rb:38:in `call'
/var/www/discourse/lib/content_security_policy/middleware.rb:12:in `call'
/var/www/discourse/lib/middleware/anonymous_cache.rb:367:in `call'
rack-2.2.7/lib/rack/session/abstract/id.rb:266:in `context'
rack-2.2.7/lib/rack/session/abstract/id.rb:260:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/cookies.rb:704:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
activesupport-7.0.4.3/lib/active_support/callbacks.rb:99:in `run_callbacks'
actionpack-7.0.4.3/lib/action_dispatch/middleware/callbacks.rb:26:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/debug_exceptions.rb:28:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/show_exceptions.rb:26:in `call'
logster-2.12.2/lib/logster/middleware/reporter.rb:43:in `call'
railties-7.0.4.3/lib/rails/rack/logger.rb:40:in `call_app'
railties-7.0.4.3/lib/rails/rack/logger.rb:27:in `call'
/var/www/discourse/config/initializers/100-quiet_logger.rb:20:in `call'
/var/www/discourse/config/initializers/100-silence_logger.rb:29:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/remote_ip.rb:93:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/request_id.rb:26:in `call'
/var/www/discourse/lib/middleware/enforce_hostname.rb:24:in `call'
rack-2.2.7/lib/rack/method_override.rb:24:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/executor.rb:14:in `call'
rack-2.2.7/lib/rack/sendfile.rb:110:in `call'
actionpack-7.0.4.3/lib/action_dispatch/middleware/host_authorization.rb:131:in `call'
rack-mini-profiler-3.1.0/lib/mini_profiler.rb:260:in `call'
message_bus-4.3.2/lib/message_bus/rack/middleware.rb:60:in `call'
/var/www/discourse/lib/middleware/request_tracker.rb:228:in `call'
railties-7.0.4.3/lib/rails/engine.rb:530:in `call'
railties-7.0.4.3/lib/rails/railtie.rb:226:in `public_send'
railties-7.0.4.3/lib/rails/railtie.rb:226:in `method_missing'
rack-2.2.7/lib/rack/urlmap.rb:74:in `block in call'
rack-2.2.7/lib/rack/urlmap.rb:58:in `each'
rack-2.2.7/lib/rack/urlmap.rb:58:in `call'
unicorn-6.1.0/lib/unicorn/http_server.rb:634:in `process_client'
unicorn-6.1.0/lib/unicorn/http_server.rb:739:in `worker_loop'
unicorn-6.1.0/lib/unicorn/http_server.rb:547:in `spawn_missing_workers'
unicorn-6.1.0/lib/unicorn/http_server.rb:143:in `start'
unicorn-6.1.0/bin/unicorn:128:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/3.2.0/bin/unicorn:25:in `load'
/var/www/discourse/vendor/bundle/ruby/3.2.0/bin/unicorn:25:in `<main>'

hostname	LILEJAP07-app
process_id	658
application_version	1abfe2e61d12b1b559aab0132ec3fb7cc8b87232
HTTP_HOST	federation.cafe
REQUEST_URI	/ap/actor/5ce52c043e670476a1426f9a66472c07
REQUEST_METHOD	GET
HTTP_USER_AGENT	Akkoma 3.8.0-0-gccae7ef; https://bofh.social <admin@bofh.social>
HTTP_ACCEPT	application/activity+json
HTTP_X_FORWARDED_FOR	91.107.215.39, 172.71.250.70
HTTP_X_REAL_IP	172.71.250.70
time	2:16 pm

أفكار؟

أنا مهتم أيضًا بالمشاركات الطويلة. في هذه الحالة، يجب استخدام نوع “المقال” بدلاً من “الملاحظة”.

في الواقع، الإعلانات أقل إثارة للاهتمام بالنسبة لي من ميزات المنتدى الموحد.

هل هناك خارطة طريق و/أو مكان لإرسال التبرعات لميزات كهذه؟

مرحباً @gme شكراً لتجربة المكون الإضافي

بعض الأشياء التي يجب ملاحظتها مبدئيًا هنا

  1. تم اختبار المكون الإضافي MVP مع Mastodon. أرى أنك تستخدم Pleroma هناك. أعرف أن Pleroma متوافق مع ActivityPub ويعمل مع Mastodon، ومع ذلك لم نلقِ نظرة فاحصة على التعديلات التي قد تكون مطلوبة (إن وجدت) لضمان دعمه حتى الآن. لكننا ما زلنا مهتمين بمعرفة ما يحدث هنا.

  2. يبدو أن الطلبات فشلت بسبب خطأ في المصادقة على خادم Pleroma الخاص بك (هذا ما يعنيه خطأ 403). بما أنني أستطيع الحصول على هذا الـ endpoint باستخدام طلب cURL غير مصادق، أشك في أنه قد يكون خطأ المصادقة http على جانب Pleroma.

لاختبار الأخير (أي 2)، هل يمكنك إلقاء نظرة على سجلات Pleroma الخاصة بك (يبدو أنك المسؤول عن هذا الخادم أيضًا؟) إذا أمكن لمعرفة ما إذا كان بإمكانك الحصول على مزيد من التفاصيل حول هذا الجانب؟

شكراً على الملاحظات @bmann. هل يمكنك التوسع في حالة الاستخدام التي تفكر فيها هنا؟ مع مثال إذا أمكن.

هذا الموضوع هو أفضل مكان لمتابعة التطورات. عندما نستقر على خطة للمرحلة الثانية سأشاركها هنا. في هذه الأثناء، أفضل طريقة للمساعدة هي مشاركة حالات الاستخدام المحددة التي تستخدمها، أو ترغب في استخدام، المكون الإضافي لها.

5 إعجابات

تتمثل حالة الاستخدام في استخدام Discourse كعقدة AP كاملة. هناك العديد من الطرق الأسهل لنشر المحتوى إلى AP (مثل استخدام خلاصات RSS للفئات و Zapier أو Buffer) - ولكن تطوير قدرة AP كاملة لا يمكن القيام به إلا كإضافة / تكامل.

المقالة هي نوع ActivityStream المخصص للمقالات الكاملة. اعتمادًا على واجهة العميل، ستعرض معاينة ثم نقرة للانتقال لعرض المقالة بأكملها ضمنيًا (تشبه تحذيرات المحتوى، ولكنها تقرأ المزيد).

الملاحظة هي نوع التدوين المصغر.

من خلال وجود منشورات مقالات كاملة، يمكن للأشخاص القراءة / التعزيز / الرد مباشرة في عملاء AP الخاص بهم.

وبالطبع، سيكون من المثير للاهتمام معرفة خارطة طريقك إذا كنت ستتبع مثيلاً أكثر للتدوين المصغر AP، أو تتجه نحو منتدى موحد مثل Lemmy أو Kbin، خاصة بالنظر إلى أخبار Reddit الأخيرة.

إعجاب واحد (1)

@angus، @pmusaraj هل رأيت دعوة التقديم لتمويل NGI Sargasso؟ هذا إشعار قصير جدًا ولكنه قد يكون مفيدًا لمزيد من التطوير على هذا المكون الإضافي (ما لم تكن لديك خطط أخرى بالفعل).

إعجاب واحد (1)

مرحباً يا رفاق، يسعدني أن أعلن أنه تمت الموافقة على المرحلة الثانية من العمل على هذه الإضافة. هذا ما بدأنا العمل عليه بالفعل، بهدف إصداره في حوالي 3.5 أشهر.

دعم تعديل الملاحظة بعد النشر

دعم استعادة الملاحظات

دعم نشر المشاركات علنًا وكذلك للمتابعين فقط

تحسين تحليل محتوى الملاحظات

  • التعامل مع الأحرف الخاصة (ربما استخدام محلل مختلف). انظر المزيد.

دعم استخدام المقال بدلاً من الملاحظة ككائن للمشاركة.

  • إعداد على مستوى الفئة

دعم قبول الأنشطة ردًا على ملاحظة تم إجراؤها عن بُعد ونشر الأنشطة ردًا على ملاحظة تم إجراؤها في Discourse.

  • نشر الأنشطة المتعلقة بالردود التي تم إجراؤها في Discourse
  • السماح لمستخدمي Discourse بأن يكونوا فاعلين
  • إنشاء كائنات ملاحظات للردود في Discourse (المشاركات)
  • نشر أنشطة الإنشاء/الحذف/التحديث/التراجع المرتبطة بإجراءات Discourse المكافئة لها
  • قبول الأنشطة المتعلقة بالردود التي تم إجراؤها عن بُعد
  • مرحلة الفاعلين للأنشطة من الخوادم البعيدة كمستخدمي Discourse
  • إنشاء ردود Discourse (مشاركات) من كائنات الملاحظات
  • تحويل الأنشطة المرتبطة بالإنشاء/الحذف/التحديث/التراجع إلى إجراءات Discourse المكافئة لها
  • إضافة إعداد فئة للتبديل بين المنشور الأول فقط (الحالي) و “الموضوع الكامل” الذي يدعم أنشطة الرد.

دعم نشاط الإعجاب

دعم قيام مستخدمي Discourse بالتحقق من هويتهم على Mastodon بحيث ترتبط المشاركات التي تم إنشاؤها من Toots الخاصة بهم بحساب مستخدم Discourse الخاص بهم.

  • السماح للمستخدم بإجراء تدفق مصادقة OAuth الخاصة بـ Mastodon مع خادم Mastodon حيث يتم تخزين حسابه. يبدأ هذا من إعدادات حساب Discourse للمستخدم.
  • باستخدام رمز الوصول الخاص بـ Mastodon لمستخدم Discourse، احصل على معرف AP الخاص بحساب Mastodon الخاص به وقم بتخزينه مع حسابه في Discourse.
  • ربط جميع أنشطة Discourse المرتبطة بأنشطة AP من فاعل يحمل معرف AP لمستخدم Discourse بهذا المستخدم في Discourse، سواء تم إجراؤها قبل أو بعد قيام المستخدم بالتحقق من هويته.
15 إعجابًا

هذا أمر مثير حقًا - مستوى عالٍ جدًا من الاتحاد والتفاعل. :tada:

هل تخططون لإصدارات وسيطة، أم سيكون هذا إصدارًا كبيرًا واحدًا في حوالي 3.5 أشهر؟

قد تكون هناك بعض الإصدارات الوسيطة، لكن لا يمكنني الوعد بأي شيء في هذا الصدد بعد. سأبقيك على اطلاع دائم بما يحدث.

إعجابَين (2)

أتفق 110٪ - هذا يشمل الكثير من الجوانب الرائعة. :tada:

هل هناك أي فرصة لإصدار مرحلي على هذا الصعيد؟

بصراحة، إضافة إصدار مرحلي “للمنشورات العامة كافتراضي” سيكون موضع ترحيب فوري.

إعجابَين (2)

لاحظ أن النشر العام سيعتمد على توحيد إجراءات التحرير (الرصاصة الأولى المدرجة)، على ما أعتقد.

إعجاب واحد (1)

لا يمكنني تقديم أي وعود في هذه المرحلة ولكن قد تكون هناك تحديثات وسيطة لكل من تحديث الاتحاد واستهداف الجمهور (النشر العام).

4 إعجابات

:eyes:

إعجاب واحد (1)

هذه إحدى القيود المعروفة. إلى أن يتم دعم تعديلات الاتحاد، يمنع المكون الإضافي التعديلات على المحتوى المتحد، ولا يوجد تكوين لتعطيل ذلك.

إعجابَين (2)

للتوضيح، كنت أحاول تعديل منشور هنا في ميتا وحصلت على هذا الخطأ.

3 إعجابات

أوه، أنا آسف لسوء الفهم. @feature@meta.discourse.org و @announcements@meta.discourse.org على الأقل يتم ترحيلهما من هنا، وهذا الخيار هو السبب الأول الذي جعلني لا أقوم بتمكين هذا لمنتديات Maker…

إعجابَين (2)

نعم، هذا هو العنصر الأول في المرحلة 2 الذي عملت عليه. في الواقع، يوجد بالفعل طلب سحب (PR) له، لذلك ستحصل على بعض الراحة في هذا الصدد قريبًا.

إعجابَين (2)