调用Google Classroom Studentsubmission.patch时遇403 Forbidden错误求助
Google Classroom StudentSubmission.patch 403权限错误排查
调用Google Classroom的StudentSubmission.patch接口时遇到403 Forbidden权限拒绝错误,但studentSubmissions().list接口可以正常调用,更新token.json文件后问题仍未解决,请求排查问题。
评分功能代码
def grade_submissions(service, course_id, coursework_id, submissions, grade): for submission in submissions: submission_id = submission.get('id') # 获取提交ID try: # 更新提交的评分 response = service.courses().courseWork().studentSubmissions().patch( courseId=course_id, courseWorkId=coursework_id, id=submission_id, updateMask='assignedGrade', body={'assignedGrade': grade} ).execute() print(f"已评分提交ID: {submission_id},分数: {grade}") except HttpError as error: print(f"评分提交ID {submission_id}时出错: {error}")
凭证配置代码
SCOPES = [ "https://www.googleapis.com/auth/classroom.courses", # 访问课堂课程 "https://www.googleapis.com/auth/classroom.coursework.students", # 访问学生作业 "https://www.googleapis.com/auth/classroom.coursework.me", # 访问当前用户的作业 "https://www.googleapis.com/auth/drive.readonly" # 只读访问Google Drive ] """展示Classroom API的基础用法 打印用户有权访问的前10个课程名称 """ creds = None # 初始化凭证变量 # 检查是否存在token.json文件以加载现有凭证 # token.json文件存储用户的访问和刷新令牌,首次授权流程完成后自动创建 if os.path.exists("new_token.json"): creds = Credentials.from_authorized_user_file("new_token.json", SCOPES) # 从文件加载凭证 # 如果没有有效凭证,让用户登录 if not creds or not creds.valid: if creds and creds.expired and creds.refresh_token: creds.refresh(Request()) # 如果凭证过期,刷新凭证 else: # 使用客户端密钥文件启动OAuth2流程 flow = InstalledAppFlow.from_client_secrets_file( "credentials.json", SCOPES ) creds = flow.run_local_server(port=0) # 运行本地服务器进行用户认证 # 保存凭证供下次使用 with open("new_token.json", "w") as token: token.write(creds.to_json()) # 将凭证写入token.json try: # 构建Classroom API服务对象 service = build("classroom", "v1", credentials=creds)
排查步骤
- 确认权限范围是否生效:代码中虽配置了
classroom.coursework.students权限,但需确保OAuth授权流程中用户确实授予了该权限。删除new_token.json后重新授权,检查授权页面是否包含"管理学生作业"相关权限选项,勾选后完成授权。 - 验证用户角色:当前授权的Google账号必须是对应课程的教师角色,学生或助教角色仅能查看作业(list接口),无修改评分权限。
- 检查作业配置:确认目标作业是否允许修改评分,比如作业是否已关闭、是否设置了不可修改评分。可通过
courseWork.get接口查看作业的maxPoints和状态配置。 - 校验token实际权限:解析当前
new_token.json中的access_token,确认实际包含的权限范围是否有classroom.coursework.students,若没有则重新生成token。 - 核对请求参数:确保
updateMask参数准确设置为assignedGrade,且assignedGrade值不超过作业的maxPoints范围,避免因参数错误触发权限类报错。
内容的提问来源于stack exchange,提问作者davidocodes
相关产品推荐
相关产品推荐

