You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 00:37:03