Σύνδεσμος Zoom
Συνδέστε το Zoom με το Brevo μέσω Tajo για αυτόματο συγχρονισμό συμμετεχόντων σύσκεψης και παρευρισκόμενων σε webinar ως επαφές, ενεργοποίηση ακολουθιών παρακολούθησης μετά τη σύσκεψη και παρακολούθηση μετρικών αφοσίωσης για τους αυτοματισμούς marketing σας.
Επισκόπηση
| Ιδιότητα | Τιμή |
|---|---|
| Πλατφόρμα | Zoom |
| Κατηγορία | Τηλεδιάσκεψη (Προσαρμοσμένο) |
| Πολυπλοκότητα Ρύθμισης | Μεσαία |
| Επίσημη Ενσωμάτωση | Όχι |
| Δεδομένα που Συγχρονίζονται | Συμμετέχοντες, Εκδηλώσεις, Webinars, Επαφές |
| Μέθοδος Πιστοποίησης | OAuth 2.0 / Server-to-Server OAuth |
Χαρακτηριστικά
- Συγχρονισμός συμμετεχόντων - Αυτόματη δημιουργία επαφών Brevo από συμμετέχοντες σύσκεψης
- Καταγραφή παρευρισκόμενων webinar - Συγχρονισμός εγγεγραμμένων και παρευρισκόμενων σε webinar
- Ενεργοποιητές εκδηλώσεων σύσκεψης - Εκκίνηση αυτοματισμών κατά έναρξη, λήξη σύσκεψης και εκδηλώσεις ηχογράφησης
- Παρακολούθηση αφοσίωσης - Παρακολούθηση διάρκειας παρουσίας και μετρικών συμμετοχής
- Παρακολούθηση webinar - Ενεργοποίηση στοχευμένων ακολουθιών email βάσει παρουσίας σε webinar
- Ειδοποιήσεις ηχογράφησης - Αποστολή συνδέσμων ηχογράφησης μέσω καμπανιών email Brevo
Προαπαιτούμενα
Πριν ξεκινήσετε, βεβαιωθείτε ότι διαθέτετε:
- Λογαριασμό Zoom (Pro πλάνο ή παραπάνω)
- Εφαρμογή Zoom Server-to-Server OAuth ή OAuth μέσω Zoom App Marketplace
- Λογαριασμό Brevo με πρόσβαση API
- Λογαριασμό 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_SOURCEEndpoints API
| Endpoint | Μέθοδος | Περιγραφή |
|---|---|---|
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 | Λίστα webinars |
https://api.zoom.us/v2/webinars/{webinarId}/registrants | GET | Λίστα εγγεγραμμένων webinar |
https://api.zoom.us/v2/webinars/{webinarId}/participants | GET | Λίστα συμμετεχόντων webinar |
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] }); }}Συγχρονισμός Παρευρισκόμενων Webinar
// 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] });}Χειρισμός Webhooks Zoom
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 αιτ./δευτ. | Λίστα συμμετεχόντων, webinars |
| Βαριές κλήσεις API | 10 αιτ./δευτ. | Αναφορές, ηχογραφήσεις |
| Ημερήσιο όριο | 5.000+ | Εξαρτάται από το επίπεδο πλάνου |
Headers Ορίου Ρυθμού
Το Zoom επιστρέφει headers X-RateLimit-Limit, X-RateLimit-Remaining και Retry-After. Εφαρμόστε λογική backoff βάσει αυτών των headers για αποφυγή σφαλμάτων 429.
Αντιμετώπιση Προβλημάτων
| Πρόβλημα | Αιτία | Λύση |
|---|---|---|
| 401 Unauthorized | Ληγμένο token | Ανανεώστε Server-to-Server OAuth token |
| Λείπουν συμμετέχοντες | Η σύσκεψη δεν έχει λήξει | Αναμείνετε τη λήξη σύσκεψης για πλήρη δεδομένα |
| Αποτυχία επικύρωσης webhook | Λανθασμένο μυστικό | Επαληθεύστε το μυστικό webhook στο Zoom Marketplace |
| Δεν υπάρχουν δεδομένα email | Επισκέπτες συμμετέχοντες | Ενεργοποιήστε εγγραφή για καταγραφή emails |
| Όριο ρυθμού 429 | Υπερβολικά πολλά αιτήματα | Εφαρμόστε εκθετική καθυστέρηση |
Λειτουργία Εντοπισμού Σφαλμάτων
connectors: zoom: debug: true log_level: verbose log_webhooks: trueΒέλτιστες Πρακτικές
- Χρησιμοποιήστε Server-to-Server OAuth - Απλούστερη πιστοποίηση χωρίς αλληλεπίδραση χρήστη
- Ενεργοποιήστε εγγραφή webinar - Απαιτείται για καταγραφή διευθύνσεων email παρευρισκόμενων
- Επεξεργαστείτε μετά τη λήξη σύσκεψης - Τα δεδομένα συμμετεχόντων είναι πλήρη μόνο μετά τη λήξη συσκέψεων
- Τμηματοποιήστε κατά τύπο εκδήλωσης - Αναθέστε διαφορετικές λίστες Brevo για συσκέψεις έναντι webinars
- Παρακολουθήστε μετρικές αφοσίωσης - Χρησιμοποιήστε διάρκεια και ώρα σύνδεσης για βαθμολόγηση lead
- Αποστέλλετε παρακολούθηση ηχογράφησης - Αυτοματοποιήστε παράδοση συνδέσμου ηχογράφησης μέσω Brevo
Ασφάλεια
- OAuth 2.0 - Server-to-Server ή OAuth πιστοποίηση επιπέδου χρήστη
- Επικύρωση webhook - Επικύρωση υπογραφής HMAC-SHA256
- Επικύρωση URL - Επαλήθευση challenge-response για endpoints webhook
- Δικαιώματα με εύρος - Αίτηση ελάχιστων απαιτούμενων OAuth scopes
- Εναλλαγή token - Τα Server-to-Server tokens λήγουν αυτόματα (1 ώρα)
- Κρυπτογραφημένη μεταφορά - TLS 1.2+ για όλες τις επικοινωνίες API