通过托管 OAuth 调用 Zoom Admin API,管理用户、会议和 Webinar。
文档
zoom-meeting-admin
试用通过 Server-to-Server OAuth,在智能体工作流中管理 Zoom 会议、云录像与账户用户。
它能做什么
封装单一 Python 脚本,按 Server-to-Server OAuth 方式从本地 `.env` 读取凭证后调用 Zoom REST API。脚本只暴露白名单内的 CLI 动作(会议的增删查列、用户的查列、录像列表),未提供通用 REST 调用入口,也不允许构造任意端点请求。创建与删除会议前必须获得用户显式确认,删除还需命令行附带 `--yes`。在已文档化的范围内,支持云录像、周期性会议(每日/每周/每月)以及账户用户查询。
什么时候用它
- 列出即将开始或历史的 Zoom 会议
- 创建一次性或周期性会议
- 查询某用户的云录像列表
- 查找 Zoom 账户下的用户信息
技能文档
Zoom Server-to-Server OAuth REST API
权限与约束
本 Skill 通过 scripts/zoom-s2s.py 调用 Zoom Server-to-Server OAuth REST API,不实现"通用 REST 代理"。
- 声明的工具:
Bash(python3:*)(执行scripts/zoom-s2s.py)、Bash(ls:*)/Bash(cat:*)(查看脚本输出与缓存)、Read(读取凭证文件与文档)。 - 网络访问:向
https://zoom.us/oauth/token与https://api.zoom.us/v2/*发起 HTTPS 请求,传输头包含Authorization: Bearer。 - 文件写入:在
~/.zoom-s2s-token.json缓存访问令牌(已自动chmod 600)。 - 凭证读取:从仓库根目录的
.env读取ZOOM_ACCOUNT_ID/ZOOM_CLIENT_ID/ZOOM_CLIENT_SECRET/ZOOM_USER_ID。 - 允许的 Action(白名单)——禁止构造任意 Zoom REST 请求或调用未列出的端点:
- 会议:
list_meetings/get_meeting/create_meeting/delete_meeting - 用户:
get_user/list_users - 录像:
recordings
- 会议:
- 越权防护:脚本未导出
api_call给上层调用;不得通过修改脚本、注入参数、拼接 URL 等方式旁路调用白名单外的 Zoom 端点(如DELETE /users/{id}、PATCH /accounts/{id}等高风险端点)。 - 强人类确认:
create_meeting与delete_meeting在执行前必须获得用户显式确认;delete_meeting命令还需附加--yes参数。
凭证配置
在 .env 文件中配置(仅 chmod 600,不要提交到任何 Git 仓库):
ZOOM_ACCOUNT_ID=你的AccountID
ZOOM_CLIENT_ID=你的ClientID
ZOOM_CLIENT_SECRET=你的ClientSecret
ZOOM_USER_ID=你的用户邮箱或user_id
⚠️ 完整的安全规范见下一节
## 凭证安全。
Token 获取方式:Server-to-Server OAuth,机器对机器,无需用户交互授权。
凭证安全
.env 中的 ZOOM_CLIENT_SECRET 是长期有效的账户级凭据,等同于账户管理员口令。必须遵守:
- 加入
.gitignore:本仓库.gitignore已包含.env;同步确保 IDE、备份工具、文件同步(iCloud / Dropbox / OneDrive / 坚果云)不会自动上传该文件。 - 限制文件权限:
chmod 600 .env;scripts/zoom-s2s.py缓存的~/.zoom-s2s-token.json同样敏感(已自动chmod 600),不要复制到剪贴板、聊天窗口、终端截图、报错工单、AI 对话上下文或第三方日志服务。 - 不要在共享环境复用:CI runner、公用跳板机、容器镜像、共享开发机中复用同一份凭据 ≈ 凭据公开。
Account ID + Client ID + Client Secret三元组可换得 1 小时有效的访问令牌。 - 最小权限:按
## 最小权限配置建议表按需开启 Scope;不需要的 Action 不要勾选对应权限;delete_meeting之外的写权限(meeting:write:update、user:write:*、account:write:*)默认不要开。 - 独立 App:为此 Skill 单独创建一个 Zoom Server-to-Server App,不要复用其他业务 App 的凭据;一旦泄露,旋转该 App 的凭据即可,不影响其他业务。
- 凭据泄露应急:在 Zoom Marketplace 删除该 App → 重新创建并轮换
ACCOUNT_ID/CLIENT_ID/CLIENT_SECRET/USER_ID四项 →rm -f ~/.zoom-s2s-token.json强制下次重新认证 → 复盘泄露路径。
核心脚本
scripts/zoom-s2s.py — 纯 Python,无外部依赖,兼容 Python 3.7+。
cd ~/.agents/skills/zoom-meeting-admin/scripts
# 获取帮助
python3 zoom-s2s.py help
# 列出即将到来的会议
python3 zoom-s2s.py list_meetings upcoming
# 获取单个会议详情
python3 zoom-s2s.py get_meeting
# 创建会议 (start_time: YYYY-MM-DDTHH:MM:SS)
python3 zoom-s2s.py create_meeting "<主题>" "" <时长分钟> [时区] [密码]
# 创建周期性会议(每周二,7次,每次120分钟)
python3 zoom-s2s.py create_meeting "CSM公开课" "2026-05-23T08:00:00" 120 Asia/Shanghai "" 2 1 2 7
python3 zoom-s2s.py create_meeting "煎饼果子讨论会" "2026-05-05T10:00:00" 60 Asia/Shanghai
# 删除会议
python3 zoom-s2s.py delete_meeting
# 获取云录像
python3 zoom-s2s.py recordings
# 获取用户信息
python3 zoom-s2s.py get_user [user]
# 列出账户下所有用户
python3 zoom-s2s.py list_users [page_size]
Token 缓存
脚本自动缓存 Token 到 ~/.zoom-s2s-token.json(有效期约 50 分钟),重复调用无需每次重新认证。
常用操作快速参考
| 操作 | 命令 |
|---|---|
| 列出最近5个会议 | list_meetings 5 upcoming |
| 列出最近10个历史会议 | list_meetings 10 past |
| 创建明天10点会议 | create_meeting "主题" "YYYY-MM-DDT10:00:00" 60 Asia/Shanghai |
| 创建周期性会议 | create_meeting "主题" "YYYY-MM-DDT20:00:00" 120 America/New_York "" 2 1 2 7 |
| 获取会议详情 | get_meeting |
| 删除会议 | delete_meeting --yes |
| 获取云录像 | recordings 10 |
最小权限配置建议
根据实际使用场景按需开通 scope,不需要的功能不要授权:
| 功能 | 所需 Scope | 建议 |
|---|---|---|
| 列出会议 | meeting:read:list_meetings | ✅ 核心 |
| 查看会议详情 | meeting:read:meeting | ✅ 核心 |
| 创建会议 | meeting:write:create | 按需开启 |
| 删除会议 | meeting:write:delete | ⚠️ 谨慎开启 |
| 读取云录像 | cloud_recording:read:list_user_recordings | ⚠️ 谨慎开启 |
| 列出账户用户 | user:read:list_users | ⚠️ 谨慎开启 |
建议为此 Skill 单独创建一个 Zoom Server-to-Server App,不要复用已有 App 的凭证。
Agent 调用规范
- 创建会议前:向用户确认主题、时间、时长,再执行。
- 删除会议前:必须向用户明确展示会议信息并获得确认,命令需附加
--yes参数。 - 禁止超范围调用:仅允许文档中列出的 Action,不得构造任意 Zoom REST API 请求。
创建周期性会议
CLI 方式
create_meeting 额外支持周期性参数(按位置传递):
python3 zoom-s2s.py create_meeting "<主题>" "" [timezone] [password] \
[recurrence_type] [repeat_interval] [weekly_days] [end_times] [end_date_time]
| 参数 | 说明 | 示例 |
|---|---|---|
recurrence_type | 1=每日, 2=每周, 3=每月 | 2 |
repeat_interval | 每几周/天重复 | 1 |
weekly_days | 周几(字符串,1=周一~7=周日) | "2" |
end_times | 总共几次 | 7 |
end_date_time | 结束日期(二选一) | "2026-10-06T00:00:00Z" |
示例:每周二 20:00,共 7 次,每次 2 小时
python3 zoom-s2s.py create_meeting "北美龙虾 AI 数字员工系列第 2 期" \
"2026-08-18T20:00:00" 120 America/New_York "" 2 1 2 7
API Payload 方式
创建 type=8(周期性会议)的 recurrence 参数说明:
| recurrence.type | 说明 | 可用字段 | 是否可用 |
|---|---|---|---|
| 1 | 每日循环(Daily) | end_date_time 或 count | ✅ |
| 2 | 每周循环(Weekly) | weekly_days(字符串), end_date_time 或 count | ✅ |
| 3 | 每月循环(Monthly) | monthly_day 或 monthly_weeks + weekly_days | ✅ |
⚠️ 关键避坑:weekly_days 必须是字符串,不是数组!
| 错误写法 | 正确写法 |
|---|---|
"weekly_days": [6] | "weekly_days": "6" |
"weekly_days": ["6"] | "weekly_days": "6"(单日) |
"weekly_days": "6,0"(多日,周六+周日) |
weekly_days 取值:1=周一 ~ 7=周日
示例:通过 api_call 直接 POST 创建周期性会议:
payload = {
"topic": "CSM公开课",
"type": 8,
"start_time": "2026-05-23T08:00:00",
"duration": 540,
"timezone": "Asia/Shanghai",
"recurrence": {
"type": 2,
"repeat_interval": 1,
"weekly_days": "6,0", # 周六+周日,字符串!
"end_date_time": "2026-05-24T00:00:00Z"
},
"settings": {
"host_video": True,
"participant_video": True,
"join_before_host": False,
"mute_upon_entry": False
}
}
多日示例(周一+周三+周五):
"weekly_days": "1,3,5"
踩坑记录
- scope 错误 (4711):某些 API(如
get_user)需要在 App 里开通对应 scope,又如list_meetings需要在 App 里开通meeting:read:list_meetings权限 - Token 有效期:Server-to-Server Token 有效期 1 小时,脚本自动刷新并缓存
- 用户 ID:可用邮箱,也可用
list_users查 user_id weekly_days必须为字符串:Zoom API 要求weekly_days是"6"这样的字符串,而非[6]数组,传数组会报 300 错误
常见问题
- 需要准备哪些凭证?
- 需要在 Zoom Marketplace 创建一个 Server-to-Server OAuth 应用,并在仓库根目录的 `.env` 中配置 `ZOOM_ACCOUNT_ID`、`ZOOM_CLIENT_ID`、`ZOOM_CLIENT_SECRET`、`ZOOM_USER_ID`(邮箱或用户 ID),文件权限建议 chmod 600 且不要提交到任何 Git 仓库。脚本会自动换取访问令牌并缓存到 `~/.zoom-s2s-token.json`,约 50 分钟内复用。
- 智能体能直接调用任意 Zoom 接口吗?
- 不能。脚本仅暴露白名单中的动作:会议的增删查列、用户的查列、录像列表,未对外提供通用 `api_call`,也禁止通过修改脚本、注入参数或拼接 URL 绕过白名单去访问其他端点。
- 执行写操作前会做哪些确认?
- `create_meeting` 必须先就主题、开始时间、时长获得用户确认;`delete_meeting` 必须先向用户展示会议信息并取得确认,同时命令行需附带 `--yes` 参数。建议按需开通对应 scope(如 `meeting:write:delete`、`cloud_recording:read:list_user_recordings`),未使用的权限不要勾选。
相关技能
通过 OAuth 网关调度与管理 Zoom 会议、研讨会与云录制。
ClickMeeting (clickmeeting.com). Use this skill for ANY ClickMeeting request — reading, creating, updating, and deleting data. Whenever a task involves Click...
以 AI 机器人身份加入视频会议,提供语音、虚拟形象与屏幕共享四种模式。
通过托管 OAuth 网关读写 Zoho 日历的日历与事件。
Google Meet (workspace.google.com). Use this skill for ANY Google Meet request — reading, creating, and updating data. Whenever a task involves Google Meet, use this skill instead of calling the API directly.