السلام عليكم ورحمة الله وبركاته
منذ مدة حاولت استعمال الـ API
الخاص بالدرر السنية
لكنني واجهت بعض الصعوبات منها أن الـ API
يتعامل مع JSONP فقط وأيضًا لن تستطيع التعامل معه بالطرق العادية بسبب الـ CORS
وإن نجحت بتجنب الـ CORS
باستعمال JSONP
فتحصل على الناتج بهيئة HTML
وأيضًا لا يوجد documentation
أو مستند ما يشرح تفاصيل هذا الـ API
وكيفية التعامل معه
فأنا قررت عمل API
وسيط يتجنب مشكلة CORS
ويعطيك البيانات كهيئة JSON
بجانب شرح مفصل للـ API
وكيفية استخدامه
بالاضافة إلى احتواءه على بعض الخصائص الإضافية التي لا توجد في الـ API
الرسمي
- يتم عمل
cache
لكل عملية بحث لمدة5
ثواني - هناك حد للاستخدام:
100
عملية بحث في اليوم لكلIP
يمكنك تعديلهم من ملف config.js
- عمل
fork
أوclone
لهذا المشروع - تثبيت الـ
dependencies
npm install
- تفقد ملف config.js وقم بتعديل ما تريده
- تشغيل الـ
API
npm start
- الـ
API
سيكون متوفر على الرابط التالي
http://localhost:5000
- استخدمه على
localhost
كما تريد أو ارفعه على استضافة أو سيرفر خاص بك
الرابط: Postman
- استعمل
Postman
لتعرف كيف تتعامل مع الـAPI
وترى أمثلة عليه - قم بعمل
fork
للـcollection
لتستخدمه كما تريد - لا تنس تغير الـ
environment
إلىdev
ويمكنك تغير الرابط الخاص بالمتغير{{url}}
ان كنت قد غيرته أو غيرت الـport
لعرض وثائق API التفاعلية:
-
قم بتشغيل الخادم:
npm run dev
-
افتح المتصفح وانتقل إلى:
http://localhost:5000/api-docs
ستجد هنا واجهة Swagger UI التي تتيح لك استكشاف جميع نقاط النهاية المتاحة واختبار الـ API مباشرة من المتصفح.
يحتوي الـ API
على مجموعة من الـ endpoint
- عندما يبدأ الـ
endpoint
بـ/api
فهو هكذا يبحث عن طريق الـAPI
الرسمي الخاص بالدرر السنية - عندما يبدأ الـ
endpoint
بـ/site
فهو هكذا يبحث عن طريق صفحة البحث الخاص بالدرر السنية
للبحث عن الأحاديث يعطي 15
نتيجة
شكل الرد كـ JSON
{
"metadata": {
"length": "عدد نتائج البحث",
"page": "رقم الصفحة",
"removeHTML": "هل عناصر الـ HTML ممسوحة أم لا",
"isCached": "هل هذه النتائج من الـ cache أم لا"
},
"data": [
{
"hadith": "الحديث",
"rawi": "الراوي",
"mohdith": "المحدث",
"book": "الكتاب",
"numberOrPage": "رقم الحديث او الصفحة",
"grade": "درجة الصحة"
}
]
}
للبحث عن الأحاديث يعطي 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": "رابط لكي تبحث عن شرح الحديث"
}
}
]
}
يحضر لك أحاديث مشابهة المقابلة للـ 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": "رابط لكي تبحث عن شرح الحديث"
}
}
]
}
يحضر لك الحديث المقابل للـ 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": "رابط لكي تبحث عن شرح الحديث"
}
}
}
يحضر لك الحديث الصحيح المقابل للـ id
شكل الرد كـ JSON
{
"metadata": {
"isCached": "هل هذه النتائج من الـ cache أم لا"
},
"data": {
"hadith": "الحديث",
"rawi": "الراوي",
"mohdith": "المحدث",
"mohdithId": "رقم المحدث",
"book": "الكتاب",
"bookId": "رقم الكتاب",
"numberOrPage": "رقم الحديث او الصفحة",
"grade": "درجة الصحة",
"hadithId": "رقم الحديث لاستخدامه في البحث عن الأحاديث البديلة أو الحديث البديل الصحيح",
"hasSimilarHadith": "هل الحديث له أحاديث مشابهة أم لا",
"hasAlternateHadithSahih": "هل الحديث له حديث صحيح بديل أم لا",
"similarHadithDorar": "رابط الأحاديث المشابهة في موقع الدرر",
"urlToGetSimilarHadith": "رابط لكي تبحث عن الأحاديث المشابهة",
"hasSharhMetadata": "هل الحديث له شرح أم لا",
"sharhMetadata": {
"id": "رقم الشرح",
"isContainSharh": "هل يحتوى هذا الرد على شرح الحديث أم لا؟",
"urlToGetSharh": "رابط لكي تبحث عن شرح الحديث"
}
}
}
للبحث عن شرح لحديث واحد عن طريق الـ id
شكل الرد كـ JSON
{
"metadata": {
"isCached": "هل هذه النتائج من الـ cache أم لا"
},
"data": {
"hadith": "الحديث",
"rawi": "الراوي",
"mohdith": "المحدث",
"book": "الكتاب",
"numberOrPage": "رقم الحديث او الصفحة",
"grade": "درجة الصحة",
"takhrij": "تخريج الحديث في كتب أخرى",
"hasSharhMetadata": "هل الحديث له شرح أم لا",
"sharhMetadata": {
"id": "رقم الشرح",
"isContainSharh": "هل يحتوى هذا الرد على شرح الحديث أم لا؟",
"urlToGetSharh": "رابط لكي تبحث عن شرح الحديث",
"sharh": "شرح الحديث"
}
}
}
للبحث عن شرح لحديث واحد عن طريقة النص المعطى
شكل الرد كـ JSON
{
"metadata": {
"specialist": "نوع الاحاديث هل هي للمتخصصين أم لا",
"isCached": "هل هذه النتائج من الـ cache أم لا"
},
"data": {
"hadith": "الحديث",
"rawi": "الراوي",
"mohdith": "المحدث",
"book": "الكتاب",
"numberOrPage": "رقم الحديث او الصفحة",
"grade": "درجة الصحة",
"takhrij": "تخريج الحديث في كتب أخرى",
"hasSharhMetadata": "هل الحديث له شرح أم لا",
"sharhMetadata": {
"id": "رقم الشرح",
"isContainSharh": "هل يحتوى هذا الرد على شرح الحديث أم لا؟",
"urlToGetSharh": "رابط لكي تبحث عن شرح الحديث",
"sharh": "شرح الحديث"
}
}
}
للبحث عن شرح للأحاديث يعطي 30
نتيجة
شكل الرد كـ JSON
{
"metadata": {
"length": "عدد نتائج البحث",
"page": "رقم الصفحة",
"removeHTML": "هل عناصر الـ HTML ممسوحة أم لا",
"specialist": "نوع الاحاديث هل هي للمتخصصين أم لا",
"isCached": "هل هذه النتائج من الـ cache أم لا"
},
"data": [
{
"hadith": "الحديث",
"rawi": "الراوي",
"mohdith": "المحدث",
"book": "الكتاب",
"numberOrPage": "رقم الحديث او الصفحة",
"grade": "درجة الصحة",
"takhrij": "تخريج الحديث في كتب أخرى",
"hasSharhMetadata": "هل الحديث له شرح أم لا",
"sharhMetadata": {
"id": "رقم الشرح",
"isContainSharh": "هل يحتوى هذا الرد على شرح الحديث أم لا؟",
"urlToGetSharh": "رابط لكي تبحث عن شرح الحديث",
"sharh": "شرح الحديث"
}
}
]
}
للبحث عن معلومات عن المحدث عن طريق الـ id
شكل الرد كـ JSON
{
"metadata": {
"isCached": "هل هذه النتائج من الـ cache أم لا"
},
"data": {
"name": "المحدث",
"mohdithId": "رقم المحدث",
"info": "معلومات عن المحدث"
}
}
للبحث عن معلومات عن الكتاب عن طريق الـ id
شكل الرد كـ JSON
{
"metadata": {
"isCached": "هل هذه النتائج من الـ cache أم لا"
},
"data": {
"name": "الكتاب",
"bookId": "رقم الكتاب",
"author": "المؤلف",
"reviewer": "المراجع",
"publisher": "دار النشر",
"edition": "رقم الطبعة",
"editionYear": "سنة الطبعة"
}
}
عناصر الـ query
التي يمكنك استخدامها
مع شرح تفصيلي أسفل الجدول
key | الوصف |
---|---|
value |
وهي محتوى نص الحديث المراد البحث عنه |
page |
لتحديد الصفحة التي تريدها |
removehtml |
حذف عناصر الـ HTML في الحديث |
specialist |
تستخدم لتحدد نوع الاحاديث هل هي للمتخصصين أم لا |
xclude |
كلمة أو جملة تريد استبعادها من البحث |
st |
تحدد طريقة البحث |
t |
تحديد نطاق البحث |
d[] |
تحديد درجة الحديث سواء صحيح ام ضعيف |
m[] |
تحديد اسماء المحدثين التي تريدهم |
s[] |
تحديد الكتب التي تريد البحث فيها |
rawi[] |
تحديد اسماء الرواة التي تريدهم |
- هذه الاقواس
[]
تفيد ان هذا العنصر يقبل اكثر من اختيار
- محتوى نص الحديث المراد البحث عنه
- مثال:
/v1/api/hadith/search?value=جملة البحث
هكذا سيبحث بناءًا على جملة البحث
- لتحديد الصفحة التي تريدها
- مثال:
/v1/api/hadith/search?value=جملة البحث&page=1
هكذا سيبحث في نتائج البحث للصفحة الثالثة أي المجموعة الثالثة لنتائج البحث - القيمة الافتراضية ستكون الصفحة رقم واحد
page=1
- حذف عناصر الـ
HTML
في الحديث
مثل<span class="search-keys">...</span>
- مثال:
/v1/api/hadith/search?value=جملة البحث&removehtml=true
هكذا سيمسح عناصر الـHTML
من نتائج البحث - القيمة الافتراضي هي
true
- تستخدم لتحدد نوع الاحاديث هل هي للمتخصصين أم لا
- قيمها هي
true
للمتخصصين وfalse
لغير المتخصصين - مثال:
/v1/api/hadith/search?value=جملة البحث&specialist=true
سيعطيك أحاديث أكثر ومختلفة خاصة للمتخصصين
وتكون بها معلومة اضافية مثل تخريج الأحاديث في الكتب الأخرى - القيمة الافتراضية هي
false
- كلمة أو جملة تريد استبعادها من البحث مثال
- مثال:
/v1/api/hadith/search?value=جملة البحث&xclude=اليهود
هكذا سيستبعد كلمةاليهود
من البحث
- تحدد طريقة البحث بثلاثة خيارات فقط
- هذه الطرق هي:
جميع الكلمات
،أي كلمة
،بحث مطابق
- قيمها هي:
w
,a
,p
للبحث بـجميع الكلمات
فستكونst=w
للبحث بـأي كلمة
فستكونst=a
للبحث بـبحث مطابق
فستكونst=p
- مثال:
/v1/api/hadith/search?value=جملة البحث&st=p
هكذا سيبحث بشكل مطابق لجملة البحث
كل القيم وطرق البحث التي تمثلها
أو يمكنك الحصول عليها كملف JSON
من هنا
- تحديد نطاق البحث
- هذه النطاقات هي:
جميع الأحاديث
،الأحاديث المرفوعة
،الأحاديث القدسية
،آثار الصحابة
،شروح الأحاديث
- قيمها هي:
*
,0
,1
,2
,3
للبحث عنجميع الأحاديث
فستكونt=*
للبحث عنالأحاديث المرفوعة
فستكونt=0
للبحث عنالأحاديث القدسية
فستكونt=1
للبحث عنآثار الصحابة
فستكونt=2
للبحث عنشروح الأحاديث
فستكونt=3
- مثال:
/v1/api/hadith/search?value=جملة البحث&t=1
هكذا سيبحث فقط عن الأحاديث القدسية المطابق لجملة البحث
كل القيم ونطاقات البحث التي تمثلها
أو يمكنك الحصول عليها كملف JSON
من هنا
- تحديد درجة الحديث سواء صحيح ام ضعيف
- قيمها هي:
0
،1
،2
،3
،4
للبحث عنجميع الدرجات
فستكونd[]=0
للبحث عنأحاديث حكم المحدثون عليها بالصحة
فستكونd[]=1
للبحث عنأحاديث حكم المحدثون على أسانيدها بالصحة
فستكونd[]=2
للبحث عنأحاديث حكم المحدثون عليها بالضعف
فستكونd[]=3
للبحث عنأحاديث حكم المحدثون على أسانيدها بالضعف
فستكونd[]=4
- مثال:
/v1/api/hadith/search?value=جملة البحث&d[]=3
هكذا سيبحث فقط عن الأحاديث المحكوم عليها بالضعف - يمكنك تحديد اكثر من اختيار
مثال:/v1/api/hadith/search?value=جملة البحث&d[]=1&d[]=2
هكذا سيبحث فقط عن الأحاديث المحكوم عليها بالصحة من ناحية المتن و الاسناد
كل القيم والدرجات التي تمثلها
أو يمكنك الحصول عليها كملف JSON
من هنا
- تحديد اسماء المحدثين التي تريدهم
- قيمها متعددة ومنها:
0
،179
،204
،256
،261
... إلخ
حيث0
تمثلجميع المحدثين
و179
تمثلالإمام المالك
و204
تمثلالإمام الشافعي
و256
تمثلالبخاري
و261
تمثلمسلم
- مثال:
/v1/api/hadith/search?value=جملة البحث&m[]=179
هكذا سيبحث فقط عن الأحاديث التي حدث بها الإمام مالك - يمكنك تحديد اكثر من اختيار
مثال:/v1/api/hadith/search?value=جملة البحث&m[]=256&m[]=261
هكذا سيبحث فقط عن الأحاديث التي حدثا بها بخاري ومسلم
كل القيم وأسماء المحدثين التي تمثلها
أو يمكنك الحصول عليها كملف JSON
من هنا
- تحديد الكتب التي تريد البحث فيها
- قيمها متعددة ومنها:
0
،13457
،6216
،3088
،96
... إلخ
حيث0
تمثلجميع المحدثين
و13457
تمثلالأربعون النووية
و6216
تمثلصحيح البخاري
و3088
تمثلصحيح مسلم
و96
تمثلالصحيح المسند
- مثال:
/v1/api/hadith/search?value=جملة البحث&s[]=96
هكذا سيبحث فقط عن الأحاديث الواردة في كتاب الصحيح المسند - يمكنك تحديد اكثر من اختيار
مثال:/v1/api/hadith/search?value=جملة البحث&s[]=6216&s[]=13457
هكذا سيبحث فقط عن الأحاديث التي وردت في كتابي الأربعون النووية وكتاب صحيح البخاري
كل القيم وأسماء الكتب التي تمثلها
أو يمكنك الحصول عليها كملف JSON
من هنا
- تحديد اسماء الرواة التي تريدهم
- قيمها متعددة ومنها:
0
،1819
،8918
،2664
... إلخ
حيث0
تمثلجميع الرواة
حيث1819
تمثلأسماء بنت أبي بكر
و8918
تمثلعمر بن الخطاب
و2664
تمثلابن عباس
- مثال:
/v1/api/hadith/search?value=جملة البحث&rawi[]=1819
هكذا سيبحث فقط عن الأحاديث التي رواتها أسماء بنت أبي بكر - يمكنك تحديد اكثر من اختيار
مثال:/v1/api/hadith/search?value=جملة البحث&rawi[]=8918&rawi[]=2664
هكذا سيبحث فقط عن الأحاديث التي رواها عمر بن الخطاب وابن عباس - هنا قيم ترمز لأكثر من شخص في آن واحد
مثل2665
ترمز لـابن عباس أو أبو هريرة
و8924
ترمز لـعمر بن الخطاب وأبو هريرة
و264
ترمز لـأبو الدرداء وأبو أمامة وعبدالله بن عمر وابن عباس وجابر بن عبدالله
كل القيم وأسماء الرواة التي تمثلها
أو يمكنك الحصول عليها كملف JSON
من هنا
كل البيانات المتاحة والقيم التي تمثلها يمكنكم الحصول عليه من هذه الـ 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 إذا قابلت مشكلة ما او لديك اقتراح
بالطبع نرحب بأي مساهمة لدينا ❤