【问题标题】:Update DB when Google Calendar Event change当 Google 日历事件发生变化时更新数据库
【发布时间】:2016-04-12 02:48:14
【问题描述】:

我一直在实现google calendar api的一些功能。我有一个自定义日历,它能够与谷歌日历同步。这意味着,您可以从我的仪表板到 Google 日历帐户创建和编辑日历和事件。我面临的主要问题是,如果我直接从我的谷歌日历更新活动。我已经实现了推送通知并得到这样的响应:

    {
      "Google_channel_ID": "19835150 - 0057 - 11e6 - bc9c - 1735798 ca540",
      "Google_channel_token": "calendar_id = 4e7 d5c20ht9lpfdtuukcsvgeq4 @group.calendar.google.com & user_id = 43e d7rxeqqce3fk09ahszc",
      "Google_channel_expiration": "Tue,12 Apr 2016 12: 34: 36 GMT",
      "Google_resource_id": "oLMEEhHAw5Xo3r2187CWykjAtm0",
      "Google_resource_URI": "https: //www.googleapis.com/calendar/v3/calendars/4e7d5c20ht9lpfdtuukcsvgeq4@group.calendar.google.com/events?alt=json",
      "Google_resource_state": "sync",
      "Google_message_number": "1"
   }

但是这个反应很笼统。例如,如果我在此日历上有 1000 个事件,并更新完整的 1000 个事件。我将始终收到相同的通知 1000。我想知道,是否可以获取哪个事件 id 已更改,以便我可以执行并更新到我的数据库。

我初始化手表的方式是这样的:

    exports.watch = function(req, res){
       var channel_id       = uuid.v1();
       var user_id      = req.body.user_id;
       var calendar_id     = req.body.calendar_id;

       authorize(user_id, function(oauth2Client){
          var data = {
             auth: oauth2Client,
             calendarId: calendar_id, 
             resource: {
                id: channel_id,
                token: 'calendar_id='+ calendar_id + '&user_id=' + user_id,
                address: 'https://api.medradr.com/google-watch',
                type: 'web_hook',
                params: {
                   ttl: '36000'
             }
         }
      };
      calendar.events.watch(data, function (err, response) {
          if (err) {
              console.error('The API returned an error: ' + err);
              return;
          }else{
              res.send({ok: true, message: 'Listener created', result:response}); 
          }
      });
    });
   }

【问题讨论】:

  • 重复。这个thread已经回答了问题。
  • 该线程没有正确回答。如果您阅读我的第一个问题,您会看到我已成功配置推送通知,并且每次该日历上发生某些事情时我都会收到推送通知。真正的问题是,现在如何更改推送通知触发的事件之一?我已经找到了解决方案并在这里发布了答案。

标签: node.js calendar google-calendar-api


【解决方案1】:

适合那些正在寻找一种在网络挂钩触发时获取哪些事件发生变化的好方法的人。当你的网络钩子被触发时,你会得到这样的东西:

    X-Goog-Channel-ID: channel-ID-value
    X-Goog-Channel-Token: channel-token-value
    X-Goog-Channel-Expiration: expiration-date-and-time // In human-readable format; present only if channel expires.
    X-Goog-Resource-ID: identifier-for-the-watched-resource
    X-Goog-Resource-URI: version-specific-URI-of-the-watched-resource
    X-Goog-Resource-State: sync
    X-Goog-Message-Number: 1

X-Goog-Resource-URI 上,您会得到如下内容:

    https://www.googleapis.com/calendar/v3/calendars/4e7d5c20ht9lpfdtuukcsvgeq4@group.calendar.google.com/events?alt=json

通过 OAuth 身份验证,您可以向此 URL 发出 GET 请求,以获取属于此日历的所有事件。现在知道哪些资源已被更改的技巧非常简单。对于每个事件,您将获得如下信息:

      { 
           event_id: 335,
           user_id: '43ed7rxeqqce3fk09ahszc',
           kind: 'calendar#event',
           etag: '"2921213870180000"',
           google_id: 'cpbcesg966skprb3rh1p1ud668',
           status: 'confirmed',
           htmlLink: 'https://www.google.com/calendar/event?eid=Y3BiY2VzZzk2NnNrcHJiM3JoMXAxdWQ2NjggNGU3ZDVjMjBodDlscGZkdHV1a2NzdmdlcTRAZw',
           created: Thu Apr 14 2016 00:00:00 GMT-0500 (CDT),
           updated: Thu Apr 14 2016 00:00:00 GMT-0500 (CDT),
           summary: 'Testing google notifications',
           description: '',
           creator: 'guizarkrg@gmail.com',
           organizer: '4e7d5c20ht9lpfdtuukcsvgeq4@group.calendar.google.com',
           start: Sat Apr 09 2016 00:00:00 GMT-0500 (CDT),
           end: Sun Apr 10 2016 00:00:00 GMT-0500 (CDT),
           iCalUID: 'cpbcesg966skprb3rh1p1ud668@google.com',
           event_type_id: 0,
           calendar_id: 0,
           timezone_id: 0,
           sequence: 0,
           calendar_color_id: '' 
     }

如您所见,这是一个序列:0,这是增量的。这意味着,每次您对活动应用一些更改(摘要、描述、开始日期、结束日期等)时。这个数字将增加 +1。您可以将其保存在数据库中,因此每次 Web 挂钩触发时,您只更新序列大于已保存序列的事件。所以基本上,你更新事件并保存序列的新值。下次触发该网络挂钩时,​​它只会在您的数据库上更新此条件中包含的事件。

希望对您有所帮助,祝您编码愉快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-26
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多