2016-04-12 19 views
1

GoogleカレンダーのAPIの一部の機能を実装しています。私はGoogleカレンダーと同期する機能を持っているカスタムカレンダーがあります。つまり、ダッシュボードからGoogleカレンダーアカウントにカレンダーや予定を作成、編集できます。私が直面している主な問題は、Googleカレンダーから直接イベントを更新する場合です。私はプッシュ通知を実装し、このような応答を得る:Googleカレンダーの予定変更時にDBを更新する

{ 
     "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/[email protected]/events?alt=json", 
     "Google_resource_state": "sync", 
     "Google_message_number": "1" 
    } 

しかし、この応答は非常に一般的です。たとえば、このカレンダーに1000件のイベントがあり、1000件の完全なイベントを更新します。私はいつも同じ通知1000を受け取ります。どのイベントIDに変更があるかを知ることができれば、私は自分のDBを実行して更新することができます。

私は時計を初期化方法は、このようなものです:ウェブフックが発生したときに変更されたイベントを得るための良い方法を探している人々のために

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}); 
      } 
     }); 
    }); 
    } 
+0

重複しています。質問はこの[スレッド](http://stackoverflow.com/questions/18206024/update-database-if-change-in-google-calendar-event)で回答されています。 – noogui

+0

そのスレッドでは正しく応答されません。私の最初の質問を読むと、プッシュ通知が正常に設定されていることがわかります。そのカレンダーで何か起こるたびにプッシュ通知を受け取っていました。実際の質問は、どのイベントがプッシュ通知をトリガに変更したかです。私は既に解決策を見つけてここに答えを投稿します。 –

答えて

4

。あなたはこのようなものでしょうX-GOOG-リソース-URIオン

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 

:あなたのウェブフックがトリガされると、あなたはこのような何かを得るでしょう、あなたのOAuth認証で

https://www.googleapis.com/calendar/v3/calendars/[email protected]/events?alt=json 

を、この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: '[email protected]', 
      organizer: '[email protected]', 
      start: Sat Apr 09 2016 00:00:00 GMT-0500 (CDT), 
      end: Sun Apr 10 2016 00:00:00 GMT-0500 (CDT), 
      iCalUID: '[email protected]', 
      event_type_id: 0, 
      calendar_id: 0, 
      timezone_id: 0, 
      sequence: 0, 
      calendar_color_id: '' 
    } 

を、シーケンスです:0、これはインクリメンタルです。これは、イベント(要約、説明、開始日、終了日など)に変更を加えるたびに適用されます。この数字は+1されます。これをデータベースに保存することができます。そのため、Webフックがトリガーするたびに、シーケンスが保存されたシーケンスよりも大きいイベントのみを更新します。基本的に、イベントを更新してシーケンスの新しい値を保存します。次回はWebフックがトリガされ、この条件に含まれるイベントのみをDB上で更新します。

うれしいことに、ハッピーコーディング。

関連する問題