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

使用Kotlin配置Google Calendar API v3 watch方法实现事件变更推送

Google Calendar V3 API watch方法Channel配置方案

核心必填参数说明

  • id: 你自行生成的通道唯一标识,长度不超过64字符,用于区分不同的监控通道
  • type: 固定取值web_hook,目前Google Calendar API仅支持webhook类型的变更通知
  • address: 你的服务端公网可访问的HTTPS回调地址,日历发生变更时Google会向该地址发送POST通知,注意必须是HTTPS协议,不支持HTTP和自签名证书
  • token(可选): 自定义校验值,Google推送通知时会将该值放在请求头中,可用于校验请求来源合法性,避免恶意请求
  • expiration(可选): 通道过期时间戳,单位为毫秒,默认最长有效期为1个月,到期后需重新调用watch方法创建新通道

配置步骤和代码修改

你之前的Channel配置缺少必填参数,调整后的相关代码如下:

import java.util.UUID

fun main() {
    val calendar = CalendarAPI()

    val channel = Channel()
    // 填必填参数
    channel.id = UUID.randomUUID().toString() // 生成唯一通道ID
    channel.type = "web_hook" // 固定值
    channel.address = "https://替换为你的公网HTTPS回调地址" // 替换为你自己的服务地址
    // 可选参数配置
    channel.token = "自定义校验token"
    channel.expiration = System.currentTimeMillis() + 7 * 24 * 60 * 60 * 1000 // 示例:设置7天后过期

    // 执行watch调用启动监控
    val createdChannel = calendar.service.events().watch("primary", channel).execute()
    // 建议本地存储返回的通道信息:id、resourceId、过期时间,方便后续续期或停止监控
    println("监控通道创建成功,通道ID: ${createdChannel.id}, 资源ID: ${createdChannel.resourceId}, 过期时间: ${createdChannel.expiration}")

    // 以下为原有逻辑,保持不变即可
    println("Upcoming events:")
    val events = calendar
        .getNext10Events(DateTime(System.currentTimeMillis()))
    calendar.printEvents(events)

    calendar.deleteAllEvents("primary")

    println("\nNew events:")
    val event = calendar.createEvent(
        summary = "CalendarEvent",
        calendarId = "primary",
        startDateTime = DateTime("2021-07-08T14:00:00.000+03:00"),
        endDateTime = DateTime("2021-07-08T15:00:00.000+03:00")
    )

    calendar.printEvents(calendar.getNext10Events(DateTime(System.currentTimeMillis())))
}

回调端处理逻辑说明

  • 首次创建通道时,Google会向回调地址发送校验请求,你需要返回200状态码响应,否则通道会创建失败
  • 正常变更通知的请求头中会携带X-Goog-Channel-Token(你设置的自定义校验token)、X-Goog-Resource-State(变更类型,新增/修改为exists,删除为not_exists)
  • Google的推送通知不会携带具体的事件内容,你收到通知后需要调用events.list接口同步最新的事件列表,和本地存储的内容对比,判断具体的变更内容
  • 通道到期前需要重新调用watch方法创建新通道,避免监控中断

常见注意事项

  • 回调地址必须是公网可访问的HTTPS地址,不能使用localhost,本地调试可以用内网穿透工具映射为公网HTTPS地址
  • 如需主动停止监控,可以调用calendar.service.channels().stop(createdChannel).execute()销毁通道
  • 同一个日历最多可创建10个有效的watch通道,超过限制会报错

内容的提问来源于stack exchange,提问作者Стоян Тинчев

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 11:36:03