本文介绍下,如何通过API接口调用Google日历,进而实现在Zoom Rooms控制屏内自动添加会议日程,并实现会议开始前一键加入会议。
一、Zoom Room同步Google日历
当日历资源与 Zoom Room 集成后,会议室的电视显示器、控制器和安排显示器将显示为会议室安排的会议。您组织的成员可以在 Zoom Room 中邀请会议室加入会议。通过日历服务,可以将会议室作为日历资源进行分配。授权 Zoom 访问日历资源使用户能够一键启动和加入会议室中的会议。
1、创建一个新的Google Workspace账号
使用新的Google Workspace账号登录Google日历,并为每一个Zoom Room创建一个新的日历列表。
2、Zoom后台同步Google日历
-
登录 Zoom 门户网站。
注意:账户必须具有 Zoom Room 权限。 -
在会议室管理下,选择日历集成。
-
点击添加日历服务。
-
在 Google 日历部分点击添加。
-
为组织选择与共享日历服务相关联的电子邮件地址。如果未显示日历服务的专门用户,请点击使用其他账户,并添加该用户的凭证。
-
在确认页面上点击允许,授予 Zoom 在专门用户的账户中管理日历的权限。
日历集成页面显示您添加的日历资源。
二、如何创建可以直接加入的Zoom会议
此时,在Google日历界面,我们创建一个新的会议。
之后我们在Zoom Room的控制端,点击【会议列表】,即可看到以下会议信息:
但是此时我们发现,这个会议信息并没有直接可以加入的按钮。仅仅是单纯展示一个即将召开的会议信息。
这对于我们想优雅开会的目标,还是有一些差距的。
那么如何在Google日历里面创建一个可以直接加入的会议呢?
Zoom官方没有给出直接的回答,但是通过Zoom的Chrome插件创建了一个会议之后我们发现,其实很简单。
只需要在创建会议室,Location字段填写Zoom的入会链接URL即可,如下所示。
此时再次查看,Zoom Room控制客户端内多出了一个【开始】按钮,点击此按钮,Zoom Room会议设备可立即加入此会议。
三、优雅的通过API自动创建Google日历
上面的事情做完之后,我们现在可以在OA系统、ERP系统或者企业内部的其他会议管理系统内,通过API的方式自动生成Zoom会议和Google日历项。这样在预定会议室的时候,Zoom会议链接和Zoom Room会议设备都会同期准备好,优雅有格调的开始会议。
代码不长,也不传GitHub了,直接粘贴在这里了
1、模块代码
# coding=utf-8
#ZOOM相关API
import datetime
import re
import sys
import time
import requests
import warnings
import json
import os
from googleapiclient.discovery import build
from google.oauth2 import service_account
from save_log import save_log
warnings.filterwarnings("ignore")
requests.packages.urllib3.disable_warnings
Google_SCOPES = ['https://www.googleapis.com/auth/calendar']
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
Google_SERVICE_ACCOUNT_FILE = BASE_DIR+"\\account_manager_service_account_cc97*****741.json"
#授权空间(scope)和授权秘钥,关于授权和秘钥更多的信息,参考逗老师之前的文章:《Google Admin服务账号+API管理G suit内所有网域用户》
#https://blog.csdn.net/ytlzq0228/article/details/105682567
ZOOM_TOKEN="eyJhbGci***********lQ3-KBhfD0"
#ZOOM_TOKEN获取方式参见:https://marketplace.zoom.us/docs/guides/auth/jwt,看不懂的话,参见文章末尾*注1
MEETINGROOM_DICT={"SZ_8FG3":"c_afqto*********d4tpc@group.calendar.google.com"}
#给每个Zoom Room会议室建立一个日历列表,这里calender_ID的获取方式,参见文章末尾*注2
class Meeting_API:
def create_meeting(username,topic,start_time,duration,MeetingRoom_Name):
try:
save_log(username+topic+start_time+duration+MeetingRoom_Name)
##type字段1为免费用户,2为授权用户
start_time="%sT%s"%(start_time[:10],start_time[-8:])
print(start_time)
session = requests.session()
postUrl = 'https://api.zoom.us/v2/users/%s/meetings'%username
headers = {
'authorization': 'Bearer %s'%ZOOM_TOKEN
}
request_json={
"topic": topic,
"type": 2,
"start_time": start_time,
"duration": duration,
"schedule_for": username,
"default_password": True,
"settings": {
"contact_email":username,
"registrants_email_notification":True
}
}
resp = session.post(postUrl,headers=headers,json=request_json)
run_result=json.loads(resp.text)
Google_API.add_calender(MeetingRoom_Name,topic,run_result['join_url'],start_time,duration)
run_result['code']=resp.status_code
except Exception as err:
raise err
else:
save_log(run_result['code'])
return run_result
class Google_API:
def get_credentials():
try:
credentials = service_account.Credentials.from_service_account_file(Google_SERVICE_ACCOUNT_FILE, scopes=Google_SCOPES)
#授权应用访问G suit控制台,获取授权信息
credentials = credentials.with_subject('zoom_calendar_sync@cs.com')
#委派管理员权限
except Exception as err:
raise err
else:
return credentials
def add_calender(MeetingRoom_Name,topic,location,start_time,duration):
try:
if MeetingRoom_Name not in MEETINGROOM_DICT:
save_log('Meeting Room Not Sync')
return
start_struct = datetime.datetime.strptime(start_time, "%Y-%m-%dT%H:%M:%S")
end_time=datetime.datetime.strftime(start_struct+datetime.timedelta(minutes=int(duration)),"%Y-%m-%dT%H:%M:%S")
credentials=Google_API.get_credentials()
insert_data={
"summary":topic,
"location":location,
"start": {
"dateTime": str(start_time),
"timeZone": 'Asia/Shanghai',
},
"end": {
"dateTime": str(end_time),
"timeZone": 'Asia/Shanghai',
}
}
print(insert_data)
service = build("calendar", "v3", credentials=credentials)
results = service.events().insert(calendarId=MEETINGROOM_DICT[MeetingRoom_Name], body=insert_data).execute()
except Exception as err:
raise err
else:
save_log(results)
return results
def main():
try:
run_result=ZOOM_API.Meeting_API.create_meeting("liziqi@csdn.com","逗老师预定的测试会议3","2021-12-06 22:00:00",60,'SZ_8FG3')
print(run_result)
except Exception as err:
raise
if __name__ == '__main__':
main()
*注1:获取Zoom JWT格式Token
访问以下链接
Zoom App Marketplace App Marketplace
点击右上角Develop->Build App。
点击JWT->Create,创建一个JWT应用。
填写基本信息
然后点击next,配置 App credentials。这里我们点击生成一个JWT Token,然后过期时间选择other,配置一个你觉得你在这个日期前指定已经跑路了的日子,避免未来给自己挖坑。
至此,我们已经得到了一个JWT TOKEN,可以用于Zoom API内的鉴权。
当然,JWT Token是一个安全系数并不怎么高的认证方式。更安全的建议使用OAuth2.0
*注2:获取Google日历ID
进入Google日历,点击某个日历列表右侧,选择Seetings and sharing
往下翻,即可看到此日历列表对应的Calendar ID