Google Classroom调用courseWork.list遇Scope变更警告及403权限错误怎么办
Google Classroom API:权限范围警告与403权限错误解决
问题分析
权限范围警告原因
调用service.courses().courseWork().list()时触发的范围变更警告,是因为该接口实际需要的权限是classroom.student-submissions.me.readonly,但你初始配置的是classroom.coursework.me.readonly。API会自动调整权限范围,但本地代码的权限声明未同步,因此出现警告。
403权限错误原因
换成推荐的classroom.student-submissions.me.readonly后出现403,是因为这个权限仅允许查看你自己的作业提交记录,而courses().courseWork().list()接口的作用是获取课程内的所有作业(非个人提交内容),两者权限不匹配:
- 若你是学生身份,需要
classroom.coursework.students.readonly权限才能查看课程作业列表; - 若你是教师身份,需要
classroom.coursework.readonly或更高权限。
解决步骤
修正权限范围
根据你的身份替换scopes列表:- 学生身份:
scopes=[ "https://www.googleapis.com/auth/classroom.courses.readonly", "https://www.googleapis.com/auth/classroom.rosters.readonly", "https://www.googleapis.com/auth/classroom.coursework.students.readonly" ] - 教师身份:
scopes=[ "https://www.googleapis.com/auth/classroom.courses.readonly", "https://www.googleapis.com/auth/classroom.rosters.readonly", "https://www.googleapis.com/auth/classroom.coursework.readonly" ]
- 学生身份:
清除旧凭据
修改权限后,删除之前授权生成的凭据文件(通常是token.json),重新运行代码完成授权,确保新权限生效。修改后的完整代码示例
from google.oauth2.credentials import Credentials from google_auth_oauthlib.flow import InstalledAppFlow from googleapiclient.discovery import build import warnings # Set up the OAuth2 flow flow = InstalledAppFlow.from_client_secrets_file( 'client_secret.json', scopes=[ "https://www.googleapis.com/auth/classroom.courses.readonly", "https://www.googleapis.com/auth/classroom.rosters.readonly", "https://www.googleapis.com/auth/classroom.coursework.students.readonly" # 学生身份用这个,教师替换为classroom.coursework.readonly ]) flow.run_local_server(port=0) # Get the OAuth2 credentials creds = flow.credentials # You can then use the credentials to authenticate requests to the Google API service = build('classroom', 'v1', credentials=creds) # Get a list of all the courses that you are a part of courses = service.courses().list().execute() # Loop through the courses and print the course names and IDs for course in courses['courses']: print(f"Course Name: {course['name']}") print(f"Course ID: {course['id']}") cw = service.courses().courseWork().list(courseId=course['id']).execute() for assig in cw['courseWork']: print(assig)
内容的提问来源于stack exchange,提问作者chronosirius
相关产品推荐
相关产品推荐

