ويب هوك: نظام خارجي ينادي موقعك، وكودك يشتغل فوراً

الويب هوك في ابني رابط عام لموقعك، أي نظام خارجي يقدر ينادي عليه، وأول ما ينادي يشتغل كود كتبته أنت داخل موقعك. شركة الشحن ترسل الشحنة تسلّمت — الطلب يتحدّث لحاله ويوصل إشعار للزبون. بوابة دفع ترسل الدفعة نجحت — الاشتراك ينفعّل بدون ما تفتح جوالك. الرابط بهذا الشكل: https://اسم-موقعك.ebnii.com/api/site/اسم-موقعك/hook/اسم-الهوك، ويقبل POST وGET. وما ينفتح للعالم إلا ملف اسمه بالضبط functions/<الاسم>-webhook.js — كل دالة ثانية بموقعك تضل خاصة ما حدا يوصلها من برّا.

نُشر في:

ابدأ مجاناً
تموز ٢٠٢٦+ موعد جديد
سبت
١٢
أحد
١٣
اثنين
١٤
ثلاثاء
١٥
أربعاء
١٦
خميس
١٧
جمعة
١٨
مواعيد الثلاثاء ١٥
٩:٣٠ — أحمد سليمان · قص شعرمؤكد
١١:٠٠ — رنا عوض · صبغةبالانتظار
نموذج موقع تبنيه بابني بالعربي

شو الفرق بين ويب هوك ودالة عادية

الدالة العادية ينادي عليها موقعك من الداخل. الويب هوك ينادي عليه العالم الخارجي. هذا الفرق كله، وهو اللي يفرض كل قرار أمني بعده.

التسمية هي المفتاح الأمني. الملف اللي اسمه ينتهي بـ -webhook.js هو الوحيد اللي له رابط عام. باقي دوالك تضل خاصة تماماً ولا يقدر أي حدا ينادي عليها من برّا — حتى لو عرف أسماءها. يعني إنت تقرر شو تفتح، ملف ملف، بمجرد التسمية.

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

وبيوصلك زيادة عن الدالة العادية: البايتات الأصلية بالضبط كما وصلت، والترويسات بأحرف صغيرة، وباراميترات الرابط، ونوع الطلب. البايتات الأصلية مهمة تحديداً لأن التحقق من توقيع المزوّد يصير عليها هي، مو على نسخة أعيد بناؤها.

رحلة حدث واحد من شركة الشحن لحد إيميل الزبون

الخمس خطوات كلها تصير خلال ثوانٍ وأنت ما فتحت جهازك.

شركة الشحن ترسل الحدث
POST على رابط الهوك مع رقم البوليصة والحالة
دالتك تتحقق من التوقيع
HMAC على البايتات الأصلية بمفتاح محفوظ كسرّ
تحدّث صف الطلب
الحالة تصير بالطريق أو تم التسليم
تبعت إشعار
إيميل للزبون أو رسالة تيليجرام لفريقك
ترد بسرعة
الشغل الطويل ينرحّل لمهمة مؤجّلة
أي شغل يحتاج أكثر من ثوانٍ قليلة يُصفّ كمهمة مؤجّلة بدل ما يصطدم بمهلة العشر ثوانٍ.

خمسة استخدامات واقعية بالسوق

كل صف منها مبني على نفس المكوّن: رابط هوك واحد + دالة تكتب على قاعدة الموقع.

النظام الخارجيشو يرسلشو يعمل موقعك
شركة شحنرقم البوليصة + الحالة الجديدةيحدّث صف الطلب ويرسل للزبون: طلبك بالطريق
بوابة دفع أو مزوّد اشتراكاتالدفعة نجحت أو فشلتيفعّل الاشتراك أو يفتح الوصول للمحتوى المدفوع
خدمة نماذج خارجيةمحتوى النموذج المعبّىيدخل الطلب لقاعدة الموقع بدل ما يضل بصندوق بريد
بوت تيليجرام أو واتساب أعمالالرسالة الواردة من الزبونيحوّلها لطلب داخل موقعك ويرد بقالب جاهز
نظام مخزون أو ERP عندكتغيّر الكمية المتوفرةيخفي المنتج الناقص من المتجر لحاله

من الفكرة للرابط الشغّال

١

اطلبه بالمحادثة

اكتب: اعمل ويب هوك يستقبل تحديث حالة الشحنة من شركة الشحن ويحدّث الطلب. الوكيل يترجمها لملف ومسار وكود.

٢

الوكيل ينشئ الملف بالاسم الصحيح

مثلاً functions/shipping-webhook.js. اللاحقة -webhook هي اللي تخلي الرابط عام، والوكيل يعرف هالقاعدة ويلتزم فيها.

٣

أضف سرّ التوقيع

المفتاح اللي يعطيك إياه المزوّد ينحفظ كسرّ بالخادم، والدالة تقراه باسمه فقط. ما ينزل للمتصفح ولا يطلع بالسجلات.

٤

انشر الموقع عشان يصير للرابط وجود

رابط الهوك مبني على نطاق موقعك المنشور، فقبل النشر ما في عنوان أصلاً يقدر المزوّد ينادي عليه. والنشر ما يحتاج اشتراك: حتى الخطة المجانية تعطيك رابطاً حقيقياً يستقبل أحداثاً.

٥

الصق الرابط عند المزوّد وجرّب

أغلب المزوّدين عندهم زر إرسال حدث تجريبي. شغّله وراقب السجل داخل الدالة حتى تشوف شو وصل بالضبط قبل ما تعتمد عليه.

ويب هوك على ابني مقابل سيرفر تستأجره

البندويب هوك داخل ابنيسيرفر VPS تديره بنفسك
الوقت لأول رابط شغّالدقائق — جملة بالمحادثة ثم نشرشراء سيرفر ودومين وشهادة SSL ونشر ومراقبة
الشهادة والدومينHTTPS جاهز على نطاق موقعكتركّبها وتجدّدها بنفسك
الوصول لقاعدة موقعكمباشر بصلاحية صاحب الموقع من داخل الدالةتكتب طبقة اتصال وتؤمّنها بنفسك
الحماية من نداء شبكة داخليةمفروضة من المنصّة — العناوين الداخلية والميتاداتا مرفوضةمسؤوليتك بالكامل
السقف تحت الضغط٦٠ نداء بالدقيقة لكل IP وموقع، و٢٤٠ بالدقيقة للمشروعحسب حجم السيرفر وإعدادك
مكتبات npmغير متاحة — صندوق QuickJS بلا Nodeأي مكتبة تبيها
الكلفة الشهريةضمن اشتراك ابني بدون فاتورة استضافة منفصلةفاتورة سيرفر شهرية ثابتة حتى لو ما وصل حدث

التحقق من التوقيع — شغلك أنت، والمنصّة تعطيك الأدوات

ابني ما يقدر يتحقق من توقيع المزوّد بدالك، لأن كل مزوّد يوقّع بطريقته وباسم ترويسة مختلفة. اللي يعمله ابني: يسلّمك البايتات الأصلية والترويسات كما وصلت، ويرفض معالج ويب هوك واضح إنه ما قرأ مادة التوقيع أصلاً.

الطريقة الصحيحة بثلاث حركات: اجلب مفتاح التوقيع من الأسرار، احسب HMAC على البايتات الأصلية، وقارن الناتج بترويسة المزوّد باستخدام مقارنة ثابتة الزمن (ebnii.crypto.timingSafeEqual).

ممنوعان شائعان: لا تقارن بعلامة يساوي العادية — المقارنة العادية تسرّب معلومات عبر فروق التوقيت. ولا تعيد بناء النص بتحويل الحمولة لـ JSON من جديد — ترتيب المفاتيح والمسافات بيطلع مختلف عن اللي وقّعه المزوّد، فالتحقق يفشل بلا سبب واضح أو يمر وهو غلط.

عندك بالصندوق كمان: توليد تجزئة، أرقام عشوائية آمنة، معرّفات فريدة، توقيع والتحقق من JWT بـ HS256 وRS256، وقراءة Basic Auth. يعني أغلب مخططات التحقق اللي يستخدمها المزوّدون مغطّاة بلا مكتبة خارجية.

ونصيحة عملية أخيرة: خلي الدالة ترد بسرعة. المزوّدون يعيدون الإرسال إذا تأخرت، فتنتهي بأحداث مكررة. استقبل، تحقق، احفظ، ورجّع رد فوري — وأي شغل تقيل صفّه كمهمة مؤجّلة.

حدود الويب هوك

كلها أرقام مفروضة من المنصّة، وأفضل تصمّم عليها من البداية بدل ما تكتشفها بالإنتاج.

الاسم يحدد النشر

بس functions/<الاسم>-webhook.js له رابط عام. أي ملف ثاني يضل خاص. لا تسمّي دالة داخلية بلاحقة webhook إلا إذا فعلاً بدك تفتحها للعالم.

الموقع لازم يكون منشور

رابط الهوك ما يشتغل قبل النشر. اختبر بعد ما تنشر، بالحدث التجريبي اللي يوفّره المزوّد.

عشر ثوانٍ للتنفيذ

النداء الخارجي مهلته ١٠ ثوانٍ، وبعدها توقف الدالة برسالة انتهت مهلة التنفيذ. الشغل الطويل ينرحّل لمهمة مؤجّلة، وهي تعيد ٣ محاولات بتباعد زمني قبل ما تُعتبر فاشلة.

ثماني نداءات خارجية وخمس رسائل

بالتشغيلة الواحدة. يعني هوك يستقبل حدث ويرسل ١٠ إيميلات مرّة وحدة تصميم غلط — قسّمه على مهام مؤجّلة.

أحجام مقفولة

الحمولة الداخلة حتى ١٠٠ كيلوبايت، وكود الدالة حتى ١٠٠ كيلوبايت، والرد الخارجي اللي تجيبه حتى ٢ ميغابايت.

سقوف النداء

٦٠ نداء بالدقيقة لكل IP وموقع، و٢٤٠ بالدقيقة للمشروع كامل. المزوّد اللي يرسل دفعات ضخمة بيتم تحجيمه ولازم يعيد لاحقاً.

ما في هوية داخل الهوك

هوية المستخدم فاضية دائماً. اعتمد على توقيع المزوّد أو على Basic Auth، ولا تبني منطقك على إن اللي نادى مسجّل دخول.

ما في مزوّد إيميل خارجي

الإرسال من داخل الدالة عبر أداة المنصّة فقط، وهي توصل لأي عنوان. مزوّدات البريد الخارجية محجوبة على مستوى الشبكة برسالة صريحة.

أسئلة شائعة

شو رابط الويب هوك بالضبط؟

بهذا الشكل: https://اسم-موقعك.ebnii.com/api/site/اسم-موقعك/hook/اسم-الهوك. يقبل POST وGET، ويشتغل بس إذا كان عندك ملف اسمه functions/اسم-الهوك-webhook.js داخل الموقع، والموقع منشور.

هل يقدر أي حدا ينادي الرابط؟

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

ليش لازم اسم الملف ينتهي بـ webhook؟

لأن التسمية هي بوابة النشر. بس الملفات اللي تنتهي بـ -webhook.js لها رابط عام، وكل دوالك الثانية تضل مقفولة على الداخل. هذا يمنع الخطأ الأخطر: أن تنكشف دالة إدارية للعالم بالغلط.

شو أعمل إذا المزوّد يرسل أحداث كثيرة بسرعة؟

خلي الهوك يستقبل ويحفظ ويرد بسرعة، وصفّ المعالجة كمهمة مؤجّلة. السقف ٦٠ نداء بالدقيقة لكل IP وموقع و٢٤٠ للمشروع، وأي زيادة تنرفض والمزوّد يعيد الإرسال لاحقاً. المعالجة المؤجّلة تعطيك حتى ١٠ صفوف بالتشغيلة و٥٠٠ باليوم.

هل أقدر أختبره قبل ما أنشر الموقع؟

لا. رابط الهوك يعتمد على الموقع المنشور، وقبل النشر ما يستجيب. الطريقة العملية إنك تنشر أول (النشر متاح حتى على الخطة المجانية)، وبعدها تستخدم زر الحدث التجريبي عند المزوّد.

هل الويب هوك يقدر يكتب بقاعدة بيانات موقعي؟

نعم، من داخل الدالة تقدر تقرأ وتكتب وتحدّث وتحذف بصلاحية صاحب الموقع. الحد الوحيد إن القراءة داخل الدالة تقف عند ٢٠٠ صف بلا إزاحة، وحجم الصف الواحد حتى ٣٢ كيلوبايت.

اقرأ أيضاً

دوال سحابية داخل موقعكمهام مجدولة تشتغل لحالهاربط API خارجي بمفتاح محميربط شركة شحن بموقعكربط نظام مخزون بموقعك

خلي شركة الشحن تحدّث طلباتك بدالك

اكتب بالمحادثة: اعمل ويب هوك يستقبل حالة الشحنة ويحدّث الطلب ويرسل إشعار للزبون — وانسخ الرابط للمزوّد بعد النشر.

ابدأ مجاناً