Python调用Google Classroom API的Announcement.list()报错问询
功能需求与异常场景
- 需求目标:获取任课教师在Google Classroom平台发布的对应课程的最新公告列表
- 运行异常:执行相关代码时持续触发TypeError报错,报错提示界面标注有TypeError字样
- 原始实现代码:
from googleapiclient.discovery import build from fetch import Fetch get_credit = Fetch() credit = get_credit() #my credentials service = build('classroom', 'v1', credentials=credit) get_data = service.courses() soup = get_data.list().execute() data = soup['courses'] name_course = [name['name'] for name in data] #name of the course course_id = [id['id'] for id in data] #course ID announcement = get_data.announcements() announcement_data = announcement.list(course_id[0], page_token=10).execute() print(announcement_data)
报错触发的核心原因
- 子资源调用链路错误:
get_data是service.courses()生成的课程资源集合实例,本身不存在announcements子资源方法,正确的链式调用链路为service.courses().announcements()。 - 接口参数传值规则错误:
announcements.list()方法要求课程ID必须通过courseId命名关键字参数传入,直接将课程ID作为位置参数传入会触发参数校验失败。 - 参数类型不匹配:
page_token字段要求传入字符串类型的分页标识,传入整数10直接触发类型校验,抛出TypeError。
修正后的可运行代码
from googleapiclient.discovery import build from fetch import Fetch # 初始化身份凭证与服务实例 get_credit = Fetch() credit = get_credit() service = build('classroom', 'v1', credentials=credit) # 拉取关联课程列表,空值兜底避免KeyError courses_resp = service.courses().list().execute() courses = courses_resp.get('courses', []) # 提取课程名称与对应课程ID name_course = [course['name'] for course in courses] course_id = [course['id'] for course in courses] # 拉取指定课程的最新10条公告 announcement_data = service.courses().announcements().list( courseId=course_id[0], pageSize=10, orderBy='updateTime desc' ).execute() print(announcement_data)
实现优化说明
- 替换错误的
page_token=10参数为pageSize=10:前者是分页用的字符串标识,后者是数值类型的单页返回条数控制参数,二者不可混用。 - 新增
orderBy='updateTime desc'参数:接口会直接按公告更新时间倒序返回,拿到的结果就是最新在前的公告列表,不需要额外做二次排序。 - 读取课程列表字段时增加空值兜底:使用
.get('courses', [])的写法,当账号下无关联课程时不会直接抛出KeyError。 - 首次请求不需要携带
pageToken:只有上次接口返回了nextPageToken字段时,才需要把该字段值原样传入,拉取对应分页的内容。
内容的提问来源于stack exchange,提问作者frankgomez
相关产品推荐
相关产品推荐

