שימו לב: כאשר אתר של מרפאה מאפשר למטופלים לקבוע תור לרופא בעוד שהמשבצת ב-Outlook של הרופא נשארת פנויה—מתחילות צרות. בדיקה ידנית חוצת מערכות אורכת שעות ומובילה לכפילויות בהזמנות. הפתרון הוא לחבר את האתר עם לוחות השנה של Outlook באמצעות Microsoft Graph API. תוך 3–4 ימים אנו מיישמים יצירת אירועים אוטומטית ובדיקות זמינות. העדכונים מתבצעים בזמן אמת עם השהיה של פחות משתי שניות. להלן הפרטים הטכניים של האינטגרציה.
ללא Outlook API, מפתחים נתקלים בדרך כלל בשלוש בעיות: הזמנות כפולות עקב חוסר אטומיות בתזמון, אי-התאמות בזמנים עקב העברות ידניות של אירועים, ומשבצות שגויות עקב סדרות פגישות שלא נלקחו בחשבון. Graph API מבטל סיכונים אלה אך דורש הגדרת אימות נכונה וטיפול ב-findMeetingTimes. אנו מגדירים OAuth 2.0 עם הרשאות נציגות כך שהאפליקציה פועלת ללא גישה לתיבת הדואר של המנהל.
מעבר לתרחישים הבסיסיים, אנו פותרים משימות מורכבות: סנכרון של מספר לוחות שנה ב-tenant אחד, טיפול באירועים חוזרים, ותמיכה באזורי זמן. בזכות delta queries, עדכונים מגיעים באופן מיידי ללא קריאות API נוספות. מהירות הבקשה הממוצעת היא כ-200 אלפיות השנייה—פי 3 מהר יותר מ-EWS הישן.
כיצד להגדיר אימות עבור Outlook Calendar?
השלב הראשון הוא רישום אפליקציה ב-Azure AD. אנו יוצרים אישור לקוח להחלפת אסימונים מאובטחת ומעניקים לאפליקציה הרשאות Calendars.ReadWrite.All ו-User.Read. זה מאפשר עבודה עם לוח השנה של כל משתמש ב-tenant. לאחר מכן אנו משיגים אסימון גישה באמצעות זרימת OAuth 2.0 On-Behalf-Of—המערכת יכולה לפעול בשם מנהל מורשה. כל התהליך אורך כשעה ומתועד באוסף Postman. כדי לעבוד עם לוחות השנה של כל המשתמשים, נדרשת הרשאת Calendars.ReadWrite.All. אם נדרש רק לוח שנה אחד, Calendars.ReadWrite מספיקה. הרשאות מוקצות ב-Azure AD דרך האפליקציה. אנו עוזרים לבחור את ההרשאות המינימליות הנדרשות.
כיצד לשלב את Outlook Calendar באמצעות Microsoft Graph?
התרחיש העיקרי הוא קריאת אירועים לשבוע הקרוב:
import { Client } from '@microsoft/microsoft-graph-client'; const client = Client.initWithMiddleware({ authProvider: tokenCredentialAuthProvider }); async function getCalendarEvents(userId: string): Promise<Event[]> { const response = await client .api(`/users/${userId}/calendarView`) .query({ startDateTime: new Date().toISOString(), endDateTime: new Date(Date.now() + 7 * 86400000).toISOString(), }) .select('subject,start,end,location,isAllDay') .orderby('start/dateTime') .get(); return response.value.map((e: any) => ({ id: e.id, title: e.subject, start: e.start.dateTime, end: e.end.dateTime, location: e.location?.displayName, allDay: e.isAllDay, })); } יצירת אירוע דורשת התקשרות ללוח השנה של משתמש ספציפי:
async function createEvent(userId: string, booking: Booking): Promise<string> { const event = await client.api(`/users/${userId}/events`).post({ subject: booking.serviceName, start: { dateTime: booking.startsAt, timeZone: 'Russian Standard Time' }, end: { dateTime: booking.endsAt, timeZone: 'Russian Standard Time' }, body: { contentType: 'HTML', content: `<p>Клиент: ${booking.customerName}</p><p>Телефон: ${booking.phone}</p>`, }, attendees: [{ emailAddress: { address: booking.customerEmail }, type: 'required' }], isReminderOn: true, reminderMinutesBeforeStart: 60, }); return event.id; } טיפול בשגיאות הוא קריטי: אנו מתחשבים במגבלות קצב (10,000 בקשות לשעה לכל אפליקציה) ומבצעים ניסיונות חוזרים עם השהיה אקספוננציאלית על סטטוס 429. אנו גם בודקים שהאירוע החדש אינו מתנגש עם אירועים קיימים באמצעות findMeetingTimes.
למה Graph API עדיף על EWS?
EWS (Exchange Web Services) נופל בכל המדדים: הוא איטי יותר—TTFB גבוה פי 3 (200 אלפיות השנייה לעומת 600 אלפיות השנייה), דורש הגדרת אישורים, ואינו תומך ב-delta queries. Graph API הוא פתרון REST מודרני הבנוי על OAuth2 עם תיעוד מצוין. הנה השוואה:
| תכונה | Graph API | EWS |
|---|---|---|
| אימות | OAuth 2.0 (ללא סיסמה) | הגדרת Basic או OAuth מורכבת |
| מהירות בקשה | ~200 אלפיות השנייה לבקשה | ~600 אלפיות השנייה |
| תפוקה | 10,000 בקשות/שעה לכל אפליקציה | 1,000/שעה |
| סנכרון דלתא | כן (התראות שינוי) | לא |
יכולות נוספות של Graph API:
- עבודה עם פגישות Teams (onlineMeetingProvider, joinWebUrl)
- תמיכה בקבצים מצורפים (עד 150 MB לכל אירוע)
- ניהול תזכורות וזמינות חדרים
יתר על כן, Graph API זול יותר לתחזוקה—אין צורך בחידוש אישורים, והוא תומך בתרחישים מודרניים כמו ניהול לוחות שנה שיתופי באמצעות התראות webhook. במהלך 5 השנים האחרונות, סיפקנו יותר מ-30 פרויקטים של שילוב לוחות שנה ארגוניים עבור מרפאות, שירותי השכרה ופלטפורמות משאבי אנוש.
שגיאות נפוצות בעבודה עם Graph API
| קוד שגיאה | סיבה | פתרון |
|---|---|---|
| 429 Too Many Requests | חריגה ממגבלת הקצב | יישם ניסיון חוזר עם השהיה אקספוננציאלית |
| 401 Unauthorized | אסימון שפג תוקפו או לא חוקי | רענן אסימון באמצעות מנגנון רענון |
| 404 Not Found | המשתמש לא נמצא | ודא את ה-userId ב-tenant |
מה כלול בעבודה
- רישום אפליקציה ב-Azure AD ויצירת אישורי לקוח
- יישום נקודות קצה REST לקריאה, יצירה ועדכון של אירועים
- הגדרת התראות שינוי (webhook) לסנכרון בזמן אמת
- אינטגרציה עם CMS (WordPress, Drupal, Strapi וכו')
- תיעוד אינטגרציה (אוסף Postman, סכימת DB)
- בדיקות תוך התחשבות בשאילתות N+1 ומגבלות API
- ניטור שגיאות והתראות על כשלי אימות
שלבי התהליך
- ניתוח: הבהרת תרחישים—הזמנות, סנכרון, משבצות ציבוריות.
- עיצוב: בחירה בין הרשאות נציגות והרשאות אפליקציה.
- יישום: כתיבת שכבת שירות על Node.js/Nest.js, חיבור מטמון Redis.
- בדיקות: כיסוי בבדיקות יחידה, בדיקת מקרי קצה (אזור זמן, סדרות פגישות).
- פריסה: הגדרת CI/CD, הוספת נקודות קצה לבריאות.
לוח זמנים משוער
אינטגרציה בסיסית (קריאה + יצירה) אורכת 3–4 ימי עבודה. עם סנכרון webhook—עד 7 ימים. העלות מחושבת באופן אישי לאחר ניתוח סכימת ההזמנות שלכם. החיסכון בזמן בבדיקה ידנית מגיע עד 60%, מה שמחזיר את ההשקעה תוך 2–3 חודשים. החיסכון הממוצע בהוצאות תפעול הוא כ-20,000 רובל לחודש.
יש לנו ניסיון של 5+ שנים בשילוב לוחות שנה ארגוניים—סיפקנו יותר מ-30 פרויקטים עבור מרפאות, שירותי השכרה ופלטפורמות משאבי אנוש. צרו קשר כדי לקבל ייעוץ על אופטימיזציה של Core Web Vitals וניהול מגבלות הקצב של Graph API. הזמינו את האינטגרציה, ואנו נראה לכם דוגמאות לפתרונות עובדים.







