CLI-Anything Zoom:用命令行通过 Zoom REST API 管理会议、参会者与云录制的实战指南
2026/9/10 8:11:59 网站建设 项目流程

CLI-Anything Zoom:用命令行通过 Zoom REST API 管理会议、参会者与云录制的实战指南

【免费下载链接】CLI-Anything"CLI-Anything: Making ALL Software Agent-Native" -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything

cli-anything-zoom是 CLI-Anything 生态中面向 Zoom 的 CLI harness,它通过 Zoom REST API v2 与 OAuth2 认证,把会议全生命周期管理(创建/查询/修改/删除)、参会者登记与云录制归档全部收拢到终端之下。本文以 zoom/agent-harness/cli_anything/zoom/skills/SKILL.md 为核心骨架,结合包内源码与测试,完整讲解安装配置、命令体系、JSON 输出模式与面向 AI Agent 的调用规范,帮助读者在脚本、流水线或 Agent 中稳定驱动 Zoom 会议运营。

一、项目定位与适用场景

cli-anything-zoom是一个面向 Zoom 的 CLI harness,核心目标是“从命令行管理 Zoom 的会议、参会者与录制”。它不依赖 GUI 或浏览器操作(登录时的浏览器授权除外),所有交互均通过 Zoom REST API v2 完成。

  • 会议管理:创建、列出、查看详情、更新、删除会议,以及一键打开 join/start URL;
  • 参会者管理:单个或批量登记参会者(Registrant)、列出登记状态、取消登记、查询已结束会议的出席名单(Participant);
  • 云录制管理:按日期范围列出云录制、查看单个会议的录制文件、下载文件、删除录制。

从源码结构看(见 zoom/agent-harness/cli_anything/zoom/zoom_cli.py),CLI 由authmeetingparticipantrecording四个命令组加一个repl交互命令构成,底层按职责拆分为 core/auth.py、core/meetings.py、core/participants.py、core/recordings.py,网络层统一收敛在 utils/zoom_backend.py。

二、安装与前置条件

2.1 安装

该 CLI 随cli-anything-zoom包一并分发,安装后即获得cli-anything-zoom命令(console_scripts 入口定义见 zoom/agent-harness/setup.py):

pip install cli-anything-zoom # 或从源码安装: cd zoom/agent-harness && pip install -e .

Prerequisites(依据 zoom/agent-harness/cli_anything/zoom/skills/SKILL.md):

  • Python 3.10+(setup.py 中python_requires=">=3.10",依赖click>=8.0.0requests>=2.28.0prompt-toolkit>=3.0.0);
  • 一个可用的 Zoom 账号(免费或付费);
  • 一个 Zoom OAuth App,用于获取 API 凭据。

2.2 创建 Zoom OAuth App(一次性的前置准备)

在 Zoom Marketplace 开发者后台创建一个General App (OAuth),并配置:

配置项取值
Redirect URLhttp://localhost:4199/callback(与 CLI 默认回调一致)
Required scopesuser:read:adminmeeting:read:adminmeeting:write:adminrecording:read:admin

回调地址中的端口4199是 CLI 默认值,与 auth.py 中redirect_uri默认参数http://localhost:4199/callback严格对应,若在 Zoom 后台填写了其他端口,auth setup时需用--redirect-uri显式指定。

2.3 快速上手(三步走)

# 1. 配置 OAuth 凭据 cli-anything-zoom auth setup --client-id YOUR_CLIENT_ID --client-secret YOUR_CLIENT_SECRET # 2. 浏览器授权登录(自动打开浏览器完成 OAuth2) cli-anything-zoom auth login # 3. 创建一场会议 cli-anything-zoom meeting create --topic "Team Standup" --duration 30 # 4. 列出会议 cli-anything-zoom meeting list # 5. 进入交互模式 cli-anything-zoom repl

三、命令体系全览

3.1 基础用法

# 显示帮助 cli-anything-zoom --help # 直接启动交互式 REPL cli-anything-zoom # 以 JSON 输出执行命令(供 Agent/程序消费) cli-anything-zoom --json meeting list

--json是挂载在根命令上的全局 flag,一旦开启,所有命令组的输出都会切换为结构化 JSON(实现见 zoom_cli.py 中的output()函数)。

3.2 Auth:认证与 OAuth2 设置

命令说明
auth setup配置 OAuth App 凭据(client-id / client-secret / redirect-uri)
auth login通过 OAuth2 浏览器流程登录
auth status检查认证状态(是否已配置、是否已登录、token 是否有效)
auth logout移除本地保存的 token

auth setup的关键参数:

cli-anything-zoom auth setup \ --client-id <ID> \ --client-secret <SECRET> \ --redirect-uri http://localhost:4199/callback # 可选,默认即此值

从源码看,setup_oauth()会把凭据写入~/.cli-anything-zoom/config.jsonCONFIG_DIR定义于 utils/zoom_backend.py),并返回配置路径。登录成功后 token 保存在同目录tokens.json;配置目录权限为0o700、凭据与 token 文件权限为0o600,Windows 下还会通过icacls收紧为仅当前用户可访问(见_restrict_path())。

auth login的浏览器流程:CLI 解析回调地址得到端口(默认 4199),启动本地HTTPServer,用webbrowser.open()打开授权 URL;用户授权后 Zoom 回跳到本地回调,服务端捕获code(超时上限 2 分钟),随后调用exchange_code()换取 access/refresh token 并落盘,最后调用GET /users/me验证身份。若本地回调不可用,可手动取码后执行cli-anything-zoom auth login --code <CODE>

3.3 Meeting:会议管理

命令说明
meeting create创建新 Zoom 会议
meeting list列出会议
meeting info获取会议详情
meeting update更新会议
meeting delete删除会议
meeting join在浏览器中打开会议 join URL
meeting start在浏览器中打开会议 start URL(仅主持人可用)

创建会议的完整参数(默认值与取值范围以 zoom_cli.py 与 core/meetings.py 为准):

cli-anything-zoom meeting create \ --topic "Team Standup" \ # 必填,会议主题 --start-time "2025-01-15T10:00:00Z" \ # ISO 8601 起始时间;缺省为即时会议 --duration 30 \ # 时长(分钟),默认 60 --timezone "Asia/Shanghai" \ # 时区,默认 UTC --agenda "Weekly sync" \ # 议程/描述,默认空 --password "123456" \ # 会议密码;不传则由 Zoom 自动生成 --auto-recording cloud \ # none|local|cloud,默认 none --waiting-room \ # 开启等候室 --join-before-host \ # 允许主持人入会前加入 --no-mute \ # 关闭“入会即静音”,默认静音

底层 create_meeting() 会向POST /users/me/meetings发送请求体,其中meeting_type在核心函数中默认2(定时会议),settings聚合auto_recordingwaiting_roomjoin_before_hostmute_upon_entry(由--no-mute取反得到)。

其他会议操作示例:

# 列出会议(status: upcoming|scheduled|live|pending,默认 upcoming;page-size 默认 30) cli-anything-zoom meeting list --status upcoming --page-size 30 # 获取会议详情 cli-anything-zoom meeting info 1234567890 # 更新会议(只更新显式传入的字段,未传字段保持不变) cli-anything-zoom meeting update 1234567890 --topic "New Topic" --duration 45 # 删除会议(非交互模式下需 --confirm 跳过确认) cli-anything-zoom meeting delete 1234567890 --confirm # 浏览器打开加入/开始链接 cli-anything-zoom meeting join 1234567890 cli-anything-zoom meeting start 1234567890

会议列表/详情的标准化输出字段(由_format_meeting()/_format_meeting_summary()归一化):iduuidtopictypestatusstart_timedurationtimezoneagendajoin_urlstart_urlpasswordsettings(含 auto_recording / waiting_room / join_before_host / mute_upon_entry)、created_at。分页信息包含total_recordspage_countpage_numberpage_sizepage_size上限 300 会在后端被min(page_size, 300)钳制。

3.4 Participant:参会者管理

命令说明
participant add为会议登记一位参会者
participant add-batch从 CSV 文件批量登记参会者
participant list列出已登记参会者
participant remove取消某位参会者的登记
participant attended列出已结束会议的出席人员
# 单个登记(会议须开启 registration;返回 registrant_id、join_url 等) cli-anything-zoom participant add 1234567890 \ --email alice@example.com --first-name Alice --last-name Wang # 批量登记:CSV 格式 email,first_name,last_name(首行为表头) cli-anything-zoom participant add-batch 1234567890 registrants.csv # 列出登记(status: approved|pending|denied,默认 approved) cli-anything-zoom participant list 1234567890 --status approved # 取消登记 cli-anything-zoom participant remove 1234567890 REGISTRANT_ID # 查询已结束会议的出席名单(注意:此处参数是会议 UUID,不是数字 ID) cli-anything-zoom participant attended MEETING_UUID

底层实现要点(core/participants.py):

  • add_registrant()调用POST /meetings/{id}/registrants,返回registrant_idjoin_urlstart_time等;
  • add_batch_registrants()逐个调用登记接口并汇总registered/failed计数与逐条errors,批量结果可直接用于流水线判读;
  • remove_registrant()通过PATCH /meetings/{id}/registrants/status提交{"action": "cancel", "registrants": [{"id": ...}]}
  • list_past_participants()调用GET /past_meetings/{uuid}/participants,要求传入会议 UUID(若 UUID 以/开头会自动做双重 URL 编码),并返回每位出席者的join_timeleave_timeduration

概念区分:Zoom 将会前登记的人称为Registrant(登记人),把实际入会的人称为Participant(出席者)participant add/list/remove管理的是前者,participant attended查询的是后者(仅限已结束的会议)。

3.5 Recording:云录制管理

命令说明
recording list列出云录制
recording files列出指定会议的录制文件
recording download下载录制文件
recording delete删除某会议的全部录制
# 按日期范围列出云录制(--from/--to 格式 YYYY-MM-DD,缺省默认近 30 天) cli-anything-zoom recording list --from 2025-01-01 --to 2025-01-31 --page-size 30 # 查看某会议的录制文件(含 download_url、play_url、file_size、file_type 等) cli-anything-zoom recording files 1234567890 # 下载录制(DOWNLOAD_URL 取自 recording files 的输出;--overwrite 可覆盖已存在文件) cli-anything-zoom recording download "https://..." /path/to/save.mp4 # 删除某会议全部录制(非交互模式需 --confirm) cli-anything-zoom recording delete 1234567890 --confirm

core/recordings.py 的实现细节:

  • list_recordings()请求GET /users/me/recordings,按会议聚合recording_files,每个文件包含idfile_typefile_extensionfile_sizestatusrecording_start/enddownload_url
  • download_recording()先通过_get_valid_token()取得有效 access token,再携带Authorization: Bearer头以流式方式下载(timeout=300、每块 8KB),自动创建目标目录;文件已存在且未加--overwrite时抛出FileExistsError拒绝覆盖,下载完成后返回pathsize_bytessize_mb
  • delete_recording()/delete_recording_file()分别支持删除整个会议录制或单个录制文件,UUID 前缀/时同样自动双重编码。

四、REPL 交互模式

不带子命令直接运行cli-anything-zoom即进入交互式 REPL(也可显式执行cli-anything-zoom repl)。会话启动时会打印 banner,并自动检查认证状态:

  • 已登录:显示当前登录用户;
  • 已配置未登录:提示执行auth login
  • 未配置:提示执行auth setup --client-id <ID> --client-secret <SECRET>

REPL 内直接输入命令即可(如meeting listauth status),支持:

  • help查看可用命令速览(涵盖 auth / meeting / participant / recording 全部子命令);
  • quitexitq退出会话;
  • 基于prompt-toolkit的命令行编辑与历史记录、shlex引号字符串解析(含空格的参数可正常处理);
  • 命令出错时不退出会话,仅打印错误信息,便于连续调试。

会话状态管理能力(依据 SKILL.md 的 State Management 章节):REPL 维护会话级历史与状态,支持撤销/重做(undo/redo)等导航能力;项目级状态可保存/加载为 JSON 文件,并追踪修改与变更记录。

五、双输出模式:人类可读与机器可读

所有命令都支持两种输出模式(由根命令的--jsonflag 控制,实现于 zoom_cli.py):

  • 人类可读(默认):表格化、缩进化的格式化文本(_print_dict/_print_list递归打印嵌套字典与列表);
  • 机器可读(--jsonjson.dumps(data, indent=2)输出的结构化 JSON,便于 Agent 与脚本解析。
# 人类可读 cli-anything-zoom meeting list # 机器可读(Agent 消费) cli-anything-zoom --json meeting list

错误处理同样双轨:开启--json时,异常被序列化为{"error": "...", "type": "..."}的 JSON;人类模式下错误写入 stderr 并以非零退出码结束(REPL 内不退出进程)。因此 Agent 可以稳定地“读 stdout 拿数据、读 stderr 拿错误、看退出码判成败”。

六、底层原理:OAuth2 与 API 封装

所有网络请求最终汇聚到 utils/zoom_backend.py,该模块是包内唯一发 HTTP 请求的地方:

  • API 常量API_BASE = "https://api.zoom.us/v2",OAuth 授权端点https://zoom.us/oauth/authorize、令牌端点https://zoom.us/oauth/token
  • 凭据与令牌持久化~/.cli-anything-zoom/config.json(client_id/client_secret/redirect_uri)与tokens.json(access_token/refresh_token/expires_in/saved_at),写入即锁定权限;
  • 令牌自动续期_get_valid_token()在 token 剩余有效期不足 5 分钟(expires_in - 300)时,自动用 refresh_token 换取新令牌并回写,refresh_token 缺失时保留旧值;
  • 统一请求封装api_request()自动附加Authorization: Bearer头,封装 GET/POST/PATCH/DELETE 四种方法(api_get/api_post/api_patch/api_delete),204 响应归一化为{"status": "success"},流式响应(下载)直接返回原始 Response;
  • 身份信息get_current_user()通过GET /users/me获取邮箱、姓名、账号信息,用于登录验证与 REPL 提示符上下文。

七、面向 AI Agent 的调用规范

SKILL.md 明确给出了程序化调用时的五项纪律(这也是将该 CLI 接入 Agent 的最佳实践):

  1. 始终使用--jsonflag获取可解析输出;
  2. 检查返回码—— 0 表示成功,非零表示出错;
  3. 失败时解析 stderr获取错误信息(JSON 模式下错误也会出现在 stderr 的 JSON 结构中);
  4. 所有文件操作使用绝对路径(如recording download的输出路径、add-batch的 CSV 路径);
  5. 导出类操作后校验产物存在(如下载完成后核对返回的pathsize_bytes)。

典型 Agent 工作流示例:

# 1. 以 JSON 列出会议,判断是否有即将召开的会议 cli-anything-zoom --json meeting list --status upcoming # 2. 批量登记参会者并读取注册结果计数 cli-anything-zoom --json participant add-batch 1234567890 /abs/path/registrants.csv # 3. 拉取某会议录制文件的下载地址,再流式下载到本地并核对大小 cli-anything-zoom --json recording files 1234567890 cli-anything-zoom --json recording download "https://..." /abs/path/meeting.mp4

八、测试与质量保障

包的测试策略记录在 zoom/agent-harness/cli_anything/zoom/tests/TEST.md:

  • 单元测试(test_core.py:不发起真实网络请求,所有 Zoom API 调用均被 mock,无需 Zoom 账号即可运行,覆盖 auth setup/login、meeting CRUD、participant 管理、recording 管理、JSON 输出与后端工具函数;
  • 端到端测试(test_full_e2e.py:需要真实 OAuth 凭据,默认跳过,通过环境变量CLI_ANYTHING_ZOOM_E2E=1启用,覆盖认证状态检查与会议完整生命周期(create/read/update/delete)。

运行方式:

# 仅单元测试(无需 Zoom 账号) cd zoom/agent-harness python3 -m pytest cli_anything/zoom/tests/test_core.py -v # E2E 测试(需先完成 auth setup + auth login) CLI_ANYTHING_ZOOM_E2E=1 python3 -m pytest cli_anything/zoom/tests/test_full_e2e.py -v # 全部测试 python3 -m pytest cli_anything/zoom/tests/ -v

根据 TEST.md 记录的测试结果,TestAuthSetupTestAuthLoginTestMeetingCommandsTestParticipantCommandsTestRecordingCommandsTestJsonOutputTestBackend各套件均通过;覆盖率涵盖 auth 模块(OAuth setup、浏览器登录、手动 code 流程、状态检查、logout)、meetings 模块(全量 CRUD、join/start URL 获取)、participants 模块(单个/批量登记、列出、取消、历史出席者)与 recordings 模块(列出、取文件、下载、删除)。

九、版本与延伸阅读

  • 当前包版本为1.0.1(见 zoom/agent-harness/setup.py,SKILL.md 中标注的版本为 1.0.0);
  • 安装方式:pip install cli-anything-zoom,或cd zoom/agent-harness && pip install -e .
  • 更多资料:包内 README(含前置条件与 Quick Start)、测试计划与结果(TEST.md)、CLI 入口与命令定义;
  • 使用前提提醒:所有涉及真实账号数据的操作(登录、建会、录制下载/删除)都需要有效的 Zoom OAuth App 凭据,且 OAuth scope 需覆盖user:read:adminmeeting:read:adminmeeting:write:adminrecording:read:admin

【免费下载链接】CLI-Anything"CLI-Anything: Making ALL Software Agent-Native" -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询