[Python] 구글 Open API로 캘린더 활용해보기 2 (일정추가)

hukim·2022년 5월 15일
0

Open API

목록 보기
2/11
post-thumbnail

📆 구글 Open API로 캘린더에 일정 추가하기

저번 포스팅에 이어서 이번에는 API를 이용하여 일정을 추가해본다.

우선, 일정추가 API를 이용하기에 앞서서 지난번엔 토큰만료에 대한 문제를 먼저 해결하기 위해서 코드를 수정하였다.

토큰 갱신

클래스화와 SCOPES 수정

우선 구글 API 관련 함수들을 따로 관리하고 유용하게 쓸 수 있게 클래스로 만들었다.

class GoogleCalendar:
    def __init__(self):
        # self.SCOPES = ['https://www.googleapis.com/auth/calendar.readonly']
        self.SCOPES = ['https://www.googleapis.com/auth/calendar']
        self.file_path = "google_api/token.json"

또한, 일정 생성, 삭제 등을 이용하기 위해서는 SCOPES를 수정해준다.

토큰 유효성 확인

    def renew_google_token(self):
        creds = None
        
        if os.path.exists(self.file_path):
            creds = Credentials.from_authorized_user_file(self.file_path, self.SCOPES)
        
        if not creds or not creds.valid:
            if creds and creds.expired and creds.refresh_token:
                creds.refresh(Request())
            else:
                flow = InstalledAppFlow.from_client_secrets_file(
                    'google_api/credentials.json', self.SCOPES)
                creds = flow.run_local_server(port=0)

            with open(self.file_path, 'w') as token:
                token.write(creds.to_json())

        return creds

토큰이 존재하지 않으면 파일을 생성하게끔 되고,
만료되었다면 리프레시를 하여 토큰을 갱신시키게 한다.

전체코드

from __future__ import print_function

import datetime
import os.path
import json
import config
import requests

from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError

class GoogleCalendar:
    def __init__(self):
        self.SCOPES = ['https://www.googleapis.com/auth/calendar']
        self.file_path = "google_api/token.json"

    def renew_google_token(self):
        """Shows basic usage of the Google Calendar API.
        Prints the start and name of the next 10 events on the user's calendar.
        """
        creds = None
        # The file token.json stores the user's access and refresh tokens, and is
        # created automatically when the authorization flow completes for the first
        # time.
        if os.path.exists(self.file_path):
            creds = Credentials.from_authorized_user_file(self.file_path, self.SCOPES)
        # If there are no (valid) credentials available, let the user log in.
        if not creds or not creds.valid:
            if creds and creds.expired and creds.refresh_token:
                creds.refresh(Request())
            else:
                flow = InstalledAppFlow.from_client_secrets_file(
                    'google_api/credentials.json', self.SCOPES)
                creds = flow.run_local_server(port=0)
            # Save the credentials for the next run
            with open(self.file_path, 'w') as token:
                token.write(creds.to_json())

        return creds

    def get_google_token(self):
        self.renew_google_token()

        with open(self.file_path, 'r') as file:
            data = json.load(file)

        return data["token"]

    def get_today_google_calendar(self):
        url = f"https://www.googleapis.com/calendar/v3/calendars/{config.calendar_id}/events"

        now = datetime.datetime.now(datetime.timezone.utc)
        now2 = now + datetime.timedelta(hours=1)

        time_min = now.isoformat()
        time_max = now2.isoformat()

        params = {"key": config.google_api_key, "timeMax": time_max, "timeMin": time_min}
        response = requests.get(url, params=params, headers={"Authorization": f"Bearer {self.get_google_token()}"})

        return response.json()

    def set_google_calendar(self, event):
        creds = self.renew_google_token()
        service = build('calendar', 'v3', credentials=creds)

        # calendarId : 캘린더 ID. primary이 기본 값
        service.events().insert(calendarId=config.calendar_id, body=event).execute()


google_calendar = GoogleCalendar

토큰을 가져오는 함수와 조회, 생성하는 함수를 클래스안에 추가했다.

일정 추가하기

event = {
        'summary': '일정 제목', # 일정 제목
        'location': '서울특별시', # 일정 장소
        'description': '일정 설명', # 일정 설명
        'start': { # 시작 날짜
            'dateTime': today + 'T09:00:00',
            'timeZone': 'Asia/Seoul',
        },
        'end': { # 종료 날짜
            'dateTime': today + 'T10:00:00',
            'timeZone': 'Asia/Seoul',
        },
        # 'recurrence': [ # 반복 지정
        #     'RRULE:FREQ=DAILY;COUNT=1' # 일단위; 총 2번 반복
        # ],
        'attendees': [ # 참석자
            {'email': 'kho5420@gmail.com'},
        ],
        # 'reminders': { # 알림 설정
        #     'useDefault': False,
        #     'overrides': [
        #         # {'method': 'email', 'minutes': 24 * 60}, # 24 * 60분 = 하루 전 알림
        #         # {'method': 'popup', 'minutes': 10}, # 10분 전 알림
        #     ],
        # },
    }

일정을 추가할 때 필요한 정보들이다. 시간설정이나 필요에 따라서 반복 및 알림 설정 등도 설정할 수 있다.

set_google_calendar(event)를 이용하여 일정을 추가해 보았다.

다음 포스팅에는 특정 정보를 가져와서 유동적으로 일정을 추가해보는 것을 포스팅할 예정이다.

0개의 댓글