خيارات المنتديات الحديثة، ونقل منتدى Discuz إلى NodeBB
بعد توقف تطوير Discuz، هناك حاجة لاختيار بديل للمنتدى. لقد جربت عدة أنواع، وسأشرح بإيجاز الانطباعات وطريقة النقل.
التالي حسب ترتيب GitHub
Discourse
هذا المنتدى هو الأول في الترتيب، ولكنه مبني على ROR. أداء ROR ليس ضعيفًا قليلاً فحسب، بل استهلاك الذاكرة كبير أيضًا، لذا تم التخلي عنه مباشرة.
على سبيل المثال، نظام تسجيل الدخول السابق لدينا كان مبنيًا على ROR. عندما كانت برامج الزحف تتجول في منتدى Discuz الخاص بنا، كان هناك رابط تسجيل دخول تحت كل مشاركة، مع معلمة from مختلفة. بعض برامج الزحف الغبية كانت تزحف إليها جميعًا. كانت هذه الصفحة تعرض فقط مربع تسجيل الدخول، لكنها تسببت في تعطل نظام تسجيل الدخول المبني على ROR، بينما لم يتأثر Discuz الذي كان يُزحف عليه أيضًا بأي اضطراب. استعدوا لتغيير عاداتكم المتعلقة بسرعة وفعالية تكلفة Discuz، وانظروا إن كنتم تستطيعون تحمل ذلك.
Flarum
واجهة هذا المنتدى ممتازة جدًا. وهو مبني على PHP + MySQL، لذا من المفترض ألا تكون هناك مشكلة كبيرة في الأداء، لكن استعلامات SQL الخاصة بالمنتدى لم تتم معالجتها بشكل جيد. عند زيارة منتدى فارغ للمشاركات الأولية، سيكون هناك 100 استعلام SQL، ووقت التحميل يبدأ من 100 مللي ثانية. إذا استخدمت قاعدة بيانات سحابية منخفضة المواصفات، فمن الطبيعي أن تصل إلى 200 مللي ثانية. مع هذه السرعة بالإضافة إلى محتويات التحميل الأخرى، وقت الانتظار يقترب من ثانية واحدة.
NodeBB
هذا مبني باستخدام NoSQL + NodeJS، أداؤه قوي جدًا واستهلاك وحدة المعالجة المركزية منخفض. علاوة على ذلك، فهو يعتمد على اتصال WebSocket طويل الأمد، لذا سرعة الاستجابة سريعة جدًا. يبدأ استهلاك الذاكرة من 1 جيجابايت، لكنه يزداد ببطء. نظرًا لوجود إضافات وواجهات برمجة تطبيقات API شاملة، تم اختيار هذا الخيار.
Apache / Answer
هذا أيضًا جيد جدًا، يشبه Zhihu وStackOverflow. لكنني بحثت في كل مكان ولم أجد طريقة لإزالة ميزات مثل طرح الأسئلة وقبول الإجابات. إذا أمكن إزالتها، فسيكون منتدى يركز على المقالات (المشاركات الرئيسية الطويلة)، وهو مناسب للمنتديات الموجهة نحو الاستراتيجيات التي لا تحتاج إلى الكثير من وظائف التبادل.
FlaskBB / FlaskBB
منتدى مبني على Python، أداؤه جيد جدًا، لكنه لم يتم تحديثه منذ فترة طويلة.
rafalp / Misago
يبدو للوهلة الأولى كمنتدى أنيمي، وهو أيضًا مبني على Python. بدأ المطور العمل عليه قبل بضع سنوات فقط، لكنه نشط جدًا. نظرت إلى الأمر واستخدم مكتبة SocialAuth الخاصة بـ Python، والتي يمكنها دمج طرق تسجيل الدخول المختلفة مثل QQ وWeixin وGoogle، بما في ذلك دمج موقع الويب الخاص بك بسهولة.
بالإضافة إلى ذلك، هناك منتدىان صينيان يبدوان جيدين أيضًا، أحدهما Casbin الذي يحاكي v2ex بدقة، والآخر bbs-go وsymphony يشبهان مدونة CSDN، لكنني لم أجربهما.
نقل Discuz إلى NodeBB
إذا كان لديك موقعك الخاص، فيمكن استخدام إضافتي 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}.
سرعة معالجة API هي 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"، فهذا يعني أن المحتوى لم يتم تهريبه
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']ملاحظة: نشر المشاركة عبر API ومن قبل المستخدم يتبع نفس المنطق، ويخضع لجميع قيود طول النص الخاصة بالمنتدى. وبالمثل، بسبب هذا، فإن timestamp يصبح غير فعال، وسيتم النشر دائمًا وفقًا لأحدث وقت. الحل هو تعديل الطابع الزمني في السطر 16 من src/api/helpers.js، قم بتعليق السطر data.timestamp = Date.now(); مباشرة. تذكر إعادة التعديل بعد الانتهاء من النقل، وإلا سيتمكن المستخدمون أيضًا من تغيير الوقت.
بعد هذا التعديل، ستدعم واجهة API للردود api/v3/topics/{tid} أيضًا تمرير timestamp لتحديد الوقت.