2024. 5. 12. 23:00ㆍ클라우드/Google API
리눅스 서버에서 Google Drive API와 연동할 때, token 방식을 사용하면, token이 expire 되면서 서비스가 안됨
다시 token을 다른 PC에서 만들어서 넣어주면 되지만, 귀찮음
인증 부분을 해결하기 위해서 Service Account를 사용하기로 함
Service Account 설정
https://ahniverson.tistory.com/42
- 구글 클라우드 플랫폼으로 이동
- 콘솔 > API 및 서비스 > 사용자 인증 정보 > 사용자 인증 정보 만들기 > 서비스 계정
서비스 계정 입력 > 완료
키 > 키 추가 > 새 키 만들기 > JSON > 만들기
JSON 파일이 로컬 PC의 다운로드 디렉토리에 다운로드 됨
- 다운로드 받은 JSON 파일 옮기기
# 다운로드 받은 위치로 이동
# 파일을 서버에 복사하기
scp *.json {계정}@{서버 IP}:/{디렉토리}
Service Account를 이용하여 연동하기
https://developers.google.com/drive/api/guides/about-sdk?hl=ko
- Google Drive와 연결
def gdrive_init():
global service
global user
if service is None:
key_path = '{json 파일}'
scopes = ['https://www.googleapis.com/auth/drive']
credentials = service_account.Credentials.from_service_account_file(key_path, scopes=scopes)
service = build('drive', 'v3', credentials=credentials)
# 계정정보 확인
about = service.about().get(fields='user, storageQuota').execute()
print(about['user'])
user = about['user']['emailAddress']
print(about['storageQuota'])
- 파일 목록 가져오기
def gdrive_list():
results = service.files().list(pageSize=10, fields="nextPageToken, files(id, name, shared, owners)").execute()
items = results.get('files', [])
if not items:
print('No files found.')
else:
print('Files:')
for item in items:
print('{0} ({1}): {2}: {3}'.format(item['name'], item['id'], item['shared'], item['owners']))
- 파일 권한 주기: 공유
role에 owner를 할당하는 부분은 transferOwnership=True를 설정해야 함
하지만, 할당을 받는 사용자 계정에서 동의를 해야 하는데, 그 부분을 어떻게 하는지 모르겠음
def gdrive_share(file_id, email_address):
permissions = [
{
'type': 'user',
'role': '{wrier or reader}',
'emailAddress': email_address
}
]
for permission in permissions:
permission = service.permissions().create(fileId=file_id, body=permission, transferOwnership=False).execute()
print(f'Fie shared with {email_address} with role {permission}.')
- 파일 업로드
gdrive_upload(filename)으로 호출: Google Drive 웹화면에서는 보이지 않음
주석처리된, gdrive_shrare()에 공유할 계정정보를 입력하고 주석을 제거하면 '공유문서함'에서 파일 확인 가능
gdrive_upload(filename, fiolder_id)로 호출: 사용자 계정에서 공유한 디렉토리에서 보임(gdrive_share를 호출할 필요 없음)
단, 해당 디렉토리가 service account에 대해서 공유되어 있어야 함
def gdrive_upload(filename, folder_id=None):
file_metadata = {
'name': filename,
'parents': [folder_id] if folder_id else []
}
media = MediaFileUpload(filename, resumable=True)
file = service.files().create(body=file_metadata, media_body=media, fields='id').execute()
print('File ID: %s' % file.get('id'))
#gdrive_share(file.get('id'), {사용자 계정})
- permission 정보 가져오기
def gdrive_permission(file_id):
permissions = service.permissions().list(fileId=file_id).execute()
print(permissions.get('permissions', []))
- 파일 삭제
사용자 계정에서 공유된 파일을 삭제해도 service account의 파일은 삭제되지 않음
단지, 파일의 shared가 False로 설정되고, 파일의 위치가 '공유문서함'으로 바뀜
파일을 삭제하려면, 아래 명령을 이용해서 삭제해야 함
# service account 소유 파일 모두 삭제
def gdrive_delete_all():
results = service.files().list(pageSize=10, fields="nextPageToken, files(id, name, shared, owners)").execute()
items = results.get('files', [])
if not items:
print('No files found.')
else:
print('Files:')
for item in items:
for owner in item['owners']:
if owner['emailAddress'] == user:
gdrive_delete(item['id'])
# 지정한 파일 삭제
def gdrive_delete(file_id):
response = service.files().delete(fileId=file_id).execute()
print('%s is deleted!' % file_id)
TS
- Rate limit exceeded. User message: "Sorry, you have exceeded your sharing quota.
공유할 수 있는 용량을 초과하는 경우 발생
초기화 될때까지 기다리여 함
'클라우드 > Google API' 카테고리의 다른 글
Google API token 정보 얻기 (0) | 2024.03.25 |
---|---|
우분투에 google drive 마운트 (0) | 2024.03.17 |