본문 바로가기

Study Information Technology

여러 캘린더의 이벤트를 자동으로 병합하는 스크립트 생성하기

728x90
반응형

여러 캘린더의 이벤트를 자동으로 병합하는 스크립트 생성하기

Overview

이 글에서는 여러 캘린더의 이벤트를 자동으로 병합하는 스크립트를 작성하는 방법에 대해 자세히 설명하겠습니다. 구체적으로 Google Calendar API를 사용하여 캘린더 이벤트를 가져오고, 이를 하나의 통합된 캘린더로 병합하는 과정을 다루겠습니다. 이 스크립트를 통해 개인 및 팀의 일정을 관리하는 데 큰 도움이 될 것입니다.

1. 환경 설정

캘린더 동기화 스크립트를 작성하기 위해 먼저 개발 환경을 설정해야 합니다. 이를 위해 다음 단계를 따라 진행합니다.

1.1. Google Cloud Platform에서 프로젝트 생성

  1. Google Cloud Console에 로그인합니다.
  2. 새 프로젝트를 생성합니다.
  3. "API 및 서비스" > "라이브러리"로 이동합니다.
  4. "Google Calendar API"를 검색하여 활성화합니다.

1.2. OAuth 2.0 인증 정보 생성

  1. "API 및 서비스" > "사용자 인증 정보"로 이동합니다.
  2. "사용자 인증 정보 만들기"를 클릭하고 "OAuth 클라이언트 ID"를 선택합니다.
  3. 애플리케이션 유형으로 "웹 애플리케이션"을 선택합니다.
  4. 리디렉션 URI를 설정합니다. 예를 들어, http://localhost:8000/callback과 같은 값을 사용할 수 있습니다.
  5. 클라이언트 ID와 클라이언트 비밀을 기록해 둡니다.

1.3. 필수 라이브러리 설치

Python을 사용하여 스크립트를 작성할 것이므로, 필요한 라이브러리를 설치합니다. google-auth, google-auth-oauthlib, google-auth-httplib2, google-api-python-client 라이브러리를 설치합니다. 다음 명령어를 사용하세요.

pip install --upgrade google-auth google-auth-oauthlib google-auth-httplib2 google-api-python-client

2. 스크립트 작성

이제 실제 스크립트를 작성해 보겠습니다. 이 스크립트는 여러 개의 Google 캘린더에서 이벤트를 가져와 하나의 통합된 캘린더에 추가합니다.

2.1. 인증 처리

먼저 Google API에 접근하기 위해 OAuth 2.0 인증을 처리하는 코드를 작성합니다.

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

# 스코프 설정
SCOPES = ['https://www.googleapis.com/auth/calendar']

def authenticate_google_api():
creds = None
# token.json 파일이 존재하면 로드합니다.
if os.path.exists('token.json'):
creds = Credentials.from_authorized_user_file('token.json', 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(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# 자격증명을 token.json에 저장합니다.
with open('token.json', 'w') as token:
token.write(creds.to_json())
return creds

2.2. 이벤트 가져오기

각 캘린더에서 이벤트를 가져오는 함수를 작성합니다.

def get_calendar_events(service, calendar_id, time_min=None):
events_result = service.events().list(calendarId=calendar_id, timeMin=time_min,
maxResults=100, singleEvents=True,
orderBy='startTime').execute()
return events_result.get('items', [])

2.3. 이벤트 병합하기

가져온 이벤트를 하나의 캘린더로 병합하는 기능을 추가합니다.

def merge_events(service, target_calendar_id, events):
for event in events:
event_body = {
'summary': event.get('summary', ''),
'start': {
'dateTime': event['start'].get('dateTime', event['start'].get('date')),
},
'end': {
'dateTime': event['end'].get('dateTime', event['end'].get('date')),
}
}
try:
service.events().insert(calendarId=target_calendar_id, body=event_body).execute()
print(f"Event added: {event_body['summary']}")
except Exception as e:
print(f"Error adding event: {e}")

2.4. 메인 함수

위에서 작성한 함수들을 조합하여 메인 스크립트를 작성합니다.

def main():
creds = authenticate_google_api()
service = build('calendar', 'v3', credentials=creds)

# 병합할 캘린더 ID
calendar_ids = ['calendar1@example.com', 'calendar2@example.com']
target_calendar_id = 'your_target_calendar_id@example.com'

all_events = []
for calendar_id in calendar_ids:
events = get_calendar_events(service, calendar_id)
all_events.extend(events)

# 이벤트 병합
merge_events(service, target_calendar_id, all_events)

if __name__ == '__main__':
main()

3. 에러 처리 및 문제 해결

스크립트를 실행하면서 발생할 수 있는 몇 가지 일반적인 에러와 그 해결책을 살펴보겠습니다.

3.1. 인증 관련 오류

  • 에러 메시지: 401 Unauthorized
  • 해결책: OAuth 인증을 다시 진행하여 새로운 토큰을 생성합니다.

3.2. 이벤트 추가 시 에러

  • 에러 메시지: 403 Forbidden
  • 해결책: 해당 캘린더에 대한 쓰기 권한이 있는지 확인합니다. 필요한 경우 권한을 조정합니다.

3.3. 유효하지 않은 시간 형식

  • 에러 메시지: 400 Bad Request
  • 해결책: 이벤트의 시작 및 종료 시간을 확인하여 ISO 8601 형식(YYYY-MM-DDTHH:MM:SS)이 맞는지 확인합니다.

4. 참고 문서

이제 여러 캘린더의 이벤트를 자동으로 병합하는 스크립트를 작성하고 실행할 수 있습니다. 이 스크립트를 통해 개인 및 팀의 일정을 효율적으로 관리할 수 있을 것입니다. 추가적인 질문이 있다면 언제든지 문의해 주세요!

728x90
반응형