구글 드라이브 API 탐색 기능 만들기

2024년 7월 2일 화요일

Today I Learned

내용

열심히 스프린트 진행중.

페이스북 앱 검수 9차 요청

또 페이스북 앱 검수 요청에 또 실패했다.. 인스타그램 댓글을 가져오기 위해 필요한 권한은 총 3가지인데, 그래도 그 중 2개까진 통과했다. instagram_basic 권한이 필요한걸 확인이 안된다는데.. 아니 인스타그램 댓글을 가져오는 기능을 보여줬는데도 모르겠다 그러면 어쩌라고…

일단 만들기

새로운 앱 서비스를 만드는데, 일단 기능만 완성하려고 열심히 함수위주로 만들고 있다. 만들면서도 이건 클래스로 잘 묶어보면 보기 좋겠다 싶은데, 구글 API Docs 읽으면서 안되는게 되게 하느라.. 일단 구현이 우선이라 생각하고 빨리 만들려고 한다. 구글 드라이브 에서 파일과 폴더를 조회하고, 내부 서브디렉토리를 조회하는 함수를 만들었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
def make_google_credentials(user_id: int, db: Session):
    access_token, refresh_token = get_google_tokens(user_id=user_id, db=db)
    creds = Credentials(
        token=access_token,
        refresh_token=refresh_token,
        client_id=GOOGLE_CLIENT_ID,
        client_secret=GOOGLE_CLIENT_SECRET,
        token_uri="https://oauth2.googleapis.com/token",
    )

    return creds

def get_files_and_folders_from_google_drive(user_id: int, db: Session):
    """구글 드라이브에 있는 모든 파일과 폴더 목록을 가져옵니다."""
    creds = make_google_credentials(user_id=user_id, db=db)

    service = build("drive", "v3", credentials=creds)
    result = (
        service.files()
        .list(pageSize=100, fields="nextPageToken, files(id, name)")
        .execute()
    )
    items = result.get("files", [])

    return items

def get_folders_from_google_drive(user_id: int, db: Session):
    """구글 드라이브에 있는 폴더 목록을 가져옵니다."""
    creds = make_google_credentials(user_id=user_id, db=db)

    service = build("drive", "v3", credentials=creds)
    result = (
        service.files()
        .list(
            pageSize=100,
            fields="nextPageToken, files(id, name, mimeType)",
            q="mimeType='application/vnd.google-apps.folder'",
        )
        .execute()
    )
    items = result.get("files", [])

    return items

def get_spreadsheets_from_google_drive(user_id: int, db: Session):
    """구글 드라이브에 있는 스프레드시트 목록을 가져옵니다."""
    creds = make_google_credentials(user_id=user_id, db=db)

    # Google Drive API 서비스 빌드
    service = build("drive", "v3", credentials=creds)

    # 스프레드시트 파일만 검색
    result = (
        service.files()
        .list(
            pageSize=100,
            fields="nextPageToken, files(id, name)",
            q="mimeType='application/vnd.google-apps.spreadsheet'",
        )
        .execute()
    )
    items = result.get("files", [])

    return items

def get_folders_in_folder_from_google_drive(folder_id: str, user_id: int, db: Session):
    """구글 드라이브에 있는 폴더의 하위 폴더 목록을 가져옵니다."""
    creds = make_google_credentials(user_id=user_id, db=db)

    service = build("drive", "v3", credentials=creds)
    result = (
        service.files()
        .list(
            pageSize=100,
            fields="nextPageToken, files(id, name, mimeType)",
            q=f"'{folder_id}' in parents and mimeType='application/vnd.google-apps.folder'",
        )
        .execute()
    )
    items = result.get("files", [])

    return items

def get_spreadsheets_in_folder_from_google_drive(
    folder_id: str, user_id: int, db: Session
):
    """구글 드라이브에 있는 폴더의 하위 스프레드시트 목록을 가져옵니다."""
    creds = make_google_credentials(user_id=user_id, db=db)

    service = build("drive", "v3", credentials=creds)
    result = (
        service.files()
        .list(
            pageSize=100,
            fields="nextPageToken, files(id, name)",
            q=f"'{folder_id}' in parents and mimeType='application/vnd.google-apps.spreadsheet'",
        )
        .execute()
    )
    items = result.get("files", [])

    return items

def create_spreadsheet_in_folder_in_google_drive(
    folder_id: str, spraedsheet_name: str, user_id: int, db: Session
):
    """구글 드라이브에 스프레드시트를 생성합니다."""
    creds = make_google_credentials(user_id=user_id, db=db)

    service = build("drive", "v3", credentials=creds)
    file_metadata = {
        "name": spraedsheet_name,
        "parents": [folder_id],
        "mimeType": "application/vnd.google-apps.spreadsheet",
    }
    file = service.files().create(body=file_metadata, fields="id").execute()

    res = {
        "name": spraedsheet_name,
        "id": file.get("id"),
    }

    return res

회고

생각보다 더 빠르게 구현이 진행되고 있다!