#!/usr/bin/env python3 import configparser import json from pprint import pprint from zoomus import ZoomClient import psycopg2 import psycopg2.extras import time import dateutil.parser # import dateutil.tz verbose = True very_verbose = False config = configparser.ConfigParser() config.read('zoom.ini') client = ZoomClient(config['api']['key'], config['api']['secret']) db_conn = psycopg2.connect(dbname=config['db']['name'], user=config['db']['user'], password=config['db']['passwd'], host="127.0.0.1") db = db_conn.cursor(cursor_factory=psycopg2.extras.NamedTupleCursor) def parse_time(iso_time, tz_name): utc = dateutil.parser.isoparse(iso_time) # tz = dateutil.tz.gettz(tz_name) # return utc.astimezone(tz) return utc def add_meeting(uid, meet): if 'start_time' not in meet: # Type 3 meetings (scheduled with no time) are ignored return db.execute(""" INSERT INTO zoom_meetings (meeting_id, uuid, host_id, topic, type, start_time, duration) VALUES (%s, %s, %s, %s, %s, %s, %s) """, ( meet['id'], meet['uuid'], uid, meet['topic'], meet['type'], parse_time(meet['start_time'], meet['timezone']), meet['duration'], )) def get_meetings(uid, user_id): page_id = 1 num_pages = 999 expected_rec = 0 total_rec = 0 while page_id <= num_pages: if verbose: print(f"Fetching meetings for user {user_id}: page {page_id} of {num_pages}") resp = client.meeting.list(user_id = user_id, type = 'upcoming', page_number = page_id) resp.raise_for_status() meeting_list = json.loads(resp.content) if very_verbose: pprint(meeting_list) num_pages = meeting_list['page_count'] expected_rec = meeting_list['total_records'] for meet in meeting_list['meetings']: add_meeting(uid, meet) total_rec += 1 page_id += 1 time.sleep(0.2) assert total_rec == expected_rec, "Unexpected number of records, probably because of race condition" db.execute('DELETE FROM zoom_meetings') db.execute("SELECT * FROM zoom_users") users = db.fetchall() for u in users: get_meetings(u.id, u.user_id) db_conn.commit()