랭체인과 PyQt5를 활용한 일정 및 메모 관리 프로그램

구글 캘린더 일정과 구글 킵 메모를 조회할 수 있는 기능을 추가하여, 사용자가 쉽게 일정과 메모를 확인할 수 있도록 개선하겠습니다. 아래 코드는 이전에 제공한 프로그램에 일정 조회메모 목록 조회 기능을 추가한 버전입니다.

업데이트된 코드: 캘린더 일정 및 Keep 목록 조회 추가

python

import sys import datetime import os.path from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QLineEdit, QPushButton, QDateTimeEdit, QMessageBox, QTextEdit from PyQt5.QtCore import QDateTime 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 import gkeepapi import openai from langchain.llms import OpenAI # 구글 캘린더 API 범위 설정 SCOPES = ['https://www.googleapis.com/auth/calendar.readonly', 'https://www.googleapis.com/auth/calendar'] class ScheduleManager(QWidget): def __init__(self): super().__init__() # Google Calendar 및 Keep 인증 self.google_calendar_service = self.authenticate_google_calendar() self.keep = self.authenticate_google_keep() # OpenAI GPT 설정 self.llm = OpenAI(openai_api_key='your-openai-api-key') # UI 설정 self.initUI() def initUI(self): layout = QVBoxLayout() # 자연어 입력 UI self.nl_input_label = QLabel("자연어로 일정/메모 입력:", self) self.nl_input = QLineEdit(self) self.nl_input.setPlaceholderText("예: '내일 오전 9시에 미팅 일정 추가해줘'") self.process_nl_button = QPushButton("처리", self) self.process_nl_button.clicked.connect(self.process_natural_language) layout.addWidget(self.nl_input_label) layout.addWidget(self.nl_input) layout.addWidget(self.process_nl_button) # 캘린더 일정 조회 UI self.view_calendar_button = QPushButton("캘린더 일정 조회", self) self.view_calendar_button.clicked.connect(self.view_calendar_events) self.calendar_output = QTextEdit(self) self.calendar_output.setReadOnly(True) layout.addWidget(self.view_calendar_button) layout.addWidget(self.calendar_output) # 구글 킵 메모 조회 UI self.view_keep_button = QPushButton("Google Keep 메모 조회", self) self.view_keep_button.clicked.connect(self.view_keep_notes) self.keep_output = QTextEdit(self) self.keep_output.setReadOnly(True) layout.addWidget(self.view_keep_button) layout.addWidget(self.keep_output) self.setLayout(layout) self.setWindowTitle('일정 및 메모 관리 프로그램') self.show() def authenticate_google_calendar(self): """Google Calendar API 인증""" creds = None 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) with open('token.json', 'w') as token: token.write(creds.to_json()) service = build('calendar', 'v3', credentials=creds) return service def authenticate_google_keep(self): """Google Keep 인증""" email = 'your-email@gmail.com' password = 'your-password' keep = gkeepapi.Keep() keep.login(email, password) return keep def process_natural_language(self): """자연어 입력을 처리하여 일정 또는 메모 작업 수행""" user_input = self.nl_input.text() # 자연어 처리 response = self.llm(user_input) if "일정" in response: # 일정 추가 로직 event_summary = "분석된 이벤트 제목" start_time = "분석된 시작 시간" end_time = "분석된 종료 시간" self.add_event_to_calendar(event_summary, start_time, end_time) elif "메모" in response: # 메모 추가 로직 note_title = "분석된 메모 제목" note_text = "분석된 메모 내용" self.add_note_to_keep(note_title, note_text) def add_event_to_calendar(self, event_summary, start_time, end_time): """캘린더에 이벤트 추가""" event = { 'summary': event_summary, 'start': { 'dateTime': start_time, 'timeZone': 'Asia/Seoul', }, 'end': { 'dateTime': end_time, 'timeZone': 'Asia/Seoul', }, } event = self.google_calendar_service.events().insert(calendarId='primary', body=event).execute() QMessageBox.information(self, "이벤트 추가됨", f"이벤트가 추가되었습니다: {event.get('htmlLink')}") def add_note_to_keep(self, note_title, note_text): """Google Keep에 메모 추가""" note = self.keep.createNote(note_title, note_text) self.keep.sync() QMessageBox.information(self, "메모 추가됨", f"메모가 추가되었습니다: {note.title}") def view_calendar_events(self): """구글 캘린더의 최근 일정을 조회하여 표시""" now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z'는 UTC 시간대를 의미 events_result = self.google_calendar_service.events().list(calendarId='primary', timeMin=now, maxResults=10, singleEvents=True, orderBy='startTime').execute() events = events_result.get('items', []) if not events: self.calendar_output.setText("조회할 이벤트가 없습니다.") else: event_text = "최근 일정:\n" for event in events: start = event['start'].get('dateTime', event['start'].get('date')) event_text += f"{start}: {event['summary']}\n" self.calendar_output.setText(event_text) def view_keep_notes(self): """Google Keep의 메모를 조회하여 표시""" notes = self.keep.all() if not notes: self.keep_output.setText("조회할 메모가 없습니다.") else: note_text = "메모 목록:\n" for note in notes: note_text += f"{note.title}: {note.text}\n" self.keep_output.setText(note_text) if __name__ == '__main__': app = QApplication(sys.argv) ex = ScheduleManager() sys.exit(app.exec_())

주요 변경 사항

  • 캘린더 조회 기능 (view_calendar_events 메서드):

  • 사용자는 버튼을 눌러 최근 10개의 Google Calendar 일정을 조회할 수 있습니다.

  • 캘린더의 이벤트는 now 시간 이후의 일정을 조회하고, 결과는 calendar_output 텍스트 창에 표시됩니다.

  • Google Keep 메모 조회 기능 (view_keep_notes 메서드):

  • Google Keep에 저장된 모든 메모를 조회하여 사용자가 볼 수 있도록 합니다.

  • keep_output 텍스트 창에 메모의 제목과 내용을 표시합니다.

  • 자연어 처리 (process_natural_language 메서드):

  • OpenAI의 GPT 모델을 사용하여 자연어 명령어를 해석한 후, 일정 추가나 메모 추가를 처리합니다.

사용 방법

  • 사용자는 자연어 명령어를 입력하여 일정 추가 및 메모 추가를 할 수 있습니다.
  • "캘린더 일정 조회" 버튼을 누르면 최근 일정을 조회하여 표시합니다.
  • "Google Keep 메모 조회" 버튼을 누르면 저장된 모든 메모를 조회하여 표시합니다. 이 코드를 통해 사용자는 쉽게 Google Calendar 일정과 Google Keep 메모를 조회하고 관리할 수 있습니다. 필요에 따라 추가적인 기능도 확장 가능합니다.