您可以使用 Registrations
集合中的方法,当 Google 课堂中的数据发生变化时接收通知。
本文提供了概念性概览以及有关如何开始接收推送通知的简单说明。
Google 课堂推送通知概览
借助 Classroom API 推送通知功能,使用 Classroom API 的应用可以订阅课堂中的数据变更通知。 通知通常在更改后几分钟内传送至一个 Cloud Pub/Sub 主题。
如需接收推送通知,您需要设置 Cloud Pub/Sub 主题,并在为相应的通知 Feed 创建注册时提供该主题的名称。
以下是本文档中使用的主要概念的定义:
- “目标”是指发送通知的地方。
- 信息流是一种第三方应用可以订阅的通知。例如,“课程 1234 的学生名单更改”。
- 注册是对 Classroom API 的说明,用于从特定 Feed 将通知发送到目标。
为 Feed 创建注册后,该注册的 Cloud Pub/Sub 主题就会收到来自该 Feed 的通知,直到其过期为止。您的注册有效期为一周,但您可以在过期前随时向 registrations.create()
发出相同的请求,以延长注册期。
您的 Cloud Pub/Sub 主题仅接收与在创建注册时提供的凭据可以查看的资源有关的通知。例如,如果用户从应用撤消了权限或移除了教师的身份,那么系统将不再传递通知。
Feed 类型
Classroom API 当前提供三种类型的 Feed:
- 每个网域都有一个网域学生名单更改 Feed,学生和教师加入和离开该网域中的课程时,系统就会显示通知。
- 每个课程都有一个课程参与者名单变更 Feed,当学生和教师加入和退出该课程,系统就会显示通知。
- 每门课程都有一个课程作业更改 Feed,以便在该课程中创建或修改任何课程作业或学生提交对象时收到通知。
设置 Cloud Pub/Sub 主题
通知将传递到 Cloud Pub/Sub 主题。在 Cloud Pub/Sub 中,您可以通过 web hook 或轮询订阅端点接收通知。
如需设置 Cloud Pub/Sub 主题,您需要执行以下操作:
- 确保您满足 Cloud Pub/Sub 前提条件。
- 设置 Cloud Pub/Sub 客户端。
- 查看 Cloud Pub/Sub 价格,并为开发者控制台项目启用结算功能。
通过命令行工具(最简单的编程方式)或使用 Cloud Pub/Sub API 创建 Cloud Pub/Sub 主题(最简单的方式)。请注意,Cloud Pub/Sub 仅允许有限数量的主题,因此使用一个主题来接收所有通知可确保您的应用不会变得热门。
在 Cloud Pub/Sub 中创建订阅,告知 Cloud Pub/Sub 如何传送您的通知。
最后,在注册推送通知之前,您需要向推送通知服务帐号 (
classroom-notifications@system.gserviceaccount.com
) 授予发布主题的权限。
注意:如果您授予推送通知服务帐号发布到您的 Cloud Pub/Sub 主题的权限,则能够从 Play 管理中心项目发出请求的用户可以确定它是否存在,并注册向其发送通知。许多应用会在客户端存储 OAuth 客户端 ID,因此最终用户或许可以从您的开发者控制台项目发出请求。如果您属于这种情况,并且您担心最终用户会向您的 Cloud Pub/Sub 主题发送不需要的通知,或者知道用于推送通知的 Cloud Pub/Sub 主题的名称,则应考虑从其他开发者控制台项目注册接收推送通知。
注册通知应用
获得 Google 课堂 API 推送通知服务帐号可以发布到的主题后,您可以使用 registrations.create()
方法注册接收通知。registrations.create()
方法可验证推送通知服务帐号是否可以访问提供的 Cloud Pub/Sub 主题。如果推送通知服务帐号无法访问该主题,例如,如果主题不存在,或者您尚未授予该主题的发布权限,则此方法会失败。
授权
与对 Classroom API 的所有调用一样,对 registrations.create()
的调用也必须使用授权令牌获得授权。此身份验证令牌必须包含推送通知范围 (https://www.googleapis.com/auth/classroom.push-notifications
) 以及查看正在发送的通知的相关数据所需的任何范围。
- 对于名单变更 Feed,这表示名单范围或(理想情况下)其只读变体(
https://www.googleapis.com/auth/classroom.rosters.readonly
或https://www.googleapis.com/auth/classroom.rosters
)。 - 对于课程作业 Feed,这意味着课程作业范围的“学生”版本或(理想情况下)其只读变体(
https://www.googleapis.com/auth/classroom.coursework.students.readonly
或https://www.googleapis.com/auth/classroom.coursework.students
)。
如需传送通知,应用必须保留已授权用户拥有所需范围的 OAuth 授权。如果用户断开与应用的连接,通知就会停止。请注意,此用途目前不支持全网域授权。如果您尝试仅使用全网域委派权限来注册通知,则会收到“@MissingGrant 错误”。
接收通知
通知使用 JSON 编码,包含:
- 包含已更改的资源的集合的名称。对于有关名单变更的通知,此字段为
courses.students
或courses.teachers
。对于课程工作变更,该值为courses.courseWork
或courses.courseWork.studentSubmissions
。 - 映射中发生更改的资源的标识符。此映射旨在将参数与相应资源的
get
方法进行匹配。对于有关学生名单变动的通知,系统会填充courseId
和userId
字段,这些字段可以不经修改就发送到 courses.students.get() 或 courses.teachers.get()。同样,对 course.courseWork 集合的更改也会包含courseId
和id
字段,这些字段可以不经修改就发送到 courses.courseWork.get.get1.work1. Work1 的 . 课程第 1 项工作。
以下代码段演示了通知示例:
{
"collection": "courses.students",
"eventType": "CREATED",
"resourceId": {
"courseId": "12345",
"userId": "45678"
}
}
通知还有一个 registrationId
消息属性,其中包含导致通知的注册的标识符,您可以将其与 registrations.delete()
一起取消注册通知。