57 lines
2.3 KiB
Python
57 lines
2.3 KiB
Python
import os
|
|
|
|
import httplib2
|
|
from apiclient import discovery
|
|
from oauth2client import client, tools
|
|
from oauth2client.file import Storage
|
|
from oauth2client.tools import argparser
|
|
|
|
# https://developers.google.com/api-client-library/python/guide/aaa_oauth
|
|
# pip install google-api-python-client (1.6.4)
|
|
|
|
|
|
HOME_DIR = os.path.expanduser("~")
|
|
GOOGLE_SECRETS = os.path.join(HOME_DIR, ".cache/secrets/client_secrets.json")
|
|
|
|
|
|
def get_credentials(*, scopes):
|
|
"""Gets valid user credentials from storage.
|
|
|
|
If nothing has been stored, or if the stored credentials are invalid,
|
|
the OAuth2 flow is completed to obtain the new credentials.
|
|
|
|
Returns:
|
|
Credentials, the obtained credential.
|
|
"""
|
|
credential_dir = os.path.join(HOME_DIR, ".cache", __package__, "credentials")
|
|
if not os.path.exists(credential_dir):
|
|
os.makedirs(credential_dir)
|
|
credential_path = os.path.join(credential_dir, "googleapis.json")
|
|
|
|
store = Storage(credential_path)
|
|
credentials = store.get()
|
|
|
|
# see https://developers.google.com/api-client-library/python/auth/web-app
|
|
# kw: "incremental scopes"
|
|
if not credentials or credentials.invalid or not credentials.has_scopes(scopes):
|
|
flow = client.flow_from_clientsecrets(GOOGLE_SECRETS, scopes)
|
|
flow.user_agent = "Bonobo ETL (https://www.bonobo-project.org/)"
|
|
flags = argparser.parse_args(["--noauth_local_webserver"])
|
|
credentials = tools.run_flow(flow, store, flags)
|
|
print("Storing credentials to " + credential_path)
|
|
return credentials
|
|
|
|
|
|
def get_google_spreadsheets_api_client(scopes=("https://www.googleapis.com/auth/spreadsheets",)):
|
|
credentials = get_credentials(scopes=scopes)
|
|
http = credentials.authorize(httplib2.Http())
|
|
discoveryUrl = "https://sheets.googleapis.com/$discovery/rest?version=v4"
|
|
return discovery.build("sheets", "v4", http=http, discoveryServiceUrl=discoveryUrl, cache_discovery=False)
|
|
|
|
|
|
def get_google_people_api_client(scopes=("https://www.googleapis.com/auth/contacts",)):
|
|
credentials = get_credentials(scopes=scopes)
|
|
http = credentials.authorize(httplib2.Http())
|
|
discoveryUrl = "https://people.googleapis.com/$discovery/rest?version=v1"
|
|
return discovery.build("people", "v1", http=http, discoveryServiceUrl=discoveryUrl, cache_discovery=False)
|