In response to the pandemic my school is using Zoom Webinars for various performances. Our student Improv group has done a number of performances. The cast all need to be “panelists” in Zoom parlance, and when you duplicate a Webinar it does not duplicate the panelists. That’s a pain since there are a lot of panelists, and for each you need a name and e-mail address.
I finally got tired of dealing with it and spent a few minutes figuring out the Zoom API. If I ever have a little more time, I’ll make a Google Apps Manager (GAM) knock off that I’ll call ZAM! In the meantime, perhaps someone else will find this helpful.
First, Zoom has good documentation of its API. To start, you will need to build an app to get credentials. For my scripts, I’m using JSON Web Tokens (JWT) for authentication. I found this post in the Zoom Dev Forums helpful as a starting point.
Get information on a Zoom user
Here is a short Python script to get information on a user to give a little idea on how to use the API.
import jwt # pip3 install pyjwt --user import http.client import datetime import json import sys api_key = '********' # replace with credentials from api_sec = '********' # your app in Zoom Marketplace # generate JWT payload = { 'iss': api_key, 'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=2) } jwt_encoded = str(jwt.encode(payload, api_sec), 'utf-8') # call API: get user list conn = http.client.HTTPSConnection("api.zoom.us") headers = { 'authorization': "Bearer %s" % jwt_encoded, 'content-type': "application/json" } email = str(sys.argv[1]) conn.request("GET", "/v2/users/" + email, headers=headers) res = conn.getresponse() response_string = res.read().decode('utf-8') user_json = json.loads(response_string) json_formatted_str = json.dumps(user_json, indent=2) print(json_formatted_str)
You can use this like this:
# python3.7 zoom-user.py user@domain.com { "id": "xxxxxxxxxxx", "first_name": "John", "last_name": "Smith", "email": "user@domain.com", "type": 2, "role_name": "Admin", "pmi": 111111111, "use_pmi": false, "personal_meeting_url": "https://myschool.zoom.us/j/111111111?pwd=UmVTASDFc3pXUTNpOFZNb34A09", "timezone": "America/Chicago", "verified": 0, "dept": "", "created_at": "2020-04-13T02:42:31Z", "last_login_time": "2020-05-22T19:38:06Z", "last_client_version": "4.6.20561.0413(mac)", "pic_url": "https://lh3.googleusercontent.com/a-/AOh14GgQadfagrA8l4U9fhsbZ1hOTMSvDxE3gGQ", "host_key": "111861", "jid": "3timqwabrvs00ayurhg_ha@xmpp.zoom.us", "group_ids": [ "qCpDwoo5T1qS4cn8RSy8rQ" ], "im_group_ids": [], "account_id": "fhsbZ1cOTMSvDxE3g", "language": "en-US", "phone_country": "", "phone_number": "", "status": "active", "job_title": "", "location": "" }
Note: I’ve redacted/change all of the ID and info above for obvious reasons.
Getting a list of all webinars panelists
This Python script lists all of the panelist names and email addresses.
import jwt # pip3 install pyjwt --user import http.client import datetime import json import sys api_key = '********' # replace with credentials from api_sec = '********' # your app in Zoom Marketplace # generate JWT payload = { 'iss': api_key, 'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=2) } jwt_encoded = str(jwt.encode(payload, api_sec), 'utf-8') # call API: get webinar panelists conn = http.client.HTTPSConnection("api.zoom.us") headers = { 'authorization': "Bearer %s" % jwt_encoded, 'content-type': "application/json" } webinarid = str(sys.argv[1]) conn.request("GET", "/v2/webinars/" + webinarid + "/panelists", headers=headers) res = conn.getresponse() response_string = res.read().decode('utf-8') response_json = json.loads(response_string) for panelist in response_json["panelists"]: print(panelist["name"], panelist["email"])
Here is an example of the script in action listing panelists for webinar id 91119118113:
# python3.7 zoom-webinar-panelists.py 91119118113 John Smith jsmith@domain.com Jane Smith jane.smith@anotherdomain.com
Adding Panelists to a Webinar
Next is a Python script to add a panelist to a webinar. It takes the webinar ID, panelist name and email address as parameters.
import jwt # pip3 install pyjwt --user import http.client import datetime import json import sys api_key = '********' # replace with credentials from api_sec = '********' # your app in Zoom Marketplace # generate JWT payload = { 'iss': api_key, 'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=2) } jwt_encoded = str(jwt.encode(payload, api_sec), 'utf-8') # call API: add panelist conn = http.client.HTTPSConnection("api.zoom.us") headers = { 'authorization': "Bearer %s" % jwt_encoded, 'content-type': "application/json" } num_arguments = len(sys.argv)-1 webinar = str(sys.argv[1]) email = sys.argv[num_arguments] name = "" i = 2 while i < num_arguments: name = name + sys.argv[i] + " " i = i+1 name = name.rstrip() print(name, email,webinar) body = "{\"panelists\":[{\"name\":\"" + name + "\",\"email\":\"" + email + "\"}]}" webinar = str(sys.argv[1]) conn.request("POST", "/v2/webinars/" + webinar + "/panelists", body, headers=headers) res = conn.getresponse() response_string = res.read().decode('utf-8')
Here is an exampling of using the script to add “John Q. Public” john.q.public@domain.com to webinar id 91119118113:
python3.7 zoom-webinar-panelists-add.py 91119118113 John Q. Public john.q.public@domain.com {"id":"91119118113","updated_at":"2020-05-25T23:25:22Z"}
Closing Thoughts
Using these ideas in these two scripts, I can easily copy panelists from one webinar to another. Hopefully this is enough to get you started using the Zoom API. As I mentioned at the start, I think it would be awesome to have a tool like GAM but for Zoom. I’d much rather manage Zoom from the command line.