使用服务账号调用Google Calendar API无用户交互时返回404错误如何解决
问题排查与解决步骤
1. 确认目标日历ID正确性
- 打开Google Calendar网页端,找到目标日历点击「设置和共享」,下滑到「集成日历」板块,复制官方给出的日历ID,和代码里
calendarId参数逐字符比对,避免输入错误。
2. 给服务账号授予日历访问权限
这是最常见的报错原因:服务账号是独立的账号实体,默认没有权限访问你的个人/团队日历,需要手动配置权限:
- 同样进入目标日历的「设置和共享」页面,下滑到「与特定用户共享」板块,点击「添加用户」
- 输入服务账号的邮箱地址(该地址可在你下载的JSON密钥文件的
client_email字段中找到) - 权限至少选择「查看所有活动详情」(匹配你配置的只读scope要求),保存后等待2-3分钟权限生效。
- 如果你的日历归属于Google Workspace企业账号,还需要在Workspace管理后台为该服务账号配置全域委派权限,绑定你用到的Calendar只读scope,否则即使加了共享权限也无法访问。
3. 调整API调用逻辑(排查用)
calendarList().get()接口是读取当前账号的日历列表中已订阅的对应条目,刚给服务账号授权的情况下可能还未同步到它的日历列表,就会触发404,可以直接调用事件拉取接口绕过日历列表检查:
# 替换原有的calendarList.get()代码,直接拉取事件验证权限 events_result = service.events().list( calendarId='XXXXXXXXXXX@group.calendar.google.com', maxResults=10, singleEvents=True, orderBy='startTime' ).execute() events = events_result.get('items', []) print(events)
如果该调用能正常返回数据,说明仅为日历列表同步问题,不需要额外调用calendarList().get()接口。
4. 额外检查项
- 确认你的Google Cloud项目已经启用Google Calendar API:进入项目后台搜索「Google Calendar API」,确认状态为已启用。
- 确认JSON密钥文件是对应服务账号的有效密钥,没有下载错其他项目/服务账号的文件。
- 确认你配置的SCOPE和授予服务账号的权限匹配,不要出现权限范围和scope不对应的情况。
内容的提问来源于stack exchange,提问作者דודי שושני
相关产品推荐
相关产品推荐

