AhmedElTabarani / dorar-hadith-api

API وسيط للـدرر السنية
MIT License
75 stars 16 forks source link
api hadith islamic search

Dorar.net Hadith API

السلام عليكم ورحمة الله وبركاته

منذ مدة حاولت استعمال الـ API الخاص بالدرر السنية
لكنني واجهت بعض الصعوبات منها أن الـ API يتعامل مع JSONP فقط وأيضًا لن تستطيع التعامل معه بالطرق العادية بسبب الـ CORS

وإن نجحت بتجنب الـ CORS باستعمال JSONP فتحصل على الناتج بهيئة HTML وأيضًا لا يوجد documentation أو مستند ما يشرح تفاصيل هذا الـ API وكيفية التعامل معه

فأنا قررت عمل API وسيط يتجنب مشكلة CORS ويعطيك البيانات كهيئة JSON بجانب شرح مفصل للـ API وكيفية استخدامه
بالاضافة إلى احتواءه على بعض الخصائص الإضافية التي لا توجد في الـ API الرسمي

تنبيه

يمكنك تعديلهم من ملف config.js

تشغيل الـ API

  1. عمل fork أو clone لهذا المشروع
  2. تثبيت الـ dependencies
npm install
  1. تفقد ملف config.js وقم بتعديل ما تريده
  2. تشغيل الـ API
npm start
  1. الـ API سيكون متوفر على الرابط التالي
http://localhost:5000
  1. استخدمه على localhost كما تريد أو ارفعه على استضافة أو سيرفر خاص بك

Documentation

Postman

الرابط: Postman

OpenAPI v3 (Swagger)

وثائق API

لعرض وثائق API التفاعلية:

  1. قم بتشغيل الخادم:

    npm run dev
  2. افتح المتصفح وانتقل إلى:

    http://localhost:5000/api-docs

ستجد هنا واجهة Swagger UI التي تتيح لك استكشاف جميع نقاط النهاية المتاحة واختبار الـ API مباشرة من المتصفح.

Endpoints

يحتوي الـ API على مجموعة من الـ endpoint

/v1/api/hadith/search?value={text}

للبحث عن الأحاديث يعطي 15 نتيجة

شكل الرد كـ JSON

{
  "metadata": {
    "length": "عدد نتائج البحث",
    "page": "رقم الصفحة",
    "removeHTML": "هل عناصر الـ HTML ممسوحة أم لا",
    "isCached": "هل هذه النتائج من الـ cache أم لا"
  },
  "data": [
    {
      "hadith": "الحديث",
      "rawi": "الراوي",
      "mohdith": "المحدث",
      "book": "الكتاب",
      "numberOrPage": "رقم الحديث او الصفحة",
      "grade": "درجة الصحة"
    }
  ]
}

/v1/site/hadith/search?value={text}

للبحث عن الأحاديث يعطي 30 نتيجة

شكل الرد كـ JSON

{
  "metadata": {
    "length": "عدد نتائج البحث",
    "page": "رقم الصفحة",
    "removeHTML": "هل عناصر الـ HTML ممسوحة أم لا",
    "specialist": "نوع الاحاديث هل هي للمتخصصين أم لا",
    "numberOfNonSpecialist": "عدد الأحاديث لغير المتخصصين",
    "numberOfSpecialist": "عدد الأحاديث للمتخصصين",
    "isCached": "هل هذه النتائج من الـ cache أم لا"
  },
  "data": [
    {
      "hadith": "الحديث",
      "rawi": "الراوي",
      "mohdith": "المحدث",
      "mohdithId": "رقم المحدث",
      "book": "الكتاب",
      "bookId": "رقم الكتاب",
      "numberOrPage": "رقم الحديث او الصفحة",
      "grade": "درجة الصحة",
      "explainGrade": "توضيح درجة الصحة",
      "takhrij": "تخريج الحديث في كتب أخرى",
      "hadithId": "رقم الحديث لاستخدامه في البحث عن الأحاديث البديلة أو الحديث البديل الصحيح",
      "hasSimilarHadith": "هل الحديث له أحاديث مشابهة أم لا",
      "hasAlternateHadithSahih": "هل الحديث له حديث صحيح بديل أم لا",
      "similarHadithDorar": "رابط الأحاديث المشابهة في موقع الدرر",
      "alternateHadithSahihDorar": "رابط الحديث الصحيح في موقع الدرر",
      "urlToGetSimilarHadith": "رابط لكي تبحث عن الأحاديث المشابهة",
      "urlToGetAlternateHadithSahih": "رابط لكي تبحث عن الحديث الصحيح",
      "hasSharhMetadata": "هل الحديث له شرح أم لا",
      "sharhMetadata": {
        "id": "رقم الشرح",
        "isContainSharh": "هل يحتوى هذا الرد على شرح الحديث أم لا؟",
        "urlToGetSharh": "رابط لكي تبحث عن شرح الحديث"
      }
    }
  ]
}

/v1/site/hadith/similar/:id

يحضر لك أحاديث مشابهة المقابلة للـ id

شكل الرد كـ JSON

{
  "metadata": {
    "length": "عدد نتائج البحث",
    "isCached": "هل هذه النتائج من الـ cache أم لا"
  },
  "data": [
    {
      "hadith": "الحديث",
      "rawi": "الراوي",
      "mohdith": "المحدث",
      "mohdithId": "رقم المحدث",
      "book": "الكتاب",
      "bookId": "رقم الكتاب",
      "numberOrPage": "رقم الحديث او الصفحة",
      "grade": "درجة الصحة",
      "explainGrade": "توضيح درجة الصحة",
      "hadithId": "رقم الحديث لاستخدامه في البحث عن الأحاديث البديلة أو الحديث البديل الصحيح",
      "hasSimilarHadith": "هل الحديث له أحاديث مشابهة أم لا",
      "hasAlternateHadithSahih": "هل الحديث له حديث صحيح بديل أم لا",
      "similarHadithDorar": "رابط الأحاديث المشابهة في موقع الدرر",
      "alternateHadithSahihDorar": "رابط الحديث الصحيح في موقع الدرر",
      "urlToGetSimilarHadith": "رابط لكي تبحث عن الأحاديث المشابهة",
      "urlToGetAlternateHadithSahih": "رابط لكي تبحث عن الحديث الصحيح",
      "hasSharhMetadata": "هل الحديث له شرح أم لا",
      "sharhMetadata": {
        "id": "رقم الشرح",
        "isContainSharh": "هل يحتوى هذا الرد على شرح الحديث أم لا؟",
        "urlToGetSharh": "رابط لكي تبحث عن شرح الحديث"
      }
    }
  ]
}

/v1/site/hadith/:id

يحضر لك الحديث المقابل للـ id

شكل الرد كـ JSON

{
  "metadata": {
    "isCached": "هل هذه النتائج من الـ cache أم لا"
  },
  "data": {
    "hadith": "الحديث",
    "rawi": "الراوي",
    "mohdith": "المحدث",
    "mohdithId": "رقم المحدث",
    "book": "الكتاب",
    "bookId": "رقم الكتاب",
    "numberOrPage": "رقم الحديث او الصفحة",
    "grade": "درجة الصحة",
    "explainGrade": "توضيح درجة الصحة",
    "hadithId": "رقم الحديث لاستخدامه في البحث عن الأحاديث البديلة أو الحديث البديل الصحيح",
    "hasSimilarHadith": "هل الحديث له أحاديث مشابهة أم لا",
    "hasAlternateHadithSahih": "هل الحديث له حديث صحيح بديل أم لا",
    "similarHadithDorar": "رابط الأحاديث المشابهة في موقع الدرر",
    "alternateHadithSahihDorar": "رابط الحديث الصحيح في موقع الدرر",
    "urlToGetSimilarHadith": "رابط لكي تبحث عن الأحاديث المشابهة",
    "urlToGetAlternateHadithSahih": "رابط لكي تبحث عن الحديث الصحيح",
    "hasSharhMetadata": "هل الحديث له شرح أم لا",
    "sharhMetadata": {
      "id": "رقم الشرح",
      "isContainSharh": "هل يحتوى هذا الرد على شرح الحديث أم لا؟",
      "urlToGetSharh": "رابط لكي تبحث عن شرح الحديث"
    }
  }
}

/v1/site/hadith/alternate/:id

يحضر لك الحديث الصحيح المقابل للـ id

شكل الرد كـ JSON

{
  "metadata": {
    "isCached": "هل هذه النتائج من الـ cache أم لا"
  },
  "data": {
    "hadith": "الحديث",
    "rawi": "الراوي",
    "mohdith": "المحدث",
    "mohdithId": "رقم المحدث",
    "book": "الكتاب",
    "bookId": "رقم الكتاب",
    "numberOrPage": "رقم الحديث او الصفحة",
    "grade": "درجة الصحة",
    "hadithId": "رقم الحديث لاستخدامه في البحث عن الأحاديث البديلة أو الحديث البديل الصحيح",
    "hasSimilarHadith": "هل الحديث له أحاديث مشابهة أم لا",
    "hasAlternateHadithSahih": "هل الحديث له حديث صحيح بديل أم لا",
    "similarHadithDorar": "رابط الأحاديث المشابهة في موقع الدرر",
    "urlToGetSimilarHadith": "رابط لكي تبحث عن الأحاديث المشابهة",
    "hasSharhMetadata": "هل الحديث له شرح أم لا",
    "sharhMetadata": {
      "id": "رقم الشرح",
      "isContainSharh": "هل يحتوى هذا الرد على شرح الحديث أم لا؟",
      "urlToGetSharh": "رابط لكي تبحث عن شرح الحديث"
    }
  }
}

/v1/site/sharh/:id

للبحث عن شرح لحديث واحد عن طريق الـ id

شكل الرد كـ JSON

{
  "metadata": {
    "isCached": "هل هذه النتائج من الـ cache أم لا"
  },
  "data": {
    "hadith": "الحديث",
    "rawi": "الراوي",
    "mohdith": "المحدث",
    "book": "الكتاب",
    "numberOrPage": "رقم الحديث او الصفحة",
    "grade": "درجة الصحة",
    "takhrij": "تخريج الحديث في كتب أخرى",
    "hasSharhMetadata": "هل الحديث له شرح أم لا",
    "sharhMetadata": {
      "id": "رقم الشرح",
      "isContainSharh": "هل يحتوى هذا الرد على شرح الحديث أم لا؟",
      "urlToGetSharh": "رابط لكي تبحث عن شرح الحديث",
      "sharh": "شرح الحديث"
    }
  }
}

/v1/site/sharh/text/:text

للبحث عن شرح لحديث واحد عن طريقة النص المعطى

شكل الرد كـ JSON

{
  "metadata": {
    "specialist": "نوع الاحاديث هل هي للمتخصصين أم لا",
    "isCached": "هل هذه النتائج من الـ cache أم لا"
  },
  "data": {
    "hadith": "الحديث",
    "rawi": "الراوي",
    "mohdith": "المحدث",
    "book": "الكتاب",
    "numberOrPage": "رقم الحديث او الصفحة",
    "grade": "درجة الصحة",
    "takhrij": "تخريج الحديث في كتب أخرى",
    "hasSharhMetadata": "هل الحديث له شرح أم لا",
    "sharhMetadata": {
      "id": "رقم الشرح",
      "isContainSharh": "هل يحتوى هذا الرد على شرح الحديث أم لا؟",
      "urlToGetSharh": "رابط لكي تبحث عن شرح الحديث",
      "sharh": "شرح الحديث"
    }
  }
}

/v1/site/sharh/search?value={text}

للبحث عن شرح للأحاديث يعطي 30 نتيجة

شكل الرد كـ JSON

{
  "metadata": {
    "length": "عدد نتائج البحث",
    "page": "رقم الصفحة",
    "removeHTML": "هل عناصر الـ HTML ممسوحة أم لا",
    "specialist": "نوع الاحاديث هل هي للمتخصصين أم لا",
    "isCached": "هل هذه النتائج من الـ cache أم لا"
  },
  "data": [
    {
      "hadith": "الحديث",
      "rawi": "الراوي",
      "mohdith": "المحدث",
      "book": "الكتاب",
      "numberOrPage": "رقم الحديث او الصفحة",
      "grade": "درجة الصحة",
      "takhrij": "تخريج الحديث في كتب أخرى",
      "hasSharhMetadata": "هل الحديث له شرح أم لا",
      "sharhMetadata": {
        "id": "رقم الشرح",
        "isContainSharh": "هل يحتوى هذا الرد على شرح الحديث أم لا؟",
        "urlToGetSharh": "رابط لكي تبحث عن شرح الحديث",
        "sharh": "شرح الحديث"
      }
    }
  ]
}

/v1/site/mohdith/:id

للبحث عن معلومات عن المحدث عن طريق الـ id

شكل الرد كـ JSON

{
  "metadata": {
    "isCached": "هل هذه النتائج من الـ cache أم لا"
  },
  "data": {
    "name": "المحدث",
    "mohdithId": "رقم المحدث",
    "info": "معلومات عن المحدث"
  }
}

/v1/site/book/:id

للبحث عن معلومات عن الكتاب عن طريق الـ id

شكل الرد كـ JSON

{
  "metadata": {
    "isCached": "هل هذه النتائج من الـ cache أم لا"
  },
  "data": {
    "name": "الكتاب",
    "bookId": "رقم الكتاب",
    "author": "المؤلف",
    "reviewer": "المراجع",
    "publisher": "دار النشر",
    "edition": "رقم الطبعة",
    "editionYear": "سنة الطبعة"
  }
}

Query

عناصر الـ query التي يمكنك استخدامها
مع شرح تفصيلي أسفل الجدول

| key | الوصف | | :----------------------------: | :---------------------------------------------: | | `value` | وهي محتوى نص الحديث المراد البحث عنه | | `page` | لتحديد الصفحة التي تريدها | | `removehtml` | حذف عناصر الـ `HTML` في الحديث | | `specialist` | تستخدم لتحدد نوع الاحاديث هل هي للمتخصصين أم لا | | `xclude` | كلمة أو جملة تريد استبعادها من البحث | | `st` | تحدد طريقة البحث | | `t` | تحديد نطاق البحث | | `d[]` | تحديد درجة الحديث سواء صحيح ام ضعيف | | `m[]` | تحديد اسماء المحدثين التي تريدهم | | `s[]` | تحديد الكتب التي تريد البحث فيها | | `rawi[]` | تحديد اسماء الرواة التي تريدهم |

value

page

removehtml

specialist

xclude

st

كل القيم وطرق البحث التي تمثلها
أو يمكنك الحصول عليها كملف JSON من هنا

t

كل القيم ونطاقات البحث التي تمثلها
أو يمكنك الحصول عليها كملف JSON من هنا

d[]

كل القيم والدرجات التي تمثلها
أو يمكنك الحصول عليها كملف JSON من هنا

m[]

كل القيم وأسماء المحدثين التي تمثلها
أو يمكنك الحصول عليها كملف JSON من هنا

s[]

كل القيم وأسماء الكتب التي تمثلها
أو يمكنك الحصول عليها كملف JSON من هنا

rawi[]

كل القيم وأسماء الرواة التي تمثلها
أو يمكنك الحصول عليها كملف JSON من هنا

Data

كل البيانات المتاحة والقيم التي تمثلها يمكنكم الحصول عليه من هذه الـ endpoints

[
  {
    "endpoint": "/v1/data/book",
    "description": "احضار كل الكتب المتاحة",
    "abstractResponse": [
      {
        "key": "الكلمة  المفتاحية",
        "value": "القيمة"
      }
    ]
  },
  {
    "endpoint": "/v1/data/degree",
    "description": "احضار كل درجات الحديث المتاحة",
    "abstractResponse": [
      {
        "key": "الكلمة  المفتاحية",
        "value": "القيمة"
      }
    ]
  },
  {
    "endpoint": "/v1/data/methodSearch",
    "description": "احضار كل طرق البحث المتاحة",
    "abstractResponse": [
      {
        "key": "الكلمة  المفتاحية",
        "value": "القيمة"
      }
    ]
  },
  {
    "endpoint": "/v1/data/mohdith",
    "description": "احضار كل المحدثين المتاحين",
    "abstractResponse": [
      {
        "key": "الكلمة  المفتاحية",
        "value": "القيمة"
      }
    ]
  },
  {
    "endpoint": "/v1/data/rawi",
    "description": "احضار كل الرواة المتاحين",
    "abstractResponse": [
      {
        "key": "الكلمة  المفتاحية",
        "value": "القيمة"
      }
    ]
  },
  {
    "endpoint": "/v1/data/zoneSearch",
    "description": "احضار كل نطاقات البحث المتاحة",
    "abstractResponse": [
      {
        "key": "الكلمة  المفتاحية",
        "value": "القيمة"
      }
    ]
  }
]

توجد مشكلة أو لديك اقتراح؟

افتح issue إذا قابلت مشكلة ما او لديك اقتراح

المساهمة

بالطبع نرحب بأي مساهمة لدينا ❤