본문 바로가기
프로그래밍

Google API로 GDrive랑 Gspread 사용하기

by 곽동현 이스텔리앙 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





# 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







# 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







# 에러 해결

"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에서 올리려고 보았더니, 계정을 평가판에서 유료 계정으로 업그레이드를 해야한다.






'프로그래밍' 카테고리의 다른 글

Python 프로젝트의 패키지화  (0) 2020.01.09
Python coding convention: PEP 8  (0) 2019.12.17
Google API로 GDrive랑 Gspread 사용하기  (0) 2019.11.22
라즈베리파이 4 Model B 시작하기  (0) 2019.11.08
AMD CPU 가상화 옵션키기  (0) 2019.11.08
WSL2 설치하기  (0) 2019.11.08

댓글0