|العودة للرئيسية
٢٤ مايو ٢٠٢٦

بناء مجمع أخبار: التحديات التقنية والحلول

APIWeb DevelopmentNews

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

أول تحدي كان التعامل مع أكتر من مصدر أخبار API. استخدمت GNews وNewsData كمصادر أساسية. كل API ليها شكل بيانات مختلف (Schema)، وحدود استخدام مختلفة (Rate Limits)، وأسعار مختلفة. عشان أتعامل مع التنوع ده، عملت طبقة تجريد (Abstraction Layer) بتحوّل بيانات كل API لصيغة موحدة. يعني مهما كان المصدر، البيانات بتدخل بنفس الشكل في النظام. ده وفر عليّ إني أضيف مصادر جديدة بسهولة بعد كده من غير ما أغير الكود الأساسي.

إدارة حصص الـ API (API Quota Management) كانت مشكلة حقيقية. GNews بيسمح بـ 100 طلب يومي على الباقة المجانية، وNewsData بيسمح بـ 200. لو استهلكت الحصة من واحد، لازم أتحول للتاني تلقائيًا. عملت نظام توجيه (Routing System) بيتابع استهلاك كل API ويحول الطلبات للمصدر المتاح. كمان عملت Caching ذكي — الأخبار مش بتتغير كل ثانية، فهعمل طلب كل 30 دقيقة وأخزن النتائج. ده قلل استهلاك الـ API بنسبة 90٪.

التخزين المؤقت في PostgreSQL مع Prisma كان عمود النظام. كل خبر بيتخزن في قاعدة البيانات مع البيانات الأساسية: العنوان، الوصف، المصدر، الرابط، الصورة، تاريخ النشر، والتصنيف. استخدمت UUID كـ Primary Key وضفت Indexes على تاريخ النشر والتصنيف عشان البحث يكون سريع. كمان أضفت حقل فريد (Unique) على رابط الخبر عشان أمنع التكرار — أحيانًا نفس الخبر بيجي من أكتر من مصدر.

التلخيص بالذكاء الاصطناعي كان من أمتع الأجزاء. استخدمت OpenRouter للوصول لنماذج لغة مختلفة بسعر معقول. لما خبر جديد بيدخل النظام، ببعته للـ API مع Prompt مخصص: "لخص الخبر ده في 3 جمل بالعربي بطريقة واضحة وموجزة". التلخيص بيخلي المستخدم يقرأ الأخبار بسرعة بدون ما يحتاج يفتح كل مقال. بس واجهت مشكلة — التلخيص بيأخذ وقت (حوالي 3-5 ثواني لكل خبر)، فخليته غير متزامن (Asynchronous) — الخبر بيتخزن أولاً وبعدين التلخيص بيضاف لما يخلص.

خوارزمية الترند (Trending Score) كانت التحدي الذكي. إزاي أحدد إيه الأخبار الأهم؟ عملت خوارزمية بتحسب Score بناءً على عدة عوامل: حداثة الخبر (أخبار آخر ساعة أعلى من أخبار من 3 ساعات)، عدد المصادر اللي نشرت نفس الخبر (لو 3 مصادر نشرت نفس الموضوع ده يعني مهم)، وعدد القراء (كل ما أكثر الناس تقرأه كل ما يرتفع). المعادلة بسيطة بس فعالة: Trending Score = Freshness × 0.4 + Source Count × 0.3 + Read Count × 0.3.

التخصيص بناءً على تاريخ القراءة كان ميزة متقدمة. لما المستخدم بيسجل دخول (عبر NextAuth)، النظام بيتابع إيه التصنيفات اللي بيتابعها أكتر — سياسة، رياضة، تكنولوجيا، إلخ. وبعدين بيعرض له الأخبار في التصنيفات المفضلة أولاً. كمان بيتابع إيه المصادر اللي بيفضلها، فأخبار من المصادر دي بتظهر أعلى. التخصيص ده بيخلي كل مستخدم يشوف واجهة مختلفة مخصصة لاهتماماته.

تحديث الأخبار في الوقت الحقيقي بدون WebSocket كان تحدي. ماكنتش عايز أضيف تعقيد WebSocket عشان الأخبار مش محتاجة تحديث كل ثانية. بدل كده استخدمت فحص دوري (Polling) من جهة العميل — كل دقيقة العميل بيسأل السيرفر "في أخبار جديدة؟". السيرفر بيرجع آخر ID للخبر، ولو اختلف عن اللي عند العميل، يجيب الأخبار الجديدة. من جهة السيرفر، استخدمت Cron Jobs بتشغل كل 15 دقيقة وتجلب أخبار جديدة من كل المصادر.

نصيحتي لأي حد عايز يبني مجمع أخبار: ابدأ بمصدر واحد بس وافهم البيانات كويس قبل ما تضيف مصادر تانية. الـ Caching مش رفاهية — ده ضرورة عشان ماتستهلكش حصتك في أول ساعة. والتلخيص بالذكاء الاصطناعي بيضيف قيمة كبيرة بس خليه Asynchronous عشان ميبطّش النظام. وأهم حاجة: اختبر مع مستخدمين حقيقيين عشان تفهم إيه الأخبار اللي بتهمهم وإيه اللي مش بيفرق معاهم.