gogcli 教程:使用gog classroom guardian-invitations get查询 Google Classroom 监护人邀请详情
【免费下载链接】gogcliGoogle Workspace in your terminal.项目地址: https://gitcode.com/GitHub_Trending/gogcl/gogcli
gog classroom guardian-invitations get是 gogcli(Google Workspace in your terminal)CLI 中用于按studentId与invitationId精确读取某条监护人(Guardian)邀请记录的只读命令。本文围绕该命令的完整用法展开:先给出命令在 Classroom 命令树中的位置与别名体系,再逐一讲解两个必选位置参数、纯文本(TSV)与 JSON 两种输出格式的字段语义,最后结合仓库源码与测试用例剖析其底层调用链与错误处理方式,帮助你把它接入自动化脚本或日常巡检流程。
命令定位:Classroom 命令树中的 guardian-invitations 分支
在 gogcli 的 Classroom 子命令树中,监护人邀请是独立于"已建立的监护人关系(guardians)"的一个分支。从源码 internal/cmd/classroom.go 可以看到,顶层gog classroom同时挂载了两个相关命令组:
guardians(别名guardian):管理已生效的监护人记录(list / get / delete);guardian-invitations(别名guardian-invites):管理待监护人接受的邀请(list / get / create)。
guardian-invitations组内部由 internal/cmd/classroom_guardians.go 中的ClassroomGuardianInvitesCmd定义:
type ClassroomGuardianInvitesCmd struct { List ClassroomGuardianInvitesListCmd `cmd:"" default:"withargs" aliases:"ls" help:"List guardian invitations"` Get ClassroomGuardianInvitesGetCmd `cmd:"" aliases:"info,show" help:"Get a guardian invitation"` Create ClassroomGuardianInvitesCreateCmd `cmd:"" aliases:"add,new" help:"Create a guardian invitation"` }与"监护人关系"不同,guardian-invitations只有创建与读取操作(没有 delete/update),因为邀请的生命周期(待处理 PENDING / 已完成 COMPLETE)由被邀请方或 Google 后台驱动。get命令定位是:给定学生与邀请 ID,获取一条邀请的完整快照,对应文档 gog-classroom-guardian-invitations-get.md。
用法语法与别名体系
文档定义的标准用法如下:
gog classroom (class) guardian-invitations (guardian-invites) get (info,show) <studentId> <invitationId>括号表示可选等价写法,因此以下命令完全等价:
gog classroom guardian-invitations get s1 gi1 gog classroom guardian-invites get s1 gi1 # 使用父命令别名 gog classroom guardian-invitations show s1 gi1 # 使用 get 的别名 gog classroom guardian-invites info s1 gi1 # 别名组合使用从命令行解析角度看,这些别名全部由 go-kong 的aliases标签声明(见ClassroomGuardianInvitesGetCmd的aliases:"info,show"与父命令的aliases:"guardian-invites"),所以无论你习惯长名称还是短名称,都会命中同一个Run方法。
该命令属于纯读操作,不需要--force/--yes确认,也不会触发 dry-run 拦截;配合文档中推荐的-j/--json或-p/--plain输出标志,非常适合写入脚本或 Agent 工具链。
位置参数详解
命令只接受两个必选位置参数(源码结构体定义见 internal/cmd/classroom_guardians.go):
| 参数 | 类型 | 说明 |
|---|---|---|
<studentId> | string | 学生 ID,即 Classroom 学生资料的用户标识,必填,不可为空 |
<invitationId> | string | 监护人邀请 ID,由 Classroom API 在创建邀请时分配,必填,不可为空 |
参数校验在源码Run方法中显式完成:studentId与invitationId均会先strings.TrimSpace去除首尾空白,再判空;任一为空都会返回usage错误(对应"empty studentId"/"empty invitationId"),错误码为命令行参数错误(从项目测试可见参数类错误退出码为 2)。
如何拿到这两个 ID?通常的组合路径是:
- 先列出学生:
gog classroom students <courseId>,取得studentId; - 再列出该学生的监护人邀请:
gog classroom guardian-invitations list <studentId>,在输出中看到INVITATION_ID(对应源码展示列INVITATION_ID); - 最后用本命令针对具体
invitationId做精确查询。
输出格式:TSV 纯文本与 JSON
get命令会根据全局输出标志切换两种返回形态,分支判断在 internal/cmd/classroom_guardians.go 中。
纯文本模式(默认 /-p/--plain/--tsv)
默认人类可读输出为key\tvalue的键值对形式(稳定、可 parse):
id gi1 student_id s1 email guardian@example.com state PENDING created 2026-06-12T12:00:00Z字段语义与 Classroom API 的GuardianInvitation资源一一对应:
| 输出行 | 来源字段 | 说明 |
|---|---|---|
id | InvitationId | 邀请唯一标识 |
student_id | StudentId | 关联学生 ID |
email | InvitedEmailAddress | 被邀请的监护人邮箱地址 |
state | State | 邀请状态,取值PENDING(待处理)或COMPLETE(已完成) |
created | CreationTime | 创建时间(RFC3339 格式),仅当非空时才输出该行 |
注意created行的条件输出逻辑(源码if inv.CreationTime != ""),这意味着当 Classroom API 未返回创建时间时,纯文本输出中会缺少该行——脚本解析时不应假定字段固定存在。
JSON 模式(-j/--json/--machine)
JSON 模式下命令将完整资源包装在invitation键下输出:
{ "invitation": { "invitationId": "gi1", "studentId": "s1", "invitedEmailAddress": "guardian@example.com", "state": "PENDING", "creationTime": "2026-06-12T12:00:00Z" } }该包装结构来自源码:
return outfmt.WriteJSON(ctx, stdoutWriter(ctx), map[string]any{"invitation": inv})invitation键下是 Classroom Go SDKclassroom.GuardianInvitation序列化后的完整字段,比纯文本模式多出 API 返回的全部原始属性(如userId等可选字段),适合需要完整数据的下游程序。若只要主结果、丢弃包裹层,可叠加--results-only;若要挑选字段,可使用--select(带点路径支持)。
全局 Flags 速查
get命令自身只携带两个位置参数,但继承 gogcli 全部全局标志。以下为文档 flags 表中与日常脚本使用最相关的一组,完整清单见 gog-classroom-guardian-invitations-get.md:
| Flag | 类型 | 默认 | 作用 |
|---|---|---|---|
-a/--account/--acct | string | 指定账户邮箱、别名或auto(Google API 命令通用) | |
--client | string | 指定 OAuth 客户端名(选择对应凭证与令牌桶) | |
--access-token | string | 直接使用提供的访问令牌(绕过存储的 refresh token;令牌约 1 小时过期) | |
--quota-project | string | 指定为 API 用量计费的 GCP 项目(发送X-Goog-User-Project) | |
-j/--json/--machine | bool | false | JSON 输出到 stdout,脚本友好 |
-p/--plain/--tsv | bool | false | 稳定可解析的 TSV 文本输出,无颜色 |
--results-only | bool | JSON 模式只输出主结果,去掉 nextPageToken 等信封字段 | |
--select/--pick/--project | string | JSON 模式下按逗号分隔字段名选取(尽力而为,支持点路径) | |
--readonly | bool | false | 运行时拦截一切变更类 API 请求;本命令天然兼容 |
--no-input/--non-interactive | bool | 不提示、直接失败(CI 场景) | |
--gmail-no-send | bool | false | 阻止 Gmail 发送操作(Agent 安全) |
--dry-run/-n | bool | 不实际执行,打印预期动作后成功退出 | |
--enable-commands/--disable-commands/--enable-commands-exact | string | 以点路径白/黑名单限制可用命令(Agent 沙箱场景) | |
--wrap-untrusted | bool | false | JSON/raw 输出中对拉取的文本字段包裹外部不可信内容标记 |
--home | string | 覆盖 gogcli 配置/数据/状态/缓存根目录(等价GOG_HOME) | |
--color | string | auto | 颜色输出:auto / always / never |
-v/--verbose | bool | 开启详细日志 | |
-h/--help | kong.helpFlag | 上下文相关帮助 |
针对本命令建议:做审计查询时固定--account与--client避免歧义;接入 CI 时加--no-input和--json;若只关心某几个字段,配合--select收敛输出体积。
源码级实现:一次查询背后的调用链
get的Run方法(internal/cmd/classroom_guardians.go)执行顺序如下:
账户解析:
requireAccount(flags)从全局标志解析出当前 Google 账户;参数校验:trim 后判空,空参数直接返回
usage错误;服务构建:
classroomService(ctx, account)创建 Classroom API 客户端,失败时经wrapClassroomError包装为带上下文的友好错误;API 调用:核心一行
inv, err := svc.UserProfiles.GuardianInvitations.Get(studentID, invitationID).Context(ctx).Do()即调用 Google Classroom API 的
userProfiles.guardianInvitations.get端点,Context(ctx)保证请求可被取消/超时控制;输出分发:按
outfmt.IsJSON(ctx)选择 JSON 包装输出或纯文本键值输出。
错误处理与空结果语义
- 参数错误:返回
usage(...),退出码为 2(测试TestExecute_ClassroomValidationErrors与TestExecute_ClassroomListInvalidMaxFailsBeforeService中,参数类错误均断言ExitCode(err) != 2); - API 错误:统一
wrapClassroomError包装,保留 API 原始错误信息并附上下文; - 找不到邀请:由 Classroom API 返回
404类错误,同样经包装后以非零退出码呈现(注意get与list --fail-empty的"无结果"语义不同:list可用--fail-empty以退出码 3 表达空结果,而get对不存在的 ID 直接走 API 错误路径)。
测试佐证
仓库测试明确覆盖了该命令的端到端调用路径:
- internal/cmd/execute_classroom_more_commands_test.go 中依次验证了
list、get、create三个子命令的 JSON 执行(runJSON("classroom", "guardian-invitations", "get", "s1", "gi1")); - internal/cmd/classroom_presentation_test.go 验证了邀请的列表展示列:
INVITATION_ID、EMAIL、STATE、CREATED(展示定义见 internal/cmd/classroom_presentation.go),与get纯文本输出的字段口径一致; - internal/cmd/dryrun_e2e_test.go 中 dry-run 操作码统一为
classroom.guardian-invitations.create,说明邀请的创建会走 dry-run 防护,而get属只读操作不受影响。
与兄弟命令的组合使用
get通常与guardian-invitations组的其他命令配合:
- gog classroom guardian-invitations list:按学生分页列出邀请,支持
--email、--state(逗号分隔的PENDING,COMPLETE)、--max/--page/--all分页;先用它拿到INVITATION_ID,再精确get; - gog classroom guardian-invitations create:为指定学生向某邮箱发起邀请(
--email必填);创建后即可用get回查邀请状态,形成"创建→确认→跟踪"闭环; - 父命令入口 gog classroom 与完整命令索引 docs/commands/README.md 提供全量上下文。
一个典型巡检场景示例:
# 列出学生 s1 名下所有待处理邀请,逐条查看详情 gog classroom guardian-invitations list s1 --state PENDING --json | \ jq -r '.invitations[].invitationId' | while read -r gid; do gog classroom guardian-invitations get s1 "$gid" --plain done(此处假设环境中可用jq做管道处理;纯gog单命令场景可直接get单条。)
总结
gog classroom guardian-invitations get <studentId> <invitationId>是 gogcli 面向 Classroom 监护人邀请场景提供的精确只读查询入口:两个必选位置参数、info/show别名、TSV 与 JSON 双输出模式,底层直连userProfiles.guardianInvitations.getAPI,并通过统一参数校验与错误包装保证脚本可预期的退出行为。配合guardian-invitations的list与create,足以覆盖"邀请创建—查询—状态跟踪"的完整运维链路;配合全局--json、--no-input、--account等标志,可无缝嵌入 CI 巡检与自动化工具。
【免费下载链接】gogcliGoogle Workspace in your terminal.项目地址: https://gitcode.com/GitHub_Trending/gogcl/gogcli
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考