Google Classroom API为网站端创建的作业评分的权限错误解决咨询
你遇到的@ProjectPermissionDenied报错原因判断正确:所有通过Google Classroom官方UI创建的作业默认绑定Google内部的Classroom服务项目,只有对应项目发起的修改请求才会被允许,第三方开发者项目默认没有修改权限。官方文档的「Try this API」功能使用的是Google官方的API Explorer项目,和UI创建作业的绑定项目不匹配,所以报相同错误是正常现象,不代表你的接口参数有问题。
以下是两种可行的解决方案,可根据你的账号类型选择:
方案1:适用于Google Workspace教育/企业域用户
- 首先在你的开发者控制台项目中创建服务账号,开启全域权限委派功能
- 联系你的域管理员在Google Admin后台,为该服务账号授权以下必要的API权限范围:
https://www.googleapis.com/auth/classroom.coursework.studentshttps://www.googleapis.com/auth/classroom.grades
- 代码中使用服务账号模拟创建该作业的教师账号发起请求,即可绕过项目匹配限制完成评分,修改后的代码参考:
from google.oauth2 import service_account SCOPES = ['https://www.googleapis.com/auth/classroom.coursework.students', 'https://www.googleapis.com/auth/classroom.grades'] SERVICE_ACCOUNT_FILE = '你的服务账号密钥文件路径.json' # 替换为创建作业的教师邮箱 IMPERSONATE_EMAIL = 'teacher@your-domain.com' credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_FILE, scopes=SCOPES).with_subject(IMPERSONATE_EMAIL) # 初始化service后沿用你原有评分逻辑即可 studentSubmission = { 'assignedGrade': 99, 'draftGrade': 80 } service.courses().courseWork().studentSubmissions().patch( courseId=<course ID or alias>, courseWorkId=<courseWork ID>, id=<studentSubmission ID>, updateMask='assignedGrade,draftGrade', body=studentSubmission).execute()
方案2:适用于个人Google账号用户
个人账号没有域管理员权限,无法使用全域委派功能,可采用变通方案实现需求:
- 先在官方UI端完成作业的内容设计和测试,确认所有配置符合业务要求
- 通过你的开发者项目调用Classroom API的
courses.courseWork.create接口,复制UI端作业的全部配置创建完全相同的作业 - 新创建的作业会绑定你自己的开发者项目,此时你就可以正常调用评分接口修改成绩
注意:两种方案都需要确保你发起请求的账号拥有对应课程的教师/助教权限,作业的评分功能已在课程设置中开启。
内容的提问来源于stack exchange,提问作者Leon
相关产品推荐
相关产品推荐

