مقدمة
يضم WhatsApp أكثر من ملياري مستخدم نشط حول العالم، مما يجعله أحد أهم قنوات التواصل للشركات. تتيح WhatsApp Business API للشركات إرسال واستقبال الرسائل برمجيًا، وأتمتة تفاعلات العملاء، ودمج WhatsApp في أنظمتها الحالية.
يغطي هذا الدليل كل ما تحتاج معرفته لبناء أتمتة WhatsApp: من الإعداد الأولي عبر قوالب الرسائل ومعالجة Webhook إلى بناء روبوت دعم عملاء عملي.
فهم WhatsApp Business API
تختلف WhatsApp Business API عن تطبيق WhatsApp Business. التطبيق للشركات الصغيرة لإدارة المحادثات يدويًا. الـ API للشركات التي تحتاج أتمتة وتوسيع تواصل WhatsApp.
المفاهيم الرئيسية
- مزود حلول الأعمال (BSP): لا توفّر Meta وصول API مباشر. تستخدم BSP مثل Twilio أو 360dialog أو MessageBird كوسيط
- رقم الهاتف: تحتاج رقم هاتف مخصص مسجّل مع WhatsApp Business
- قوالب الرسائل: تنسيقات رسائل معتمدة مسبقًا لبدء المحادثات
- رسائل الجلسة: رسائل تُرسل خلال نافذة 24 ساعة بعد رسالة العميل لك
- Webhooks: نقاط نهاية HTTP تستقبل الرسائل الواردة وتحديثات الحالة
نموذج التسعير
يحسب WhatsApp لكل محادثة، وليس لكل رسالة:
- محادثات تبدأها الأعمال: ترسل رسالة قالب لبدء المحادثة
- محادثات يبدأها المستخدم: يراسلك العميل أولًا
- التسعير يختلف حسب الدولة: معدلات مختلفة لمناطق مختلفة
إعداد WhatsApp Business API
الخطوة 1: اختيار مزود حلول الأعمال
تشمل BSPs الشائعة:
- Twilio: API موثّق جيدًا، تجربة مطور جيدة
- 360dialog: شريك Meta مباشر، تسعير تنافسي
- MessageBird: منصة متعددة القنوات تدعم WhatsApp
- Meta Cloud API: API Meta السحابي المُدار (أبسط إعداد)
الخطوة 2: تسجيل رقم الهاتف
# مثال باستخدام Meta Cloud API
import requests
GRAPH_API_URL = "https://graph.facebook.com/v18.0"
ACCESS_TOKEN = "your-access-token"
PHONE_NUMBER_ID = "your-phone-number-id"
# تسجيل رقم الهاتف
response = requests.post(
f"{GRAPH_API_URL}/{PHONE_NUMBER_ID}/register",
headers={"Authorization": f"Bearer {ACCESS_TOKEN}"},
json={
"messaging_product": "whatsapp",
"pin": "123456" # رمز PIN من 6 أرقام اخترته
}
)
الخطوة 3: تكوين Webhooks
أعد نقطة نهاية webhook لاستقبال الرسائل الواردة:
from fastapi import FastAPI, Request, Response
import json
app = FastAPI()
VERIFY_TOKEN = "your_verify_token"
@app.get("/webhook")
async def verify_webhook(hub_mode: str, hub_challenge: str, hub_verify_token: str):
"""التحقق من webhook مع Meta."""
if hub_mode == "subscribe" and hub_verify_token == VERIFY_TOKEN:
return Response(content=hub_challenge, status_code=200)
return Response(status_code=403)
@app.post("/webhook")
async def receive_webhook(request: Request):
"""معالجة رسائل WhatsApp الواردة."""
body = await request.json()
# معالجة webhook
if body.get("object") == "whatsapp_business_account":
for entry in body.get("entry", []):
for change in entry.get("changes", []):
if change.get("field") == "messages":
handle_message(change.get("value"))
return Response(status_code=200)
قوالب الرسائل
لا يمكنك إرسال رسائل عشوائية للعملاء خارج نافذة الجلسة 24 ساعة. يجب استخدام قوالب رسائل معتمدة مسبقًا.
إنشاء قالب
def create_message_template():
"""إنشاء قالب رسالة للموافقة."""
template = {
"name": "order_confirmation",
"language": "en_US",
"category": "UTILITY",
"components": [
{
"type": "BODY",
"text": "مرحبًا {{1}}، تم تأكيد طلبك {{2}}. "
"التوصيل المتوقع: {{3}}. تتبع طلبك على {{4}}."
},
{
"type": "BUTTONS",
"buttons": [
{
"type": "QUICK_REPLY",
"text": "تتبع الطلب"
},
{
"type": "QUICK_REPLY",
"text": "تواصل مع الدعم"
}
]
}
]
}
response = requests.post(
f"{GRAPH_API_URL}/{PHONE_NUMBER_ID}/message_templates",
headers={"Authorization": f"Bearer {ACCESS_TOKEN}"},
json=template
)
return response.json()
إرسال رسالة قالب
def send_template_message(phone_number: str, order_data: dict):
"""إرسال رسالة قالب تأكيد الطلب."""
message = {
"messaging_product": "whatsapp",
"recipient_type": "individual",
"to": phone_number,
"type": "template",
"template": {
"name": "order_confirmation",
"language": {"code": "en_US"},
"components": [
{
"type": "body",
"parameters": [
{"type": "text", "text": order_data["customer_name"]},
{"type": "text", "text": order_data["order_id"]},
{"type": "text", "text": order_data["delivery_date"]},
{"type": "text", "text": order_data["tracking_url"]}
]
}
]
}
}
response = requests.post(
f"{GRAPH_API_URL}/{PHONE_NUMBER_ID}/messages",
headers={
"Authorization": f"Bearer {ACCESS_TOKEN}",
"Content-Type": "application/json"
},
json=message
)
return response.json()
معالجة الرسائل الواردة
تحليل أنواع الرسائل
يدعم WhatsApp رسائل النص والصورة والصوت والمستند والموقع:
def handle_message(value: dict):
"""معالجة رسالة WhatsApp الواردة."""
messages = value.get("messages", [])
if not messages:
# قد يكون تحديث حالة (مرسل، مُسلّم، مقروء)
handle_status(value.get("statuses", []))
return
message = messages[0]
sender_phone = message["from"]
message_type = message["type"]
if message_type == "text":
text = message["text"]["body"]
handle_text_message(sender_phone, text)
elif message_type == "interactive":
# معالجة نقرات الأزرار واختيارات القوائم
interactive = message["interactive"]
if interactive["type"] == "button_reply":
button_id = interactive["button_reply"]["id"]
handle_button_response(sender_phone, button_id)
elif message_type == "image":
image_id = message["image"]["id"]
caption = message["image"].get("caption", "")
handle_image_message(sender_phone, image_id, caption)
elif message_type == "location":
latitude = message["location"]["latitude"]
longitude = message["location"]["longitude"]
handle_location_message(sender_phone, latitude, longitude)
إرسال رسائل الرد
ضمن نافذة الجلسة 24 ساعة، يمكنك إرسال رسائل حرة:
def send_text_message(phone_number: str, text: str):
"""إرسال رسالة نصية لعميل."""
message = {
"messaging_product": "whatsapp",
"recipient_type": "individual",
"to": phone_number,
"type": "text",
"text": {"body": text}
}
response = requests.post(
f"{GRAPH_API_URL}/{PHONE_NUMBER_ID}/messages",
headers={
"Authorization": f"Bearer {ACCESS_TOKEN}",
"Content-Type": "application/json"
},
json=message
)
return response.json()
بناء روبوت دعم عملاء
لنبنِ روبوتًا يتعامل مع استعلامات العملاء الشائعة باستخدام الذكاء الاصطناعي ويوجّه المشكلات المعقدة للوكلاء البشريين.
بنية الروبوت
from dataclasses import dataclass
from enum import Enum
class MessageType(Enum):
TEXT = "text"
INTERACTIVE = "interactive"
@dataclass
class CustomerContext:
phone_number: str
name: str = ""
conversation_state: str = "initial"
order_id: str = ""
issue_type: str = ""
class WhatsAppBot:
def __init__(self, llm_client, database):
self.llm = llm_client
self.db = database
self.contexts = {} # في الإنتاج، استخدم Redis
def get_context(self, phone_number: str) -> CustomerContext:
if phone_number not in self.contexts:
self.contexts[phone_number] = CustomerContext(phone_number=phone_number)
return self.contexts[phone_number]
def process_message(self, phone_number: str, text: str):
context = self.get_context(phone_number)
# التوجيه بناءً على حالة المحادثة
if context.conversation_state == "initial":
return self.handle_initial(context, text)
elif context.conversation_state == "awaiting_order_id":
return self.handle_order_lookup(context, text)
elif context.conversation_state == "in_support":
return self.handle_support(context, text)
اكتشاف النية بالذكاء الاصطناعي
def detect_intent(self, text: str) -> str:
"""استخدم LLM لاكتشاف نية المستخدم."""
prompt = f"""صنّف رسالة العميل هذه إلى إحدى الفئات:
- order_status: السؤال عن حالة الطلب
- product_inquiry: السؤال عن المنتجات
- complaint: تقديم شكوى
- general: سؤال عام
- human: طلب وكيل بشري
الرسالة: "{text}"
أجب باسم الفئة فقط."""
intent = self.llm.invoke(prompt).strip().lower()
return intent
def handle_initial(self, context: CustomerContext, text: str):
intent = self.detect_intent(text)
if intent == "order_status":
context.conversation_state = "awaiting_order_id"
return "يرجى إدخال رقم طلبك (مثلًا، ORD-12345)"
elif intent == "product_inquiry":
return self.handle_product_inquiry(text)
elif intent == "complaint":
context.conversation_state = "in_support"
context.issue_type = "complaint"
return "نأسف لسماع أنك تواجه مشكلة. " \
"يرجى وصف المشكلة بالتفصيل."
elif intent == "human":
return self.escalate_to_human(context)
else:
return self.handle_general_query(text)
ردود مدعومة بالذكاء الاصطناعي
def handle_general_query(self, text: str) -> str:
"""توليد رد AI باستخدام قاعدة المعرفة."""
# استرجاع السياق ذي الصلة من قاعدة المعرفة
relevant_docs = self.db.search_knowledge_base(text, top_k=3)
context = "\n".join([doc.content for doc in relevant_docs])
prompt = f"""أنت مساعد دعم عملاء مفيد.
استخدم قاعدة المعرفة التالية للإجابة على سؤال العميل.
إذا لم تعرف الإجابة، قل أنك ستربطه بوكيل بشري.
قاعدة المعرفة:
{context}
سؤال العميل: {text}
الإجابة:"""
response = self.llm.invoke(prompt)
return response
رسائل تفاعلية بأزرار
def send_interactive_message(phone_number: str, body_text: str, buttons: list):
"""إرسال رسالة بأزرار رد سريع."""
message = {
"messaging_product": "whatsapp",
"recipient_type": "individual",
"to": phone_number,
"type": "interactive",
"interactive": {
"type": "button",
"body": {"text": body_text},
"action": {
"buttons": [
{
"type": "reply",
"reply": {"id": btn["id"], "title": btn["title"]}
}
for btn in buttons
]
}
}
}
response = requests.post(
f"{GRAPH_API_URL}/{PHONE_NUMBER_ID}/messages",
headers={
"Authorization": f"Bearer {ACCESS_TOKEN}",
"Content-Type": "application/json"
},
json=message
)
return response.json()
# الاستخدام
send_interactive_message(
phone_number="+1234567890",
body_text="كيف يمكنني مساعدتك اليوم؟",
buttons=[
{"id": "track_order", "title": "تتبع الطلب"},
{"id": "product_info", "title": "معلومات المنتج"},
{"id": "support", "title": "الدعم"}
]
)
أفضل الممارسات
-
احترم قاعدة 24 ساعة: يمكنك فقط إرسال رسائل حرة خلال 24 ساعة من آخر رسالة للعميل. استخدم القوالب للمحادثات التي تبدأها الأعمال.
-
احصل على موافقة المستخدم: احصل دائمًا على موافقة صريحة قبل إرسال رسائل تسويقية. يمكن لـ WhatsApp تعليق الحسابات التي ترسل رسائل غير مطلوبة.
-
نفّذ تحديد المعدل: لدى WhatsApp حدود إنتاجية. وزّع الرسائل لتجنب تحديد المعدل.
-
عالج تنزيل الوسائط: عند استقبال الصور أو المستندات، نزّلها وخزّنها فورًا. تنتهي صلاحية روابط الوسائط.
-
سجّل جميع المحادثات: احتفظ بسجلات لخدمة العملاء والامتثال والتحليلات.
-
وفّر تصعيدًا بشريًا: أعطِ العملاء دائمًا طريقًا للوصول لوكيل بشري. يجب أن يتعرف روبوتات AI على متى لا يمكنها المساعدة وتصعيد الأمر.
خاتمة
تفتح أتمتة WhatsApp Business API قناة قوية لتفاعل العملاء. مزيج قوالب الرسائل للتواصل الاستباقي، ورسائل الجلسة للمحادثة الفورية، والذكاء الاصطناعي للردود الذكية يخلق نظام تواصل قوي مع العملاء.
ابدأ بروبوت بسيط يتعامل مع أكثر الاستعلامات شيوعًا، ثم أضف قدرات AI وتوجيهًا أكثر تطورًا تدريجيًا. المفتاح هو تقديم قيمة للعميل دائمًا مع احترام قواعد وقيود WhatsApp. مع التنفيذ المناسب، يمكن لأتمتة WhatsApp تقليل تكاليف الدعم بشكل كبير مع تحسين رضا العملاء.