Files
Doctrine-Check/utils/google_drive.py
2025-12-10 13:27:48 +09:00

67 lines
2.5 KiB
Python

import os
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
from googleapiclient.http import MediaFileUpload
import pickle
SCOPES = ['https://www.googleapis.com/auth/drive.file']
class GoogleDriveUploader:
def __init__(self, credentials_file, token_file):
self.credentials_file = credentials_file
self.token_file = token_file
self.service = None
self._authenticate()
def _authenticate(self):
"""구글 드라이브 인증"""
creds = None
# 기존 토큰 파일이 있으면 로드
if os.path.exists(self.token_file):
with open(self.token_file, 'rb') as token:
creds = pickle.load(token)
# 유효한 인증 정보가 없으면 새로 인증
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
if not os.path.exists(self.credentials_file):
raise FileNotFoundError(
f"구글 드라이브 인증 파일을 찾을 수 없습니다: {self.credentials_file}\n"
"Google Cloud Console에서 OAuth 2.0 클라이언트 ID를 다운로드하여 "
"credentials.json으로 저장해주세요."
)
flow = InstalledAppFlow.from_client_secrets_file(
self.credentials_file, SCOPES)
creds = flow.run_local_server(port=0)
# 토큰 저장
with open(self.token_file, 'wb') as token:
pickle.dump(creds, token)
self.service = build('drive', 'v3', credentials=creds)
def upload_file(self, file_path, file_name, folder_id=None):
"""파일을 구글 드라이브에 업로드"""
if not self.service:
raise Exception("구글 드라이브 서비스가 초기화되지 않았습니다.")
file_metadata = {'name': file_name}
if folder_id:
file_metadata['parents'] = [folder_id]
media = MediaFileUpload(file_path, mimetype='application/vnd.openxmlformats-officedocument.wordprocessingml.document')
file = self.service.files().create(
body=file_metadata,
media_body=media,
fields='id'
).execute()
return file.get('id')