בטח, הנה קובץ תרגילים מקצועי ומעשי לשיעור 5.3 בנושא Webhooks, מותאם לקהל ישראלי.

<div dir="rtl" lang="he">

# תרגילים - שיעור 5.3: Webhooks – קבלת ושליחת נתונים בזמן אמת

## מידע כללי
- **שיעור:** 5.3 - Webhooks – קבלת ושליחת נתונים בזמן אמת
- **סוג השיעור:** מעשי (2 שעות)
- **הערה:** כל התרגילים דורשים Python מותקן, `flask` (`pip install flask`), ו-ngrok מותקן ומוגדר.

---

## תרגיל 1: מתי נשתמש ב-Webhook? (ניתוח ודיון - 15 דקות)
### הנחיות:
זהו תרגיל תיאורטי לניתוח ודיון קבוצתי. עבור כל אחד מהתרחישים הבאים, קבעו האם עדיף להשתמש ב-**Webhook** או ב-**Polling** (שליפת נתונים תקופתית). נמקו את בחירתכם תוך התייחסות ליעילות, צריכת משאבים, ומהירות התגובה הנדרשת.

### שאלות/משימות:
1.  **מערכת לקבלת תשלומים:** אתר e-commerce ישראלי המשתמש בשירותי הסליקה של "משולם" או "PayPlus". המערכת צריכה לעדכן את סטטוס ההזמנה במאגר הנתונים שלה ברגע שהתשלום מאושר על ידי חברת האשראי. מהי הגישה הנכונה?
2.  **אפליקציית מזג אוויר:** אפליקציה שמציגה למשתמש את הטמפרטורה הנוכחית בתל אביב. הנתונים נלקחים משרת חיצוני המתעדכן כל 15 דקות. כיצד האפליקציה צריכה לקבל את עדכוני הטמפרטורה?
3.  **מערכת CRM:** מערכת ניהול קשרי לקוחות (CRM) צריכה לקבל "לידים" (פרטי מתעניינים) מטופס יצירת קשר באתר האינטרנט של החברה. חשוב לצוות המכירות ליצור קשר עם הליד כמה שיותר מהר מרגע שהשאיר פרטים. באיזו שיטה נבחר?

---

## תרגיל 2: ה-"Hello World" של עולם ה-Webhooks (קוד - 20 דקות)
### הנחיות:
במשימה זו נקים את ה-endpoint הראשון שלנו, נחשוף אותו לאינטרנט, ונשלח אליו בקשה ראשונה כדי לוודא שהכל עובד.

### שאלות/משימות:
1.  צרו קובץ פייתון חדש (למשל `app.py`).
2.  השתמשו בספריית `flask` כדי להקים שרת web פשוט.
3.  צרו endpoint (נתיב) בשם `/webhook` שמקבל בקשות מסוג `POST`.
4.  כאשר מתקבלת בקשה, הפונקציה צריכה להדפיס למסוף (console) את גוף הבקשה (request body) שהתקבל.
5.  הריצו את השרת המקומי שלכם.
6.  פתחו טרמינל חדש והריצו את הפקודה `ngrok http 5000` (בהנחה ש-Flask רץ על פורט 5000).
7.  העתיקו את כתובת ה-URL ש-ngrok סיפק לכם (זו שמתחילה ב-`https`).
8.  השתמשו בכלי כמו Postman, Insomnia או `curl` כדי לשלוח בקשת `POST` לכתובת ה-URL של ngrok בנתיב `/webhook`. שלחו בגוף הבקשה JSON פשוט, לדוגמה: `{"message": "Hello from my first webhook!"}`.
9.  ודאו שאתם רואים את תוכן ה-JSON מודפס בטרמינל שבו שרת ה-Flask שלכם רץ.

---

## תרגיל 3: קליטת ליד חדש ממערכת "Zap דפי זהב" (קוד - 25 דקות)
### הנחיות:
נדמה תרחיש שבו עסק ישראלי המפרסם ב"דפי זהב" מקבל Webhook בכל פעם שמשתמש משאיר פרטים ליצירת קשר. עלינו לנתח את המידע ולהציג אותו בצורה קריאה.

**Payload לדוגמה (JSON):**
```json
{
  "lead_id": "zap-1029384",
  "source": "d.co.il",
  "timestamp": "2026-05-10T14:30:00Z",
  "customer_details": {
    "full_name": "ישראל ישראלי",
    "phone": "054-1234567",
    "email": "israel@israeli.co.il"
  },
  "message": "אני מעוניין לקבל הצעת מחיר לתיקון מזגן."
}
```

### שאלות/משימות:
1.  הרחיבו את הקוד מהתרגיל הקודם.
2.  בתוך פונקציית ה-`/webhook`, קבלו את ה-JSON ונתחו אותו כדי לחלץ את שם הלקוח, הטלפון וההודעה שלו.
3.  הדפיסו למסוף הודעה מפורטת וברורה, לדוגמה:
    ```
    =========================
    🔔 ליד חדש התקבל מדפי זהב! 🔔
    שם מלא: ישראל ישראלי
    טלפון: 054-1234567
    הודעה: אני מעוניין לקבל הצעת מחיר לתיקון מזגן.
    =========================
    ```
4.  שלחו את ה-Payload לדוגמה באמצעות Postman אל ה-ngrok URL שלכם וודאו שההודעה הנכונה מודפסת.

---

## תרגיל 4: אבטחה זה לא משחק: אימות חתימת HMAC (קוד - 25 דקות)
### הנחיות:
כדי לוודא שה-Webhook שקיבלנו הוא אכן אותנטי ולא נשלח על ידי גורם זדוני, נוסיף שכבת אבטחה של אימות חתימה. נדמה ש"דפי זהב" שולחים לנו Header מיוחד עם חתימה דיגיטלית.

### שאלות/משימות:
1.  הוסיפו לקוד שלכם "מפתח סודי" (Secret Key) בתור קבוע. לדוגמה: `SECRET_KEY = "MySuperSecretKeyForZap"`.
2.  שנו את ה-endpoint כך שיבדוק את קיומו של Header בשם `X-Zap-Signature`. אם ה-Header לא קיים, החזירו תשובת שגיאה 401 (Unauthorized).
3.  קראו את גוף הבקשה (request body) כ-bytes.
4.  השתמשו בספריות `hashlib` ו-`hmac` של פייתון כדי לחשב חתימת `HMAC-SHA256` על גוף הבקשה, תוך שימוש במפתח הסודי שלכם.
5.  השוו את החתימה שחישבתם לחתימה שהתקבלה ב-Header `X-Zap-Signature`.
6.  **בדיקה:**
    *   **תרחיש תקין:** השתמשו בכלי אונליין (או כתבו סקריפט קצר) כדי לחשב את חתימת ה-HMAC עבור ה-Payload מהתרגיל הקודם עם המפתח הסודי. שלחו בקשה עם ה-Header והחתימה הנכונה וודאו שהיא מתקבלת בהצלחה.
    *   **תרחיש זדוני:** שלחו את אותה בקשה אך עם חתימה שגויה (או ללא ה-Header כלל) וודאו שהשרת שלכם דוחה אותה עם שגיאת 401.

---

## תרגיל 5: אוטומציה ללא קוד - שליחת ליד לוואטסאפ העסקי דרך Make.com (אוטומציה - 20 דקות)
### הנחיות:
במקום רק להדפיס את הליד למסוף, נשתמש בפלטפורמת אוטומציה כדי לבצע פעולה עסקית אמיתית: שליחת הודעת וואטסאפ לאיש המכירות על קבלת ליד חדש.

### שאלות/משימות:
1.  היכנסו לחשבון ה-Make.com שלכם (או פתחו חשבון חינמי).
2.  צרו תרחיש (Scenario) חדש.
3.  המודול הראשון (Trigger) שתוסיפו יהיה `Webhooks` -> `Custom webhook`.
4.  לחצו `Add`, תנו ל-Webhook שם (למשל "לידים מדפי זהב"), ושמרו.
5.  העתיקו את כתובת ה-URL הייחודית ש-Make יצר עבורכם.
6.  שלחו בקשת `POST` לדוגמה (עם ה-JSON מהתרגיל) לכתובת זו באמצעות Postman כדי ש-Make "ילמד" את מבנה הנתונים.
7.  הוסיפו מודול נוסף לתרחיש: `WhatsApp Business API` (או כל מודול אחר לשליחת הודעות כמו `Telegram` או `Slack`).
8.  חברו אותו לחשבון שלכם (אם אין לכם, אפשר לדלג על השלב הזה ולדמיין אותו, או להשתמש במודול `Email`).
9.  בגוף ההודעה שתשלחו, השתמשו בשדות הדינמיים שהתקבלו מה-Webhook. לדוגמה: "ליד חדש התקבל! שם: `customer_details.full_name`, טלפון: `customer_details.phone`".
10. הפעילו את התרחיש (Run Once) ושלחו שוב את הבקשה מ-Postman. ודאו שהאוטומציה רצה ושההודעה מתקבלת ביעד.

---

## תרגיל 6: משימת בית - Webhook לקבלת הזמנות משופרסל Online
### הנחיות:
אתם מפתחים מערכת לניהול לוגיסטי עבור חברת משלוחים קטנה שעובדת עם "שופרסל Online". עליכם לבנות Webhook שמקבל התראות על הזמנות חדשות ששולמו ומוכנות לאיסוף. ה-Webhook צריך לאמת את הבקשה, לעבד את הנתונים, ולשמור אותם בקובץ לוג מקומי.

**דרישות המערכת:**
1.  **Endpoint:** השרת יאזין בנתיב `/shufersal-orders`.
2.  **אבטחה:** השרת חייב לאמת כל בקשה באמצעות חתימת HMAC-SHA256 שנשלחת ב-Header בשם `X-Shufersal-Signature`. השתמשו במפתח סודי לבחירתכם.
3.  **לוגיקה עסקית:**
    *   ה-Webhook יקבל Payload בפורמט JSON (ראו דוגמה למטה).
    *   יש לוודא שהשדה `status` הוא "paid_and_ready_for_collection". בקשות עם סטטוס אחר יש להתעלם מהן (אך להחזיר תגובת 200 OK).
    *   עבור הזמנה תקינה, יש לחלץ את מספר ההזמנה, שם הלקוח, כתובת מלאה, ומספר פריטים.
    *   יש לכתוב שורה חדשה לקובץ לוג בשם `delivery_tasks.log` בפורמט הבא:
        `[YYYY-MM-DD HH:MM:SS] - New Task: Order #<order_id> for <customer_name> to <city>. Items: <item_count>.`
4.  **תגובה:** על ה-Webhook להחזיר תמיד תגובת `200 OK` אם הבקשה (כולל החתימה) תקינה, גם אם הסטטוס לא רלוונטי. במקרה של חתימה לא תקינה, יש להחזיר `401 Unauthorized`.

**Payload לדוגמה:**
```json
{
  "order_id": 987654,
  "timestamp": "2026-05-10T18:00:00Z",
  "status": "paid_and_ready_for_collection",
  "customer": {
    "name": "דנה כהן",
    "phone": "052-7654321"
  },
  "delivery_address": {
    "street": "הרצל 15",
    "city": "גבעתיים",
    "zip_code": "5344512"
  },
  "items": [
    {"sku": "729000000001", "name": "חלב 3%", "quantity": 2},
    {"sku": "729000000002", "name": "לחם אחיד", "quantity": 1},
    {"sku": "729000000003", "name": "קוטג' 5%", "quantity": 3}
  ],
  "item_count": 6
}
```

**הגישו עד השיעור הבא את קובץ ה-`app.py` המלא.**

---

## קריטריונים להערכה (למשימת הבית)
| קריטריון | ציון |
|---|---|
| הקמת שרת Flask עם ה-Endpoint הנדרש | 20% |
| יישום נכון ומלא של אימות חתימת HMAC | 30% |
| לוגיקה עסקית: סינון לפי סטטוס וניתוח נכון של ה-JSON | 25% |
| כתיבה תקינה של הנתונים לקובץ הלוג בפורמט הנדרש | 15% |
| קוד נקי, קריא ושימוש נכון בתגובות HTTP (200/401) | 10% |
| **סה"כ** | **100%** |

</div>