본문 바로가기
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
라즈베리파이 4 Model B 시작하기  (0) 2019.11.08
Javascript  (0) 2018.05.09
Windows10 에서 화면 녹화하기  (0) 2018.03.12

댓글