본문 바로가기
Development/Free Topic

Google API로 GDrive랑 Gspread 사용하기

by 곽동현 IMCOMKING 2019. 11. 22.

구글 계정 접속 권한 얻기

먼저 구글 계정의 접속 권한을 얻기 위한 credential생성이 필요하다.

 

* 원칙적으로 oauth2client는 deprecated되고, 이제 google_auth_oauthlib을 사용해야한다.

https://google-auth.readthedocs.io/en/latest/oauth2client-deprecation.html#replacement

 

1. 구글 계정 생성

2. https://console.developers.google.com/apis/library? 에서 원하는 API선택

3. 사용자 인증 정보 생성

4. OAuth 동의에서 scope설정

5. json credential 다운로드

6. Flow를 이용해서 authorization_url얻기

7. authorization_url에 접속 후 로그인하여 autorization code 얻기

8. flow.fetch_token에 넣어서 credential dict를가져오기
9. gspread에 credential을 변환해서 넣기

 

# 인증 관련 레퍼런스

Flow exam: https://github.com/googleapis/google-api-python-client/blob/master/docs/oauth.md

Flow docs: https://google-auth-oauthlib.readthedocs.io/en/latest/reference/google_auth_oauthlib.flow.html

 

OAuth2(deprecated): https://developers.google.com/identity/protocols/OAuth2

 

 

# 예제

 

 

 

 

 

# Gspreadhttps://gspread.readthedocs.io/en/latest/

$ pip install gspread

Gspread는 아직 구버전 방식의 credential만 지원하기 때문에, flow의 return을 위와같이 class object로 변환해서 사용해야한다.

 

## service account를 이용한 인증

https://gspread.readthedocs.io/en/latest/oauth2.html

위 링크와 같이 서비스 계정 키를 생성하면 쉽게 사용가능하다.

 

 

 

그다음 서비스 계정키의 email을 google spread sheet의 공유자 권한으로 추가한다.

 

 

https://stackoverflow.com/questions/38949318/google-sheets-api-returns-the-caller-does-not-have-permission-when-using-serve

 

 

"The caller does not have permission” 에러 해결

stackoverflow.com/questions/38949318/google-sheets-api-returns-the-caller-does-not-have-permission-when-using-serve

 

해당 상위 폴더 전체를 Link로 공유하도록 설정하면 해결된다.

 

 

 

 

 

# Google Drive API : https://developers.google.com/drive/api/v3/quickstart/python

$ pip install google-api-python-client

 

* Gspread와 달리, google drive에서는 flow.credentials를 사용해야한다.

https://stackoverflow.com/questions/56509744/oauth2token-object-has-no-attribute-authorize-even-with-google-auth-httplib2

 

 

from googleapiclient.discovery import build

service = build('drive', 'v3', credentials=flow.credentials)

 

results = service.files().list(

    pageSize=10, fields="nextPageToken, files(id, name)").execute()

items = results.get('files', [])

 

 

# Google Drive HTTP 통신 쿼리
https://developers.google.com/drive/api/v3/reference/query-ref

https://developers.google.com/drive/api/v3/ref-search-terms#operators

 

 


gspread-formatting을 사용하여, work sheet 스타일 편집하기

developers.google.com/sheets/api/reference/rest/v4/spreadsheets/cells#Style

pypi.org/project/gspread-formatting/

 

gformat.set_column_width(ws,  'D', 700)

data_cell_format = gformat.cellFormat( wrapStrategy='WRAP' )

gformat.format_cell_range(ws, 'A1:I1', data_cell_format)

 

 

 

# PyDrive : https://pythonhosted.org/PyDrive/quickstart.html#authentication

PyDrive는 google drive v2의 HTTP통신을 python으로 wrapping한 것이다. 안타깝지만 v2라서 deprecated..

 

$ pip install PyDrive

 

from pydrive.auth import GoogleAuth

from pydrive.drive import GoogleDrive

 

gauth = GoogleAuth()

drive = GoogleDrive(gauth)

 

 

단, 무조건 client_secret.json으로 파일 이름을 변경해야한다.

 

* 만약 임의의 파일이름을 쓰고 싶거나, credential을 저장해두고 재로그인 없이 바로 쓰고 싶을 경우, settings.yaml을 만들고 다음과 같이 작성한다.

 

client_config_backend: file

client_config_file: your_name_of_client_secrets.json

 

save_credentials: True

save_credentials_backend: file

save_credentials_file: credentials_pydrive.json

 

get_refresh_token: True

 

oauth_scope:

  - https://www.googleapis.com/auth/drive.file

  - https://www.googleapis.com/auth/drive.install

  - https://www.googleapis.com/auth/drive

 

 

# Wget으로 google drive 링크 다운로드 하기

wget --no-check-certificate -r 'https://docs.google.com/uc?export=download&id=FILEID' -O FILENAME

https://gist.github.com/iamtekeste/3cdfd0366ebfd2c0d805

 

 

# 에러 해결

"Quota exceeded for quota group 'ReadGroup' and limit 'Read requests per user per 100 seconds' of service 'sheets.googleapis.com' for consumer 'project_number:894274053007'.",

위와 같은 에러 메시지는 해당 계정으로 너무 많은 request가 100초 이내에 들어와서 발생한 에러이다.

 

검색해보니 https://developers.google.com/analytics/devguides/config/mgmt/v3/limits-quotas 에 따르면 기본 값이 100초당 100개 request로 설정이 되어있고, 이를 1000개 request까지 올릴 수 있다고한다.

그러나 이를 GCP api console에서 올리려고 보았더니, 계정을 평가판에서 유료 계정으로 업그레이드를 해야한다.

 

 

 

 

 

'Development > Free Topic' 카테고리의 다른 글

Librosa, Numba 에러 해결  (0) 2020.01.23
Z-shell ( zsh ) 사용하기  (0) 2020.01.17
Google API로 GDrive랑 Gspread 사용하기  (2) 2019.11.22
라즈베리파이 4 Model B 시작하기  (0) 2019.11.08
Javascript  (0) 2018.05.09
Windows10 에서 화면 녹화하기  (0) 2018.03.12

댓글2

  • 라이젠 2020.09.29 08:07

    안녕하세요 혹시 개발의뢰도 받으시나요? 안드로이드 폰에서 구글계정 무한생성 및 자동변경이 가능한 프로그램이 필요한데 가계정이든 실계정이든 구글서버에는 접속이 되고, 특정 어플 로그인만 가능한 계정이면 됩니다 이미 기존에 개발된 프로그램(파이썬)도 있는데, 서버에서 계정을 내려 받는 방식이구요 여기서 생성된 계정은 실제로 사용이 되진 않지만 구글계정이 필요한 특정 어플에서는 해당 구글계정으로 로그인이 됩니다.
    사례는 충분히 할테니 혹시 동일하게 개발이 가능하시면 https://open.kakao.com/o/sU6oEutc 여기로 연락 좀 꼭 부탁드릴게요~!
    답글