如何通过Google Classroom API获取待完成作业?请求优化咨询
优化Google Classroom待完成作业统计的请求效率
核心优化方案
1. 使用Google API批量请求(Batch Requests)
Google API支持将多个接口请求打包为单个HTTP请求发送,能直接把10门课程的20次请求压缩为1次,大幅降低请求成本。Python的google-api-python-client库原生支持批量请求处理。
示例代码框架:
from googleapiclient.http import BatchHttpRequest def handle_course_work_response(request_id, response, exception): if exception is None: course_id = request_id.split("_")[0] course_work_cache[course_id] = response.get('courseWork', []) def handle_submissions_response(request_id, response, exception): if exception is None: course_id = request_id.split("_")[0] submissions_cache[course_id] = response.get('studentSubmissions', []) # 初始化批量请求及缓存容器 batch = BatchHttpRequest(callback=None) course_work_cache = {} submissions_cache = {} # 遍历课程ID,添加请求到批量任务 for course_id in your_course_ids_list: # 请求仅返回已分配的作业 batch.add( service.courses().courseWork().list( courseId=course_id, courseWorkStates=['ASSIGNED'] ), callback=handle_course_work_response, request_id=f"{course_id}_work" ) # 请求仅返回未提交的记录 batch.add( service.courses().courseWork().studentSubmissions().list( courseId=course_id, userId='me', courseWorkId='-', states=['CREATED'] ), callback=handle_submissions_response, request_id=f"{course_id}_subm" ) # 执行批量请求(仅1次HTTP调用) batch.execute() # 快速匹配待完成作业 for course_id, works in course_work_cache.items(): submissions = submissions_cache.get(course_id, []) subm_map = {subm['courseWorkId']: subm for subm in submissions} for work in works: if work['id'] in subm_map: print(f"课程[{course_id}]待完成作业: {work['title']}")
2. 过滤请求返回数据
在API请求中添加状态过滤参数,减少不必要的数据传输和本地处理:
- 调用
courses().courseWork().list时,指定courseWorkStates=['ASSIGNED'],只返回已分配但未归档/删除的作业 - 调用
studentSubmissions().list时,指定states=['CREATED'],只返回未提交的记录
3. 本地缓存优化
由于脚本每5分钟执行一次,大部分作业状态不会频繁变化:
- 缓存已确认完成的作业ID,后续请求直接跳过
- 仅对临近截止时间的作业做状态校验,其他作业延长缓存周期
优化效果说明
- 批量请求将请求次数从20次降至1次,直接减少95%的请求成本
- 状态过滤减少API返回数据量,降低传输耗时和本地计算量
- 本地缓存进一步减少不必要的API调用,适配周期性执行场景
内容的提问来源于stack exchange,提问作者Samarth Chauhan
相关产品推荐
相关产品推荐

