تتيح لك قاعدة «النشر إلى Webhook» أتمتة إرسال منشورات موجزات RSS الجديدة إلى نقطة نهاية Webhook التي تحددها فور توفرها. ويمكنك أيضًا ضبط المنشورات التي تُرسل باستخدام كلمات مفتاحية للتصفية. عندما يطابق منشور جديد معاييرك، يُرسل إلى نقطة نهاية Webhook في طلب POST بتنسيق JSON.
بنية بيانات JSON
يحتوي كل طلب POST يُرسل إلى Webhook على عنصرين رئيسيين: post وfeed.
ويحتوي أيضًا على بيانات وصفية للتعرّف على رسالة Webhook. يحدد الحقل version إصدار واجهة Feeder البرمجية لـ Webhook المُرسَل. الإصدار ثابت على 2023-06-26، وسيُحدّث عند إجراء تغييرات غير متوافقة.
{
"version": "2023-06-26",
"message_id": "معرّف UUID فريد لهذه الرسالة، يظل ثابتًا خلال محاولات إعادة الإرسال",
"feed": { ... },
"post": { ... }
}
يحتوي العنصر post على معلومات عن المنشور الفردي:
{
"id": "المعرّف الفريد للمنشور",
"title": "عنوان المنشور",
"url": "عنوان URL الذي يمكن الوصول إلى المنشور من خلاله",
"published": "تاريخ نشر المنشور ووقته",
"content": "محتوى المنشور",
"audio_url": "رابط ملف MP3 المرفق بالمنشور (إن وُجد)",
"image_url": "رابط الصورة المرفقة بالمنشور (إن وُجد)
}
ملاحظة: تكون قيمة published هي null إذا لم يحدّد موجز RSS تاريخ نشر صالحًا.
يوفر العنصر feed معلومات عن الموجز الذي أتى منه المنشور:
{
"id": "المعرّف الفريد للموجز",
"source_url": "عنوان URL للمصدر، مثل عنوان موجز RSS أو Atom",
"public_url": "عنوان URL العام الذي يعرّف به المصدر نفسه",
"title": "عنوان الموجز",
"favicon": "عنوان URL لأيقونة الموجز"
}
قد نضيف عناصر إلى هذه الكائنات مستقبلًا. إذا كانت هناك معلومات ناقصة، يُرجى إخبارنا.
آلية إعادة المحاولة
إذا أخفق طلب، تعيد Feeder المحاولة تلقائيًا. إذا لم يُرجع طلب POST رمز استجابة HTTP بين 200 و399، فسنحاول إعادة إرساله وفق جدول زمني محدد بالثواني:
- إعادة المحاولة 1: بعد 5 ثوانٍ
- إعادة المحاولة 2: بعد 30 ثانية
- إعادة المحاولة 3: بعد 60 ثانية
- إعادة المحاولة 4: بعد 5 دقائق
- إعادة المحاولة 5: بعد 10 دقائق
- إعادة المحاولة 6: بعد 30 دقيقة
- إعادة المحاولة 7: بعد 30 دقيقة
- إعادة المحاولة 8: بعد 30 دقيقة
يُرجى ملاحظة أن آلية إعادة المحاولة هذه لا تعمل إلا عند وقوع أحداث منشورات فعلية، ولا تنطبق على الإشعارات التجريبية. كما قد تتغير المدد الزمنية.
استكشاف الأخطاء وإصلاحها
إذا حدثت أخطاء، يمكنك الاطّلاع عليها في سجل تشغيل الإجراء. انتقل إلى القاعدة التي لا تعمل، ثم اضغط على «فتح سجل الأخطاء».

ستجد هناك مزيدًا من التفاصيل عن طلبات Webhook التي أخفقت.

إعداد Webhook

لإعداد Webhook:
- انتقل إلى صفحة القواعد.
- أنشئ قاعدة جديدة.
- أدخل اسمك والموجزات والمعايير.
- في قسم «ما الذي يجب أن يحدث؟»، اختر «النشر إلى Webhook».
- أدخل عنوان URL الخاص بـ Webhook في الحقل المخصص.
- للتأكد من إعداد كل شيء على نحو صحيح، يمكنك استخدام زر «نشر رسالة تجريبية» لإرسال إشعار تجريبي إلى نقطة النهاية لديك. يُرجى ملاحظة أن هذه مجرد تجربة، ولن تبدأ آلية إعادة المحاولة إذا أخفقت. كذلك، لإرسال المنشور التجريبي، يجب أن يكون لديك موجز واحد على الأقل أُضيفت إليه منشورات في حسابك.
الأمان: التحقق من توقيعات Webhook
للتأكد من أن طلبات Webhook الواردة صادرة فعلًا من Feeder ولم يتم العبث بها، يمكنك التحقق من سر Webhook الذي يُنشأ لكل Webhook. يتضمن كل طلب Webhook ترويسة X-Feeder-Signature تحتوي على توقيع HMAC-SHA256 لنص الطلب.
آلية العمل

- في إعدادات القاعدة، فعّل خيار «متقدم». سيظهر نص في حقل «سر Webhook».
- عندما ترسل Feeder طلب Webhook إلى نقطة النهاية لديك، تحسب قيمة تجزئة HMAC-SHA256 لنص طلب JSON، باستخدام السر بوصفه المفتاح.
- يُرسل التوقيع الناتج في ترويسة
X-Feeder-Signature، مسبوقًا بـsha256=. مثال:
X-Feeder-Signature: sha256=a1b2c3d4e5f6...
- على خادمك، أعد حساب تجزئة HMAC-SHA256 نفسها باستخدام نص الطلب الخام ونسختك من السر، ثم قارنها بالقيمة الموجودة في الترويسة.
ما الفائدة من ذلك؟
- الأصالة: تؤكد أن Feeder هي من أرسلت الطلب، وليس طرفًا ثالثًا.
- السلامة: تضمن عدم تعديل البيانات أثناء نقلها.
التحقق من التوقيع
للتحقق:
- اقرأ نص الطلب الخام كسلسلة نصية، ولا تحلله أولًا.
- احسب HMAC-SHA256 لهذه السلسلة باستخدام السر الخاص بك.
- قارن التوقيع الذي حسبته بقيمة ترويسة
X-Feeder-Signatureباستخدام مقارنة آمنة زمنيًا لمنع هجمات التوقيت.
مثال: Node.js (Express)
const crypto = require("crypto");
const WEBHOOK_SECRET = process.env.FEEDER_WEBHOOK_SECRET;
function verifyFeederSignature(req, res, next) {
const signature = req.headers["x-feeder-signature"];
if (!signature) {
return res.status(401).send("Missing signature");
}
const expectedSignature =
"sha256=" +
crypto.createHmac("sha256", WEBHOOK_SECRET).update(req.body).digest("hex");
const isValid = crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expectedSignature)
);
if (!isValid) {
return res.status(401).send("Invalid signature");
}
next();
}
// Important: use express.raw() so req.body is the raw string, not parsed JSON
app.post(
"/webhook",
express.raw({ type: "application/json" }),
verifyFeederSignature,
(req, res) => {
const payload = JSON.parse(req.body);
// Handle the webhook payload
console.log("Received verified webhook:", payload);
res.sendStatus(200);
}
);
مهم: يجب الوصول إلى نص الطلب الخام للتحقق من التوقيع. إذا حلّل إطار العمل لديك نص JSON قبل حساب HMAC، فقد تختلف السلسلة النصية التي أُعيد تكوينها عن النص الأصلي، وعندها لن يتطابق التوقيع. في Express، استخدم express.raw({ type: "application/json" }) على مسار Webhook كما هو موضح أعلاه.
هل لديك استفسار آخر؟
هل لديك أسئلة؟ راسلنا عبر البريد الإلكتروني support@feeder.co.