Zoom کنیکٹر
میٹنگ شرکاء اور ویبینار حاضرین کو خودکار طور پر رابطوں کے طور پر سنک کرنے، میٹنگ کے بعد فالو اپ سلسلے ٹرگر کرنے، اور اپنے مارکیٹنگ آٹومیشنز کے لیے engagement میٹرکس ٹریک کرنے کے لیے Tajo کے ذریعے Zoom کو Brevo سے منسلک کریں۔
جائزہ
| خاصیت | قدر |
|---|---|
| پلیٹ فارم | Zoom |
| زمرہ | ویڈیو کانفرنسنگ (کسٹم) |
| سیٹ اپ کی پیچیدگی | درمیانی |
| آفیشل انٹیگریشن | نہیں |
| سنک شدہ ڈیٹا | شرکاء، ایونٹس، ویبینارز، رابطے |
| تصدیق کا طریقہ | OAuth 2.0 / Server-to-Server OAuth |
خصوصیات
- شریک سنک - میٹنگ شرکاء سے Brevo رابطے خودکار بنائیں
- ویبینار حاضرین capture - ویبینار رجسٹرینٹس اور حاضرین کو سنک کریں
- میٹنگ ایونٹ ٹرگرز - میٹنگ شروع، ختم، اور ریکارڈنگ ایونٹس پر آٹومیشنز فائر کریں
- Engagement ٹریکنگ - حاضری دورانیہ اور شرکت میٹرکس ٹریک کریں
- ویبینار فالو اپ - ویبینار حاضری کی بنیاد پر ٹارگٹڈ ای میل سلسلے ٹرگر کریں
- ریکارڈنگ نوٹیفکیشنز - Brevo ای میل مہمات کے ذریعے ریکارڈنگ لنکس بھیجیں
شرائط
شروع کرنے سے پہلے، یقینی بنائیں کہ آپ کے پاس ہے:
- Zoom اکاؤنٹ (Pro plan یا اس سے اوپر)
- Zoom App Marketplace کے ذریعے Zoom Server-to-Server OAuth ایپ یا OAuth ایپ
- API رسائی کے ساتھ Brevo اکاؤنٹ
- کنیکٹر اجازتوں کے ساتھ Tajo اکاؤنٹ
تصدیق
Server-to-Server OAuth (تجویز کردہ)
# Create a Server-to-Server OAuth app at marketplace.zoom.usexport ZOOM_ACCOUNT_ID=your_account_idexport ZOOM_CLIENT_ID=your_client_idexport ZOOM_CLIENT_SECRET=your_client_secret// Get access token via Server-to-Server OAuthconst tokenResponse = await fetch('https://zoom.us/oauth/token', { method: 'POST', headers: { 'Authorization': `Basic ${Buffer.from( `${process.env.ZOOM_CLIENT_ID}:${process.env.ZOOM_CLIENT_SECRET}` ).toString('base64')}`, 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ grant_type: 'account_credentials', account_id: process.env.ZOOM_ACCOUNT_ID })});
const { access_token } = await tokenResponse.json();OAuth 2.0 (صارف کی سطح)
// Authorization URL for user-level OAuthconst authUrl = 'https://zoom.us/oauth/authorize?' + new URLSearchParams({ client_id: process.env.ZOOM_CLIENT_ID, redirect_uri: 'https://your-app.com/callback', response_type: 'code' });
// Exchange code for tokensconst tokenResponse = await fetch('https://zoom.us/oauth/token', { method: 'POST', headers: { 'Authorization': `Basic ${Buffer.from( `${process.env.ZOOM_CLIENT_ID}:${process.env.ZOOM_CLIENT_SECRET}` ).toString('base64')}`, 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ grant_type: 'authorization_code', code: authorizationCode, redirect_uri: 'https://your-app.com/callback' })});تشکیل
بنیادی سیٹ اپ
connectors: zoom: enabled: true account_id: "${ZOOM_ACCOUNT_ID}" client_id: "${ZOOM_CLIENT_ID}" client_secret: "${ZOOM_CLIENT_SECRET}"
sync: participants: true webinars: true recordings: true
webhook: secret_token: "${ZOOM_WEBHOOK_SECRET}" verification_token: "${ZOOM_VERIFICATION_TOKEN}"
lists: meeting_participants: 15 webinar_attendees: 16 webinar_registrants: 17فیلڈ میپنگ
field_mapping: email: email name: FIRSTNAME join_time: MEETING_JOIN_DATE duration: MEETING_DURATION webinar_title: WEBINAR_NAME attendance_status: ATTENDANCE_STATUS registration_source: UTM_SOURCEAPI اینڈ پوائنٹس
| اینڈ پوائنٹ | طریقہ | تفصیل |
|---|---|---|
https://api.zoom.us/v2/users | GET | صارفین کی فہرست |
https://api.zoom.us/v2/users/{userId}/meetings | GET | میٹنگز کی فہرست |
https://api.zoom.us/v2/meetings/{meetingId} | GET | میٹنگ کی تفصیلات حاصل کریں |
https://api.zoom.us/v2/past_meetings/{meetingId}/participants | GET | گزشتہ میٹنگ شرکاء کی فہرست |
https://api.zoom.us/v2/users/{userId}/webinars | GET | ویبینارز کی فہرست |
https://api.zoom.us/v2/webinars/{webinarId}/registrants | GET | ویبینار رجسٹرینٹس کی فہرست |
https://api.zoom.us/v2/webinars/{webinarId}/participants | GET | ویبینار شرکاء کی فہرست |
https://api.zoom.us/v2/meetings/{meetingId}/recordings | GET | میٹنگ ریکارڈنگز حاصل کریں |
https://api.zoom.us/v2/webhooks | POST | webhooks سبسکرائب کریں |
کوڈ کی مثالیں
کنیکٹر کو انیشیلائز کریں
import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY, brevoApiKey: process.env.BREVO_API_KEY});
await tajo.connectors.connect('zoom', { accountId: process.env.ZOOM_ACCOUNT_ID, clientId: process.env.ZOOM_CLIENT_ID, clientSecret: process.env.ZOOM_CLIENT_SECRET});میٹنگ شرکاء سنک کریں
// Retrieve past meeting participantsconst response = await fetch( `https://api.zoom.us/v2/past_meetings/${meetingId}/participants`, { headers: { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': 'application/json' } });
const { participants } = await response.json();
for (const participant of participants) { if (participant.user_email) { await tajo.contacts.sync({ email: participant.user_email, attributes: { FIRSTNAME: participant.name, MEETING_DURATION: participant.duration, MEETING_JOIN_DATE: participant.join_time, ATTENDANCE_STATUS: 'attended' }, listIds: [15] }); }}ویبینار حاضرین سنک کریں
// Get webinar attendees and sync to Brevoconst attendeesResponse = await fetch( `https://api.zoom.us/v2/past_webinars/${webinarId}/participants`, { headers: { 'Authorization': `Bearer ${accessToken}` } });
const { participants: attendees } = await attendeesResponse.json();
for (const attendee of attendees) { await tajo.contacts.sync({ email: attendee.user_email, attributes: { FIRSTNAME: attendee.name, WEBINAR_NAME: webinarTitle, ATTENDANCE_STATUS: 'attended', MEETING_DURATION: attendee.duration }, listIds: [16] });}Zoom Webhooks کو سنبھالیں
app.post('/webhooks/zoom', async (req, res) => { // Handle Zoom URL validation challenge if (req.body.event === 'endpoint.url_validation') { const hashForValidation = crypto .createHmac('sha256', process.env.ZOOM_WEBHOOK_SECRET) .update(req.body.payload.plainToken) .digest('hex');
return res.json({ plainToken: req.body.payload.plainToken, encryptedToken: hashForValidation }); }
// Verify webhook signature const message = `v0:${req.headers['x-zm-request-timestamp']}:${JSON.stringify(req.body)}`; const hash = crypto .createHmac('sha256', process.env.ZOOM_WEBHOOK_SECRET) .update(message) .digest('hex'); const signature = `v0=${hash}`;
if (req.headers['x-zm-signature'] !== signature) { return res.status(401).send('Unauthorized'); }
const { event, payload } = req.body;
await tajo.connectors.handleWebhook('zoom', { topic: event, payload: payload });
res.status(200).send('OK');});شرح کی حدود
| زمرہ | حد | نوٹس |
|---|---|---|
| ہلکی API کالز | 30 درخواستیں/سیکنڈ | GET صارف، میٹنگ معلومات |
| درمیانی API کالز | 20 درخواستیں/سیکنڈ | شرکاء کی فہرست، ویبینارز |
| بھاری API کالز | 10 درخواستیں/سیکنڈ | رپورٹس، ریکارڈنگز |
| روزانہ کی حد | 5,000+ | پلان کی سطح پر منحصر ہے |
شرح کی حد ہیڈرز
Zoom X-RateLimit-Limit, X-RateLimit-Remaining, اور Retry-After ہیڈرز واپس کرتا ہے۔ 429 غلطیوں سے بچنے کے لیے ان ہیڈرز پر مبنی backoff لاجک نافذ کریں۔
ٹربل شوٹنگ
| مسئلہ | وجہ | حل |
|---|---|---|
| 401 Unauthorized | Token میعاد ختم | Server-to-Server OAuth token ریفریش کریں |
| غائب شرکاء | میٹنگ ختم نہیں ہوئی | مکمل ڈیٹا کے لیے میٹنگ ختم ہونے کا انتظار کریں |
| Webhook توثیق ناکام | غلط secret | Zoom Marketplace میں webhook secret کی تصدیق کریں |
| کوئی ای میل ڈیٹا نہیں | Guest شرکاء | ای میلز capture کرنے کے لیے رجسٹریشن فعال کریں |
| شرح کی حد 429 | بہت زیادہ درخواستیں | exponential backoff نافذ کریں |
ڈیبگ موڈ
connectors: zoom: debug: true log_level: verbose log_webhooks: trueبہترین طرز عمل
- Server-to-Server OAuth استعمال کریں - صارف کی مداخلت کے بغیر آسان تصدیق
- ویبینار رجسٹریشن فعال کریں - حاضرین کے ای میل پتے capture کرنے کے لیے ضروری
- میٹنگ ختم ہونے کے بعد پروسیس کریں - شریک ڈیٹا صرف میٹنگز ختم ہونے کے بعد مکمل ہوتا ہے
- ایونٹ کی قسم کے لحاظ سے سیگمنٹ - میٹنگز بمقابلہ ویبینارز کے لیے مختلف Brevo فہرستیں تفویض کریں
- Engagement میٹرکس ٹریک کریں - لیڈ اسکورنگ کے لیے دورانیہ اور join time استعمال کریں
- ریکارڈنگ فالو اپ بھیجیں - Brevo کے ذریعے ریکارڈنگ لنک ڈیلیوری کو آٹومیٹ کریں
سیکیورٹی
- OAuth 2.0 - Server-to-Server یا صارف کی سطح کا OAuth تصدیق
- Webhook توثیق - HMAC-SHA256 دستخط کی توثیق
- URL توثیق - webhook اینڈ پوائنٹس کے لیے Challenge-response تصدیق
- اسکوپڈ اجازتیں - کم از کم مطلوبہ OAuth اسکوپس کی درخواست کریں
- Token روٹیشن - Server-to-Server tokens خودکار میعاد ختم ہوتی ہے (1 گھنٹہ)
- انکرپٹڈ نقل و حمل - تمام API مواصلات کے لیے TLS 1.2+