저번 포스팅에 이어서 이번에는 API를 이용하여 일정을 추가해본다.
우선, 일정추가 API를 이용하기에 앞서서 지난번엔 토큰만료에 대한 문제를 먼저 해결하기 위해서 코드를 수정하였다.
우선 구글 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)를 이용하여 일정을 추가해 보았다.
다음 포스팅에는 특정 정보를 가져와서 유동적으로 일정을 추가해보는 것을 포스팅할 예정이다.