السلام عليكم ورحمة الله وبركاته
منذ مدة حاولت استعمال الـ 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
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
التي يمكنك استخدامها
مع شرح تفصيلي أسفل الجدول
[]
تفيد ان هذا العنصر يقبل اكثر من اختيار/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 إذا قابلت مشكلة ما او لديك اقتراح
بالطبع نرحب بأي مساهمة لدينا ❤