Source code for nrgpy.api.auth
try:
from nrgpy import logger
except ImportError:
pass
import base64
from datetime import datetime, timedelta
import json
import pickle
import requests
retrieve_token_url = "https://api.nrgsystems.com/api/RetrieveToken?code=y2/bWG4hRNf1E00lWICOp7nqLvpNPOtaiFf9Wq2bi1iUpdyQdjwicQ=="
data_catalog_url = "https://api.nrgsystems.com/api/DataCatalog"
convert_url = "https://api.nrgsystems.com/api/Convert?code=Z6czLero6fQthaM9TZ2DavSN9i7sIeESG/xxGr88JYYoIwypjL/7Uw=="
export_url = "https://api.nrgsystems.com/api/Export?code=2ZGPXDO8dmHF5IZdm3Qaqrlkf9Gs8930oFeN/MCwX8vcnazvCDkRdg=="
upload_url = "https://api.nrgsystems.com/api/Upload?code=YSy3yEeC6aYMNG9setSKvWe9tZAJJYQtXam1tGT7ADg9FTTCaNqFCw=="
token_file = ".nrgpy_token"
[docs]class nrg_api(object):
"""
Parent class for NRG API functionality
"""
def __init__(self, client_id="", client_secret=""):
logger.debug(f"nrg legacy api init ")
self.client_id = client_id
self.client_secret = client_secret
if self.client_id and self.client_secret:
self.maintain_session_token()
else:
print(
"[Access error] Valid credentials are required.\nPlease contact support@nrgsystems.com or visit \nhttps://services.nrgsystems.com for API access"
)
logger.error(
"[Access error] Valid credentials are required. Please API credentials"
)
[docs] def request_session_token(self):
"""generates a new session token for convert service api
requires an active account with NRG Systems. to sign
up for an account, go to:
https://services.nrgsystems.com
Parameters
----------
client_id : str
obtained from NRG Systems
client_secret : str
Returns
-------
session_token : str
valid for 24 hour
session_start_time : datetime
start time of 24 hour countdown
"""
logger.debug("session token requested")
print(
"{} | Requesting session token ... ".format(
datetime.now().strftime("%Y-%m-%d %H:%M:%S")
),
end="",
flush=True,
)
request_token_header = {"content-type": "application/json"}
request_payload = {
"client_id": "{}".format(self.client_id),
"client_secret": "{}".format(self.client_secret),
}
self.resp = requests.post(
data=json.dumps(request_payload),
headers=request_token_header,
url=retrieve_token_url,
)
self.session_start_time = datetime.now()
if self.resp.status_code == 200:
logger.debug(f"{self.resp.text}")
print("[OK]")
logger.info("new session token OK")
self.session_token = json.loads(self.resp.text)["access_token"]
logger.debug(f"bearer token: {self.session_token}")
else:
logger.error("unable to get session token")
print("[FAILED] | unable to get session token.")
self.session_token = False
[docs] def token_valid(self):
"""check if token is still valid
Parameters
----------
session_start_time : datetime
generated at time of token request
Returns
-------
status : bool
true if still valid, false if expired
"""
if datetime.now() < self.session_start_time + timedelta(hours=18):
if self.session_token is not False:
return True
return False
[docs] def save_token(self, filename=token_file):
"""save session token in token pickle file"""
with open(filename, "wb") as f:
pickle.dump([self.session_token, self.session_start_time], f)
[docs] def load_token(self, filename=token_file):
"""read session token from pickle file"""
with open(filename, "rb") as f:
self.session_token, self.session_start_time = pickle.load(f)
[docs] def maintain_session_token(self, filename=token_file):
"""maintain a current/valid session token for data service api"""
try:
self.load_token(filename=token_file)
if not self.token_valid():
self.request_session_token()
self.save_token()
except:
self.request_session_token()
self.save_token()
[docs] def prepare_file_bytes(self, filename=""):
file_bytes = base64.encodebytes(open(filename, "rb").read())
return file_bytes