Google日历事件更改时更新数据库

我一直在实施谷歌日历API的一些function。 我有一个自定义日历有能力与谷歌日历同步。 这意味着,您可以创build和编辑日历和事件从我的仪表板到谷歌日历帐户。 我面临的主要问题是,如果我直接从我的谷歌日历更新事件。 我已经实现了推送通知,并得到这样的回应:

{ "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}); } }); }); } 

对于那些正在寻找一种好方法的人来说,当web钩子触发时,哪些事件被改变。 当你的web钩子被触发时,你会得到这样的东西:

  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身份validation,您可以向此URL发出获取请求,以获取属于此日历的所有事件。 现在到现在为止哪些资源被改变的技巧非常简单。 对于每一个事件你会得到这样的事情:

  { 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 ,这是增量式的。 这意味着,您每次对事件进行一些更改(摘要,说明,开始date,结束date等)。 这个数字将增加+1。 您可以将其保存在数据库中,因此每次Web钩子触发时,只更新序列>保存序列的事件。 所以基本上,你更新事件并保存序列的新值。 下一次该web钩子触发,它只会在你的数据库上更新包含在这个条件中的事件。

希望它有帮助,快乐的编码。