본문 바로가기
Programming/Python

[Python] 자격증 일정 구글 캘린더 API 연동 프로젝트 (4/4)

by JeeU147 2022. 5. 12.
반응형

안녕하세요.

 

오늘은 파이썬으로 자격증 일정 구글 캘린더 API 연동을 하는 프로젝트를 진행해보려고 합니다.

 

해당 게시글은 4번째 챕터의 글입니다.

 

처음부터 따라가셔야 진행이 됩니다.

 

첫번째 게시글의 링크를 달아놓았으니 참고바랍니다.

2022.05.06 - [프로그래밍/Python] - [Python] 자격증 일정 구글 캘린더 연동 프로젝트 (1/4)

 

[Python] 자격증 일정 구글 캘린더 연동 프로젝트 (1/4)

안녕하세요. 오늘은 파이썬으로 자격증 일정 구글 캘린더 연동을 하는 프로젝트를 진행해보려고 합니다. 준비물 Python 주피터 노트북 or 파이참 2021.10.28 - [프로그래밍/Python] - [Python] 윈도우에서

jeeu147.tistory.com

 

구글 캘린더 일정 삭제
1. 파일 구성과 인증 절차

이전 게시글에 1번과 2번 파트에 해당되는 내용이니 확인바랍니다.

2022.05.10 - [프로그래밍/Python] - [Python] 자격증 일정 구글 캘린더 연동 프로젝트 (3/4)

 

[Python] 자격증 일정 구글 캘린더 연동 프로젝트 (3/4)

안녕하세요. 오늘은 파이썬으로 자격증 일정 구글 캘린더 연동을 하는 프로젝트를 진행해보려고 합니다. 해당 게시글은 3번째 챕터의 글입니다. 처음부터 따라가셔야 진행이 됩니다. 첫번째 게

jeeu147.tistory.com

2. 코드 분석

해당 챕터에서는 코드 분석 위주로 설명드리도록 하겠습니다.

 

깃허브 URL : https://github.com/robot147/Google-Calendar

 

GitHub - robot147/Google-Calendar

Contribute to robot147/Google-Calendar development by creating an account on GitHub.

github.com

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

# 자격명 입력
name = input("삭제하고 싶은 자격명을 입력해주세요 : ")

with open('licenselist.json', 'r', encoding='utf-8') as f:
    json_data = json.load(f)

list = json.loads(json.dumps(json_data, ensure_ascii=False))

if name in list:
    jmCd = list[name]
else:
    print("자격명을 확인하여 다시 입력해주세요.")

# 구글 계정 인증 절차
# from_client_secrets_file 함수를 통하여 OAuth JSON 파일로 token.json를 만들어 줍니다.
# json 파일 위치는 해당 py 파일과 같은 디렉토리에 넣으시면 됩니다.
# If modifying these scopes, delete the file token.json.
SCOPES = ['https://www.googleapis.com/auth/calendar']

"""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.

# 기존에 token.json 파일이 있다면 기존 파일을 참조
if os.path.exists('token.json'):
    creds = Credentials.from_authorized_user_file('token.json', 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(
            'credentials.json', SCOPES)
        creds = flow.run_local_server(port=0)
    # Save the credentials for the next run
    with open('token.json', 'w') as token:
        token.write(creds.to_json())

print("구글 계정 인증 완료")

# 서비스 객체 생성 및 시간 지정
# now = datetime.datetime.utcnow().isoformat() + 'Z'  # 'Z' indicates UTC time
service = build('calendar', 'v3', credentials=creds)

# print(now)

# Call the Calendar API
print('Getting the upcoming 100 events')
# calendarId : 캘린더 ID. primary이 자기 자신입니다. 다른 캘린더에 작성하고 싶다면 매뉴얼을 참조
# timeMin : 언제부터~ 고정값으로 2022-01-01~총100건에 대한 값을 조회
# maxResults : timeMin에서부터 긁은 데이터 중 총 100건에 대해서만 출력 100건 이상 부터는 출력 X
events_result = service.events().list(calendarId='primary',
                                      timeMin='2022-01-01T00:00:00Z',
                                      maxResults=100, singleEvents=True,
                                      orderBy='startTime').execute()
# items : events_result에서 뽑힌 list들의 모든 값
events = events_result.get('items', [])

# deleteData : 삭제될 데이터의 list 선언
deleteData = []
if not events:
    print('No upcoming events found.')

for event in events:
    start = event['start'].get('dateTime', event['start'].get('date'))

    # 삭제하고 싶은 과목명을 입력 eg) 정보처리기사라고 입력하였을 때 캘린더 제목에 정보처리기사가 포함되어 있는 것들을 아이디만 추출하여 deleteData에 삽입
    if name in event['summary']:
        print(start, event['summary'])
        deleteData.append(event['id'])

# deleteData 길이가 0이 아니라면 해당 아이디로 삭제 서비스 호출
if len(deleteData) != 0:
    for data in deleteData:
        # calendarId : 캘린더 ID. primary이 자기 자신입니다. 다른 캘린더에 작성하고 싶다면 매뉴얼을 참조
        service.events().delete(calendarId='primary', eventId=data).execute()

    print("삭제 완료")

1. input 명령어로 입력받은 값으로 name 변수에 값을 저장

2. licenselist.json에 name변수와 동일한 값이 있는지 없는지 확인 없다면 else 조건 실행

3. 구글 계정 인증 절차

4. timeMin : 2022년1월1일부터 총 100개의 양을 검색

5. 해당 값들을 events 변수에 저장

6. events 변수에는 삭제하고 싶은 일정과 삭제하지 않을 일정이 함께 존재하니 삭제하고 싶은 일정들에 대한 변수를 선언(deleteData)

7. events를 for문으로 돌려서 캘린더 제목에 name 변수와 동일한 입력값이 존재한다면 deleteData에 해당 이벤트들의 아이디를 저장

8. deleteData에 값이 있다면 for문을 돌려서 delete서비스 객체를 사용하여 해당 값들을 삭제

3. 캘린더 일정 삭제 결과

아래의 CMD 그림은 해당 delete.py를 실행시킨 화면입니다.

 

삭제한 날짜, 캘린더 이름들이 로그에 남는 모습입니다.

캘린더 일정 삭제 CMD

이전 챕터에서 6월달에 있던 "정보처리기사"가 속해있는 제목의 캘린더 일정을 삭제합니다.

캘린더 일정 삭제 완료

이렇게 해서 구글 캘린더에 정상적으로 일정들이 삭제되는걸 확인할 수 있습니다.

 

궁금한 점 있으시면 댓글 달아주시기 바랍니다. 최대한 아는 범위 내에서 성심성의껏 답변 드리겠습니다.

 

뭐든 만들어보는게 좋을 것 같아서 어떤 개발을 해야될지 계획, 자료수집, 테스트 등 생각해보고 만들어보았습니다.

 

다음에도 이러한 프로젝트를 조금씩 진행해보려고 합니다.

 

특별하진 않지만 일상의 질을 조금이나마 상승시키도록 노력하겠습니다.

 

감사합니다.

반응형

댓글