使用Python Google API V3嵌入谷歌日历:获取iframe展示URL问题
嘿,我完全懂你现在的头疼事儿——用Python调用Google Calendar API v3创建了新日历,想让用户在浏览器里通过iframe查看,但翻遍了API返回的结果,连那个xxxxxxxxx@group.calendar.google.com格式的日历ID都找不到,甚至cal.calendarList().list().execute()返回的内容也没给你有用的线索对吧?别慌,这事儿其实有明确的解决路径,我给你一步步捋清楚:
1. 先拿到日历ID(关键!)
你通过API创建日历的时候,cal.calendars().insert(body=你的日历配置).execute()这个调用的返回结果里,肯定包含id字段,就是那个你要的xxxxxxxxx@group.calendar.google.com格式的字符串。要是当时没存下来,也可以用cal.calendars().list()来列出所有你有权限的日历,找到你创建的那个,提取它的id就行(别用calendarList().list(),这个是用户手动添加到自己日历列表的,API创建的默认不在里面)。
2. 必须设置公开访问权限
这是很多人踩坑的点——API创建的日历默认是私有状态,别说iframe了,别人连访问都不行。你得用ACL(访问控制列表)API给它加一个公开可读的权限:
# 替换成你的日历ID CALENDAR_ID = "xxxxxxxxx@group.calendar.google.com" acl_body = { "role": "reader", "scope": { "type": "default" # 代表所有用户都能访问 } } # 执行权限添加操作 cal.acl().insert(calendarId=CALENDAR_ID, body=acl_body).execute()
如果你只想让特定用户访问,把scope改成type='user'并加上value='目标邮箱'就行,但如果是要iframe公开展示,用default就对了。
3. 直接构造iframe的嵌入URL
有了日历ID和权限,就不用再找什么API返回的嵌入链接了,直接自己构造就行,格式非常固定:
https://calendar.google.com/calendar/embed?src=你的日历ID
把这个URL放到iframe里就能用了,比如HTML代码可以这么写:
<iframe src="https://calendar.google.com/calendar/embed?src=xxxxxxxxx@group.calendar.google.com" style="border: 0" width="800" height="600" frameborder="0" scrolling="no" ></iframe>
要是想自定义展示效果,还能加参数:
&ctz=Asia/Shanghai:设置时区为上海&mode=week:默认显示周视图(默认是月视图)&showNav=0:隐藏顶部导航栏&showPrint=0:隐藏打印按钮
4. 为啥calendarList().list()没用?
calendarList是用户手动添加到自己Google Calendar网页端列表里的日历集合,你通过API创建的日历默认不会自动加入这个列表。如果想让创建者在网页端看到它,可以调用cal.calendarList().insert(body={'id': CALENDAR_ID}).execute()把它加进去,但这一步对于获取iframe URL完全没必要,只是方便管理而已。
最后提醒一句:设置完权限后,最好先把构造好的URL直接在浏览器里打开测试一下,如果能正常看到日历内容,说明权限没问题,iframe就能正常加载;如果提示无权限,回去检查ACL的role和scope是不是设置对了。
内容的提问来源于stack exchange,提问作者Dalen

