first commit
This commit is contained in:
66
utils/google_drive.py
Normal file
66
utils/google_drive.py
Normal file
@@ -0,0 +1,66 @@
|
||||
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')
|
||||
|
||||
Reference in New Issue
Block a user