跳至内容
خيارات المنتديات الحديثة، ونقل منتدى Discuz إلى NodeBB

خيارات المنتديات الحديثة، ونقل منتدى Discuz إلى NodeBB

2025-02-17 14:14

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

الترتيب التالي حسب تصنيف Github

discourse

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

لقد تعرضت عدة مواقع لدينا مبنية على ror للانهيار بسبب الزحف الآلي (crawlers)، إنه حقًا غير عملي من حيث التكلفة.

flarum

واجهة هذا المنتدى ممتازة جدًا. مبني على php+mysql، ومن المفترض ألا تكون هناك مشاكل في الأداء، لكن استعلامات SQL في المنتدى لم تتم معالجتها جيدًا. زيارة منتدى فارغ للمشاركة الأولية ستنتج 100 استعلام SQL، وسرعة الفتح تبدأ من 100 مللي ثانية. إذا استخدمت قاعدة بيانات سحابية منخفضة المواصفات، فـ 200 مللي ثانية أمر طبيعي. هذه السرعة بالإضافة إلى محتويات التحميل الأخرى، تجعل وقت الانتظار يقترب من ثانية واحدة.

nodebb

هذا المنتدى مبني على nosql+nodejs، أداؤه قوي، واستهلاك وحدة المعالجة المركزية منخفض جدًا. كما أنه يعتمد على اتصال websocket طويل الأمد، مما يجعل سرعة الاستجابة سريعة جدًا. يبدأ استهلاك الذاكرة من 1 جيجابايت، ولكنه يزداد ببطء. نظرًا لتوفر الإضافات وواجهات برمجة التطبيقات بشكل كامل، تم اختيار هذا المنتدى.

apache / answer

هذا المنتدى جيد جدًا أيضًا، يشبه Zhihu وStackoverflow. لكنني بحثت في كل مكان ولم أجد طريقة لإزالة ميزات مثل “طرح سؤال” و"قبول إجابة". إذا أمكن إزالتها، فسيكون منتدى يركز على المقالات (المشاركات الرئيسية الطويلة)، ويناسب المنتديات الموجهة نحو الاستراتيجيات التي لا تحتاج إلى الكثير من وظائف التفاعل.

flaskbb / flaskbb

منتدى مبني على Python، أداؤه جيد جدًا، لكنه لم يتم تحديثه منذ فترة طويلة.

rafalp / Misago

منتدى يبدو للوهلة الأولى موجهًا لثقافة الأنمي (الثانوية)، وهو أيضًا مبني على Python. بدأ المطور العمل عليه منذ بضع سنوات فقط، لكنه مجتهد جدًا. نظرت إليه واستخدم مكتبة SocialAuth الخاصة بـ Python، والتي يمكنها دمج طرق تسجيل الدخول المختلفة مثل QQ وWeixin وGoogle، بما في ذلك دمج موقعك الخاص بسهولة.

بالإضافة إلى ذلك، هناك منتدىان صينيان يبدوان جيدين، أحدهما Casbin يشبه v2ex بشكل كبير، والآخر bbs-go وsymphony يشبهان مدونة csdn، لكنني لم أجربهما.

نقل Discuz إلى NodeBB

إذا كان لديك موقعك الخاص، فيمكن استخدام إضافتين رسميتين للنقل وتمرير بيانات الاعتماد (passport) لـ NodeBB، وهما: nodebb-plugin-session-sharing أو nodebb-plugin-sso-oauth2-multiple.

أما بالنسبة لاستيراد بيانات Discuz، فلا بد من كتابة الكود بنفسك. يمكنك طلب من الذكاء الاصطناعي كتابة إطار عمل باستخدام Python، ثم تقوم بتعديل الباقي بنفسك.

إذا كنت تحتاج فقط لاستيراد المشاركات، فقم بالتكرار خلال جدول posts في Discuz، حيث كل صف يمثل مشاركة. إذا كان first=1 فهي مشاركة رئيسية (موضوع).

بالنسبة للمشاركة الرئيسية، استدعِ واجهة NodeBB api/v3/topics/. وبالنسبة للرد، استدعِ واجهة api/v3/topics/{tid}. بالنسبة للمستخدمين، يمكن استخدام واجهة إنشاء المستخدم. نظرًا لأنني استخدمت session-sharing، فقد استخدمت واجهة api/session-sharing/user، والاستعلام عن المستخدم يكون عبر api/session-sharing/lookup?id={passport_id}.

سرعة معالجة واجهة برمجة التطبيقات هي 5 مرات في الثانية، لذا استعد للنقل ببطء.

مثال على الاستدعاء:

async def create_topic(title, body, timestamp, category, tags, uid):
    # إنشاء موضوع POST
    data = {
        "cid": category,  # رقم القسم
        "title": title,
        "content": body,
        "timestamp": int(timestamp),  # الوقت بالمللي ثانية
        "tags": tags,
        "_uid": uid   # ناشر المشاركة
    }
    # مفتاح واجهة برمجة التطبيقات للمسؤول
    headers = {"Authorization": f"Bearer 1239383-3323-2323-2323-asd123123123"}
    # الاستدعاء
    async with aiohttp.ClientSession() as session:
        async with session.post(
                'https://xxx.com/api/v3/topics/',
                headers=headers,
                json=data
        ) as response:
            if response.status != 200:
                # إذا كان الخطأ مثل "الرجاء إضافة محتوى للمشاركة، لا يمكن أن يكون أقل من 1"، فهذا يعني أن content لم يتم escape
                response_text = await response.text()
                raise Exception(f"Error creating topic {title}: {response_text}")
            result = await response.json()
            topic_object = result['response']
            return topic_object['tid']

لاحظ أن نشر المشاركة عبر واجهة برمجة التطبيقات ومن قبل المستخدم يتبع نفس المنطق، ويخضع لجميع قيود طول النص في المنتدى. كذلك، بسبب هذا، فإن timestamp يصبح غير فعال حتى إذا تم تعيينه، وسيظل وقت النشر هو الأحدث. الحل هو تعديل الطابع الزمني في السطر 16 من الملف src/api/helpers.js، وذلك بتعليق السطر data.timestamp = Date.now(); مباشرة. تذكر إعادة التعديل بعد الانتهاء من النقل، وإلا سيتمكن المستخدمون أيضًا من تعديل الوقت.

بعد هذا التعديل، ستتمكن واجهة برمجة التطبيقات للرد api/v3/topics/{tid} أيضًا من دعم تمرير timestamp لتحديد الوقت.

آخر تعديل
hugo-builder
hugo-builder · · AI Translated 2... · b96cfe3
مساهمون آخرون
...