调用Google Calendar API创建事件返回HttpError 400报错
问题描述
自行编写的Python脚本用于抓取工作班次信息,将班次作为事件导入Google Calendar,过去一年运行完全正常,近期运行时抛出HttpError 400错误,错误信息如下:
googleapiclient.errors.HttpError: <HttpError 400 when requesting https://www.googleapis.com/calendar/v3/calendars/primary/events?alt=json returned "Bad Request". Details: "[{'domain': 'global', 'reason': 'badRequest', 'message': 'Bad Request'}]">
初期排查怀疑与时区配置相关,但脚本编写完成后未修改过业务逻辑,仅多次更新过chromedriver版本。
根因定位
该错误和chromedriver版本更新无关,错误抛出点在Calendar API事件插入环节,爬虫抓取逻辑的变动不会触发该API报错。核心触发原因如下:
- 直接导致400的问题:Google Calendar API近期下线了对GMT偏移格式时区参数的兼容支持。原代码中事件时区配置写为
'GMT+02:00',属于非标准时区传值,早期API做了兼容可以正常识别,现在API强制要求传入IANA标准时区名,非法传值直接返回400 Bad Request,这也是脚本未改动却突然失效的根本原因。 - 代码中存在两个隐藏的、同样会触发400的逻辑bug:
- 跨日班次的结束日期直接用
SLUTDAG+1计算,遇到月末、年末时会生成类似2024-10-32这类无效日期 - 靠字符串固定下标切片提取年月日时分的逻辑过于脆弱,只要排班网站调整日期显示格式,就会提取到错误数字生成非法时间值
- 跨日班次的结束日期直接用
修复方案
- 替换非法时区配置
将代码中两处'timeZone': 'GMT+02:00'替换为对应地区的IANA标准时区名,丹麦地区使用'Europe/Copenhagen'即可,该配置会自动适配冬令时/夏令时切换,无需手动调整时间偏移量。 - 修复日期计算逻辑
弃用手动拼接数字生成日期的写法,用datetime对象的日期偏移方法处理跨日班次,避免出现无效日期。核心修正代码如下:from datetime import timedelta # 解析完成基础时间数值后,直接生成datetime对象,不要手动拼接字符串 start_dt = datetime.datetime(STARTÅR, STARTMÅNED, STARTDAG, STARTTIME, STARTMINUT) end_dt = datetime.datetime(SLUTÅR, SLUTMÅNED, SLUTDAG, SLUTTIME, SLUTMINUT) # 跨午夜的班次直接给结束时间加1天,自动处理月末、年末的日期进位 if int(tidspunkt) >= 0 and int(tidspunkt) < 4: end_dt = end_dt + timedelta(days=1) # 构造事件体 event = { 'summary': 'Arbejde', 'start': { 'dateTime': start_dt.isoformat(), 'timeZone': 'Europe/Copenhagen', }, 'end': { 'dateTime': end_dt.isoformat(), 'timeZone': 'Europe/Copenhagen', } } - 优化日期解析鲁棒性
建议将正则提取数字后靠下标取值的逻辑,改为按日期时间格式直接解析爬取到的文本,避免网站前端格式微调就导致解析出错。
内容的提问来源于stack exchange,提问作者Rasmus A. C.
相关产品推荐
相关产品推荐

