在 Google Calendar API 上启动事件 Webhook

问题描述 投票:0回答:3

有没有办法在事件开始时或事件开始前不久获取 webhook?

Google Calendar API 允许创建事件提醒。当事件被激活或开始时是否可以获取 webhook?

例如,如果我为“2020 年 12 月 15 日 15:45 +0530”创建一个事件,我可以在那个时间或几分钟前获得 Webhook?

Google 可能正在使用此类网络钩子来发送提醒电子邮件或警报。我想用它在我的应用程序内发送通知。

google-api google-calendar-api
3个回答
4
投票

目前 Google 问题跟踪器上有一个开放的功能请求,要求添加用于日历提醒的 API。

在这种情况下,您可以做的就是在此处给问题加注星标,并最终添加评论。

解决方法

您可以使用 Apps 脚本创建一个脚本,该脚本将获取特定日期的所有事件并检查其开始时间。

function getEvents() {
    let today = new Date();
    let calendar = CalendarApp.getCalendarById(id);
    let events = calendar.getEventsForDay(today);
    let startTime = today.getHours();
    for (let i = 0; i < events.length; i++) {
        if (events[0].getStartTime() <= startTime) {
            // send email, notification etc;
        }
    }
}

之后,您可以添加一个可安装的时间驱动触发器,例如每 15 分钟运行一次,以触发上述函数的执行。

function createTrigger() {
  ScriptApp.newTrigger('getEvents')
      .timeBased()
      .everyMinutes(15)
      .create();
}

注意

请记住,您可以自定义脚本和触发器,以满足您的需求。

参考


1
投票

您可以使用 IPaaS 轻松做到这一点

使用 IFTTT 的 Google 日历和 Webhook 小程序, IF=> 任何事件开始(您可以设置多少分钟/小时) 然后=>发布Webhooks

您可以设置它;

  • 标题
  • 描述
  • 地点
  • 开始时间
  • 结束时间
  • 活动网址
  • 视频通话URL 在附加标头、URL 参数和/或 JSON 正文中。

虽然触发的时机不太准确。

或者,您可以使用 Integromat 的 Mailhook 来处理提醒通知。

  1. 在您的 Gmail 客户端中设置转发设置,以将提醒通知转发到 Integromat 提供的电子邮件地址
  2. 根据邮件内容,向您的终端发起HTTP请求。

您还拥有此类服务;

https://mailhook.app/

用于将电子邮件转换为网络钩子。

https://cronhooks.io/

用于创建发布 webhook 的计划。


0
投票

这里有一些死胡同,但根据分享的内容,我构建了一些对其他有相同需求的人有用的东西。

  • 此版本从单元格 B1 和 B2 收集“提醒我之前的时间”和 webhook URL(以便用户可以轻松输入),但如果仅供您使用,您可以手动设置它们
  • 此脚本还将在每次修改日历时触发,因此您不必多次手动执行
  • 此脚本将为当天的每个会议创建一个触发器,因此不必通过类似 cron 的时间触发器来运行

Hook 帖子适用于 Mattermost。我没有尝试过其他服务,但我希望大多数服务的工作原理完全相同。

function getEvents() {
  
  // read user input from sheet
  let remind_min_before = SpreadsheetApp.getActiveSheet().getRange("B1").getValue();
  let webhookURL = SpreadsheetApp.getActiveSheet().getRange("B2").getValue();

  let now = new Date();
  let tomorrow = new Date(now);
  tomorrow.setDate(tomorrow.getDate() + 1);
  tomorrow.setHours(1);
  Logger.log("Start Time : " +now)

  // Cleanup existing triggers and re-add the trigger for tomorrow morning 1AM
  deleteTriggers();
  ScriptApp.newTrigger('getEvents').timeBased().at(tomorrow).create();
  // Add a trigger for eeach modification of current users calendar
  ScriptApp.newTrigger('getEvents').forUserCalendar(Calendar.CalendarList.get("primary").getId()).onEventUpdated().create();
  Logger.log("Added trigger at "+tomorrow)

  const calendarId = 'primary';
  const events = Calendar.Events.list(calendarId, {
    timeMin: now.toISOString(),
    timeMax: tomorrow.toISOString(),
    singleEvents: true,
    orderBy: 'startTime'
  });

  for (const event of events.items) {

    let start = new Date(event.start.dateTime)
    let diff =  start - now
    diff = diff / (1000 * 60);
    Logger.log("Event Starts at "+start+" in "+diff+" minutes");

    if ( diff > 0 ) { // do not consider past meetings
      if (diff < (remind_min_before + 1 )) {
        // imminent event : send notification
        Logger.log("Warning imminent meeting !")
        sendHook(event, webhookURL);
      }else{
        //event to come : add a scheduled run
        let nextRun = new Date(start - remind_min_before * 60000);
        ScriptApp.newTrigger('getEvents').timeBased().at(nextRun).create();
        Logger.log("Added trigger at "+nextRun)
      }
    }
  }
}

// Deletes all triggers of this script
function deleteTriggers(){
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    ScriptApp.deleteTrigger(triggers[i]);
  }
}

function sendHook(event, webhookURL) {
  let timeBeforeMeeting = Math.floor((new Date(event.start.dateTime) - new Date()) / (60 * 1000));
  const payload = JSON.stringify({ text: "Reminder : **"+event.summary +"** starts in "+timeBeforeMeeting+" minutes ! https://meet.google.com/"+event.conferenceData.conferenceId });
  const options = {
      method: 'POST',
      contentType: 'application/json',
      payload: payload,
  };
  UrlFetchApp.fetch(webhookURL, options);
}

此外,

appscript.json
用于更精细的权限处理(可选):

{
  "timeZone": "Europe/Paris",
  "dependencies": {
    "enabledAdvancedServices": [
      {
        "userSymbol": "Calendar",
        "version": "v3",
        "serviceId": "calendar"
      }
    ]
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
    "oauthScopes": [
    "https://www.googleapis.com/auth/spreadsheets.currentonly",
    "https://www.googleapis.com/auth/calendar.readonly",
    "https://www.googleapis.com/auth/script.scriptapp",
    "https://www.googleapis.com/auth/script.external_request"
  ]
}

注意事项:

  • 此脚本将在每次运行时删除/创建触发器。我没有找到任何方法来避免为同一事件创建多个触发器,并且在这种状态下对我来说已经足够了:耸肩:
  • 此脚本仅查看用户的主日历。我希望处理其他日历应该不会那么难,但是我们应该吗?
© www.soinside.com 2019 - 2024. All rights reserved.