구글 캘린더 API
Writer: 김관호

1.Google Console에서 API키 얻기

Google Console 사이트

1) 캘린더 라이브러리

Lib

라이브러리를 누릅니다.

Calendar

calendar를 검색하고

CalendarStart

사용설정을 합니다.

Lib

사용자 인증 정보로 갑니다.

Key

사용자 인증 정보 만들기 에서 API 키 를 만듭니다.

KeyValue

키 제한을 할 수 있습니다.

KeyRole

calendar만 사용할수 있게 제한을 할 수 있습니다.

2.캘린더에서 ID 얻기

Google Calendar 사이트

1) 캘린더

Cal

원하는 캘린더에 설정 및 공유 를 들어갑니다.

CalAuth

캘린더 엑세스 권한을 설정합니다.

CalID

캘린더 ID를 얻었습니다 🎉🎉🎉

https://www.googleapis.com/calendar/v3/calendars/${calendarID}/events?orderBy=startTime&singleEvents=true&timeMax=${maxTime}&timeMin=${minTime}&key=${googleKey}

${calendarID}는 찾은 calendarID 를 입력해 줍니다.
${googleKey}는 googleKey를 입력해 줍니다.
${minTime}검색할 최소 날짜를 입력해 줍니다.
${maxTime}검색할 최대 날짜를 입력해 줍니다.

시간은 RFC3339 룰을 사용합니다.

minTime를 2019-05-23T00:00:00Z
maxTime 2019-05-25T00:00:00Z

를 해보겠습니다.

CalJson

calendarID 입력
googleKey 입력
최소 ~ 최대 일정 입력
~ (결과값 간단히 보기 )

3.Lambda 코드

1) Code
const https = require('https');
const util = require('util');

exports.handler = (event, context, callback) => {
  var todayDate = new Date();
  // var yesterdayDate = new Date(todayDate.getTime() - 1000*60*60*24);
  // var tomorrowDate = new Date(todayDate.getTime() + 1000*60*60*24);
  // var twoDayAgoDate = new Date(todayDate.getTime() + 1000*60*60*24*2);

  var calendarID = "";
  var googleKey = "";
  requestAPI({
    "method": "GET",
    "port": 443,
    "hostname": "www.googleapis.com",
    "path": `/calendar/v3/calendars/${calendarID}/events?orderBy=startTime&singleEvents=true&timeMax=${maxRFC3339(todayDate)}&timeMin=${minRFC3339(todayDate)}&key=${googleKey}`,
    "content": "",
  }, function(data) {
    var data = JSON.parse(data);
    console.log(data);
  }, function(e) {
    console.log(e);
  });

  const response = {
    statusCode: 200,
    headers: {"Access-Control-Allow-Origin": "*"},
    body: "Success"
  };
  callback(null, response);
};

// 통신 API
function requestAPI(request, callback, errorCallback) {
  const options = {
      method: (request["method"] || "GET"),
      hostname: (request["hostname"] || ""),
      port: (request["port"] || 443),
      headers: (request["headers"] || {"Content-Type": "application/json"}),
      path: (request["path"] || "")
  };
  const req = https.request(options, (res) => {
    res.setEncoding('utf8');
    var body = '';
    res.on('data', (chunk) => {
      body = body + chunk;
    });
    res.on('end',function() {
      if (res.statusCode == 200 || res.statusCode == '200') {
        callback(body);
      } else {
        errorCallback(`statusCode Error: ${res.statusCode}`);
      }
    });
  });
  req.on('error', function (e) {
      errorCallback(e.responseText)
  });
  req.write(util.format("%j", (request["content"] || "")));
  req.end();
}

// 시간
function minRFC3339(date) {
  var year = date.getFullYear();
  var month = (date.getMonth() + 1 < 10) ? `0${date.getMonth() + 1}` : `${date.getMonth() + 1}`;
  var day  = (date.getDate() < 10) ? `0${date.getDate()}` : `${date.getDate()}`;
  return `${year}-${month}-${day}T00:00:00Z`;
}

// 시간
function maxRFC3339(date) {
  var year = date.getFullYear();
  var month = (date.getMonth() + 1 < 10) ? `0${date.getMonth() + 1}` : `${date.getMonth() + 1}`;
  var day  = (date.getDate() < 10) ? `0${date.getDate()}` : `${date.getDate()}`;
  return `${year}-${month}-${day}T23:59:59Z`;
}