You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.2 KiB
81 lines
2.2 KiB
import datetime
|
|
from googleapiclient.discovery import build
|
|
|
|
from oauth2client import client
|
|
from oauth2client import tools
|
|
from oauth2client.file import Storage
|
|
|
|
|
|
import httplib2
|
|
import os
|
|
|
|
import argparse
|
|
|
|
from gapi import config
|
|
|
|
flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
|
|
|
|
HOUR = datetime.timedelta(seconds=60 ** 2)
|
|
|
|
|
|
class API:
|
|
def __init__(
|
|
self,
|
|
service,
|
|
scopes,
|
|
app_name,
|
|
client_secret_file=os.path.join(config.state_dir, "client_secret.json"),
|
|
credentials_dir=config.state_dir,
|
|
version="v3",
|
|
):
|
|
self.service_name = service
|
|
self.app_name = app_name
|
|
self.client_secret_file = client_secret_file
|
|
self.credentials_dir = credentials_dir
|
|
self.scopes = scopes
|
|
self._service = None
|
|
self._service_settime = None
|
|
self.version = version
|
|
|
|
def get_credentials(self):
|
|
|
|
credential_path = os.path.join(self.credentials_dir, "token.json")
|
|
|
|
store = Storage(credential_path)
|
|
credentials = store.get()
|
|
if not credentials or credentials.invalid:
|
|
flow = client.flow_from_clientsecrets(self.client_secret_file, self.scopes)
|
|
flow.user_agent = self.app_name
|
|
if flags:
|
|
credentials = tools.run_flow(flow, store, flags)
|
|
else:
|
|
credentials = tools.run(flow, store)
|
|
print("Storing credentials to " + credential_path)
|
|
return credentials
|
|
|
|
def build_service(self):
|
|
credentials = self.get_credentials()
|
|
|
|
http = credentials.authorize(httplib2.Http())
|
|
|
|
service = build(
|
|
self.service_name, self.version, http=http, cache_discovery=False
|
|
)
|
|
return service
|
|
|
|
def _needs_renewal(self):
|
|
now = datetime.datetime.today()
|
|
if self._service_settime:
|
|
return (now - self._service_settime) > HOUR
|
|
else:
|
|
return True
|
|
|
|
@property
|
|
def service(self):
|
|
if self._needs_renewal():
|
|
service = self.build_service()
|
|
self._service = service
|
|
self._service_settime = datetime.datetime.today()
|
|
return service
|
|
else:
|
|
return self._service
|