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 import gapi 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(gapi.state_dir, "client_secret.json"), credentials_dir=gapi.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