You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 01:50:20