الأقسام: أساسيات API · رسالة نصية · قالب مع متغيرات · صورة ومستند · أزرار تفاعلية · موقع · إرسال مجمّع مع تحديد المعدل · معالجة الأخطاء والمحاولة المتكررة · أغلفة فئات كاملة (Node / Python / PHP)
أساسيات API: نقطة الوصول الوحيدة التي يمر عبرها كل شيء
كل رسالة WhatsApp صادرة — بغض النظر عن النوع — تمر عبر نقطة وصول HTTP POST واحدة. نوع الرسالة ومحتواها في جسم JSON. هذا كل شيء. لا WebSockets، ولا streaming، ولا long-polling.
API Endpoint
POST https://graph.facebook.com/v21.0/{PHONE_NUMBER_ID}/messages
Authorization: Bearer {ACCESS_TOKEN}
Content-Type: application/json
// PHONE_NUMBER_ID — معرّف رقمي لرقم WhatsApp الخاص بك (وليس رقم الهاتف نفسه)// أين تجده: Meta Developer Dashboard ← WhatsApp ← Phone Numbers// ACCESS_TOKEN — رمز System User دائم// أين تجده: Meta Business Settings ← System Users ← Generate Token
ثلاث قيم تحتاجها قبل تشغيل أي كود:
Phone Number ID — معرّف رقمي لرقم WhatsApp Business الخاص بك (يبدو مثل 123456789012345). مختلف عن رقم هاتفك الفعلي.
Access Token — رمز System User دائم بصلاحية whatsapp_business_messaging. لا تستخدم أبداً رمز مستخدم مؤقت في الإنتاج.
رقم هاتف المستلم — بصيغة E.164: رمز الدولة + الرقم، بدون مسافات أو شُرَط أو علامة + في قيمة JSON (مثلاً 15550001234 لرقم أمريكي، أو مع + مقبول أيضاً: +15550001234).
قبل اختيار نوع الرسالة، تحتاج أن تعرف ما إذا كنت داخل نافذة الخدمة. نافذة الجلسة (24 ساعة بعد أن يراسلك العميل، أو 72 ساعة بعد نقرة إعلان Click-to-WhatsApp) تحدد أنواع الرسائل المجانية وغير المقيدة.
💬
text
نص عادي. مدعوم بتنسيق WhatsApp شبيه بالـ markdown. حتى 4,096 حرفاً.
مجاني داخل النافذة
📋
template
صيغة معتمدة مسبقاً بخانات متغيرات. مطلوب لبدء الاتصال خارج النافذة.
يتطلب موافقة
🖼️
image
JPEG أو PNG. حد أقصى 5 ميجابايت. URL أو media ID. تعليق اختياري.
مجاني داخل النافذة
📄
document
PDF أو DOCX أو XLSX. حد أقصى 100 ميجابايت. URL أو media ID. اسم الملف ظاهر.
مجاني داخل النافذة
🎬
video
MP4 أو 3GPP. حد أقصى 16 ميجابايت. URL أو media ID. تعليق اختياري.
مجاني داخل النافذة
🔘
interactive
ردود أزرار (حد أقصى 3) أو رسائل قوائم (حد أقصى 10 عناصر). العميل ينقر للرد.
مجاني داخل النافذة
📍
location
أرسل خط العرض/الطول مع اسم وعنوان اختياريين. يُعرض على خريطة في WhatsApp.
مجاني داخل النافذة
🎵
audio
MP3 أو AAC. حد أقصى 16 ميجابايت. URL أو media ID. لا يدعم التعليقات.
مجاني داخل النافذة
إرسال رسالة نصية
أبسط إرسال. يعمل داخل نافذة الخدمة لـ 24 ساعة دون أي رسوم من Meta (ضمن حصة 1,000 محادثة خدمة مجانية/شهر). خارج النافذة، استخدم قالباً بدلاً من ذلك.
القوالب مطلوبة للرسالة الأولى في محادثة جديدة، أو أي رسالة تُرسَل خارج نافذة الخدمة لـ 24 ساعة. تُعرَّف القوالب في WhatsApp Manager، وتعتمدها Meta، ويمكن أن تتضمن خانات متغيرات {{1}}{{2}}. استدعاء API الخاص بك يملأ هذه المتغيرات وقت الإرسال.
توقيت اعتماد القالب: قوالب المرافق البسيطة (تأكيدات الطلبات، تحديثات الشحن) عادةً تُعتمد خلال 1–24 ساعة. قوالب التسويق تستغرق 1–5 أيام عمل. يمكنك التحقق من حالة الاعتماد عبر اشتراك webhook message_template_status_update أو في WhatsApp Manager. القوالب ذات الحالة المرفوضة لا يمكن إرسالها — إرسال قالب غير APPROVED يُعيد خطأ 400.
رسائل الوسائط تشير إلى ملف إما عبر URL (يجب أن يكون الملف متاحاً علناً عبر HTTPS) أو عبر Media ID (يُحصل عليه بعد رفع الملف إلى نقطة وسائط Meta). الـ URL أبسط لمعظم حالات الاستخدام — يجلبه Cloud API ويحفظه في الذاكرة المؤقتة. الـ Media IDs أفضل للأصول التي تُعاد استخدامها كثيراً مثل صور المنتجات أو ملفات PDF ذات العلامة التجارية.
Node.js
sendMedia.js
// إرسال صورة عبر URL عامasync functionsendImage(to, imageUrl, caption = '') {
returnsendMedia(to, 'image', { link: imageUrl, caption });
}
// إرسال مستند عبر URL عامasync functionsendDocument(to, docUrl, filename, caption = '') {
returnsendMedia(to, 'document', { link: docUrl, filename, caption });
}
// مرسل وسائط عام — يعمل للصور والفيديو والصوت والمستنداتasync functionsendMedia(to, type, mediaObj) {
const res = awaitfetch(
`https://graph.facebook.com/v21.0/${process.env.WA_PHONE_ID}/messages`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.WA_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
messaging_product: 'whatsapp',
to,
type,
[type]: mediaObj, // { link, caption } أو { id, caption }
}),
}
);
if (!res.ok) throw newError(`Media send failed: ${await res.text()}`);
return (await res.json()).messages[0].id;
}
// الاستخدامawaitsendImage('+15550001234', 'https://yourdomain.com/promo.jpg', 'Check out our new product! 🚀');
awaitsendDocument('+15550001234', 'https://yourdomain.com/invoice.pdf', 'invoice-2026.pdf');
رسائل الأزرار التفاعلية تتيح للعملاء الرد بنقرة بدلاً من الكتابة. الحد الأقصى 3 أزرار لكل رسالة. عناوين الأزرار محدودة بـ 20 حرفاً. عندما ينقر العميل زراً، يستقبل webhook الخاص بك رسالة من نوع interactive بقيمة id الزر في msg.interactive.button_reply.id.
رسائل الموقع تُعرض كدبوس خريطة في WhatsApp مع اسم وعنوان اختياريين تحته. يمكن للعملاء النقر لفتحه في تطبيق الخرائط لديهم. لا حاجة لـ URL أو media ID — فقط الإحداثيات.
Request body (all languages)
{
"messaging_product": "whatsapp",
"to": "+15550001234",
"type": "location",
"location": {
"latitude": 40.712776,
"longitude": -74.005974,
"name": "SocialHook HQ", // اختياري — يظهر فوق العنوان"address": "123 Main St, New York, NY"// اختياري
}
}
الإرسال المجمّع: حدود المعدل والنمط الصحيح
تسمح WhatsApp Cloud API بـ 80 رسالة في الثانية لكل رقم هاتف افتراضياً. بهذا المعدل، يستغرق إرسال 10,000 رسالة حوالي دقيقتين. دون تحديد للمعدل، تستنفد حلقة ساذجة الحد على الفور تقريباً وتبدأ في الحصول على أخطاء 429 في منتصف الحملة. النمط الصحيح: أضف تأخيراً ثابتاً بين الإرسالات ونفّذ تراجعاً أسياً على 429.
إرسال الرسائل ليس سوى نصف الصورة. عندما يرد عميلك، تطلق WhatsApp Cloud API webhook إلى خادمك — لكنك تحتاج نقطة وصول HTTPS قابلة للوصول علناً لاستقباله، بالإضافة إلى التحقق من توقيع HMAC-SHA256، واستخراج الحمولة المتداخلة، ومعالجة إعادة المحاولة.
SocialHook يتولى طبقة الوارد بأكملها. اربط رقم WhatsApp الخاص بك بـ SocialHook، الصق رابط خادمك كوجهة، وتصل كل ردود العملاء كأحداث JSON مطبّعة — متحقق منها، مستخرجة من غلاف Meta المتداخل، ومُعاد توجيهها إلى نقطتك في أقل من 50 مللي ثانية. نفس التنسيق المسطّح يعمل لـ Facebook Messenger وInstagram DMs أيضاً.
الإعداد الكامل: يستخدم خادمك WhatsAppClient أعلاه للصادر، يسلّم SocialHook الأحداث الواردة إلى معالج webhook الخاص بك. اتجاهان، 50 دولاراً شهرياً ثابتة. انظر دليل webhook الوارد الكامل أو ابدأ بـ البدء السريع في 5 دقائق.
FAQ
أسئلة شائعة
كيف أرسل رسالة WhatsApp باستخدام Cloud API؟
POST إلى https://graph.facebook.com/v21.0/{PHONE_NUMBER_ID}/messages مع ترويسة Authorization: Bearer {ACCESS_TOKEN} وجسم JSON بـ messaging_product: "whatsapp"، to: "+E.164_number"، type: "text"، وtext: { body: "message" }. الكود الكامل لـ Node.js وPython وPHP في قسم الرسالة النصية أعلاه.
ما هو WhatsApp Phone Number ID وأين أجده؟
Phone Number ID هو معرّف رقمي لرقم WhatsApp Business المحدد لديك على Cloud API — مختلف عن رقم الهاتف الفعلي. أوجده في Meta Developer Dashboard ← WhatsApp ← Phone Numbers. يبدو كرقم من 15–16 رقماً. استخدمه في الـ URL: graph.facebook.com/v21.0/{PHONE_NUMBER_ID}/messages. لكل رقم هاتف معرّف واحد لا يتغير أبداً.
ما الفرق بين رسالة الجلسة ورسالة القالب؟
رسالة الجلسة (نص، صورة، أزرار، موقع، مستند) لا يمكن إرسالها إلا داخل نافذة الخدمة لـ 24 ساعة التي تفتح عندما يراسلك العميل أولاً. هذه مجانية ضمن الحصة الشهرية. رسالة القالب هي صيغة معتمدة من Meta مطلوبة لبدء محادثات جديدة أو الإرسال خارج نافذة الخدمة. يجب أن تُعتمد القوالب (1–24 ساعة للمرافق، حتى 5 أيام للتسويق) قبل أن تتمكن من إرسالها.
ماذا يحدث عندما أحصل على 429 من WhatsApp Cloud API؟
لقد بلغت حد المعدل (80 رسالة/ث افتراضياً). نفّذ تراجعاً أسياً: انتظر 1000 * 2^attempt + random(500) مللي ثانية قبل إعادة المحاولة، بحد أقصى 60 ثانية. أضف jitter (المكون العشوائي) لمنع المحاولات المتزامنة من عدة عمّال. للحملات المجمّعة، أضف تأخير ثابت 15–20 مللي ثانية بين الإرسالات للبقاء بأمان تحت الحد بدلاً من بلوغه وإعادة المحاولة.
كيف أرسل قالب WhatsApp مع متغيرات في Python؟
اضبط "type": "template" وضمّن مصفوفة components مع مكون body يحتوي على parameters — كائن واحد لكل متغير في قالبك. كل معامل هو {"type": "text", "text": "variable_value"}. تتطابق تسلسلياً مع {{1}}، {{2}}، {{3}} في قالبك. كود Python الكامل في قسم رسالة القالب أعلاه.
كيف أستقبل ردود رسائل WhatsApp من العملاء؟
تصل ردود العملاء عبر webhook — تطلق Meta طلب HTTP POST إلى نقطتك المسجّلة عند حدوث أي حدث رسالة. تحتاج URL HTTPS قابلاً للوصول علناً، والتحقق من توقيع HMAC-SHA256، وتحليل حمولة متداخلة. SocialHook يتولى كل هذا تلقائياً ويسلّم JSON نظيفاً إلى نقطتك في أقل من 50 مللي ثانية. انظر الإعداد الكامل في دليل webhook الوارد.
كود الصادر لديك جاهز. اربط SocialHook للوارد — تصل كل ردود العملاء كـ JSON نظيف إلى نقطة webhook لديك. لا قوالب نمطية لـ HMAC، ولا تحليل حمولة متداخلة، ولا بنية إعادة محاولة لبنائها.