From 2141731fe59a7a9e89f50b5106e64d54dc9b87eb Mon Sep 17 00:00:00 2001 From: Mark Cotton Date: Thu, 18 May 2023 10:40:02 -0500 Subject: [PATCH] initial commit --- .gitignore | 5 ++ EagleEyev3/__init__.py | 120 +++++++++++++++++++++++++++++++++++++++++ EagleEyev3/settings.py | 15 ++++++ README.md | 7 +++ server.py | 30 +++++++++++ 5 files changed, 177 insertions(+) create mode 100644 .gitignore create mode 100644 EagleEyev3/__init__.py create mode 100644 EagleEyev3/settings.py create mode 100644 README.md create mode 100644 server.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d044591 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +__pycache__ +*.pyc +.DS_Store +my_settings.py +*.orig \ No newline at end of file diff --git a/EagleEyev3/__init__.py b/EagleEyev3/__init__.py new file mode 100644 index 0000000..97dcea6 --- /dev/null +++ b/EagleEyev3/__init__.py @@ -0,0 +1,120 @@ + +import json +import logging +import requests +from flask import Flask, request +from .settings import * + +logging.basicConfig(level=logging.INFO) + +class EagleEyev3(): + + def __init__(self): + self.client_id = None + self.client_secret = None + self.access_token = None + self.refresh_token = None + self.redirect_uri = None + + self._load_vars_from_settings() + + self.user_base_url = None + self.current_user = None + self.users = [] + self.bridges = [] + self.cameras = [] + self.users = [] + self.accounts = [] + + self.base_url = None + + + def _load_vars_from_settings(self): + self.client_id = settings.client_id + self.client_secret = settings.client_secret + self.server_host = settings.server_host + self.server_port = settings.server_port + + # combine server_protocol, server_host, and server_port to make the redirect_uri + # please see note in settings.py about trailing slashes and modify this line if needed + self.redirect_uri = f"{settings.server_protocol}://{settings.server_host}:{settings.server_port}" + + + + def login_tokens(self, code=None, cascade=True): + baseUrl = "https://auth.eagleeyenetworks.com/oauth2/token" + pathUrl = f"?grant_type=authorization_code&scope=vms.all&code={code}&redirect_uri={self.redirect_uri}" # note the trailing slash, make sure it matches the whitelist + url = baseUrl + pathUrl + + response = requests.post(url, auth=(self.client_id, self.client_secret)) + response_json = response.json() + + logging.info(f"{response.status_code} in login_tokens") + + if response.status_code == 200: + success = True + self.access_token = response_json['access_token'] + self.refresh_token = response_json['refresh_token'] + if cascade: + self.get_base_url() + else: + success = False + + return { + "success": success, + "response_http_status": response.status_code, + "data": response_json, + 'current_user': self.current_user + } + + def get_base_url(self, cascade=True): + url = "https://api.eagleeyenetworks.com/api/v3.0/clientSettings" + headers = { + "Authorization": f"Bearer {self.access_token}", + "Accept": "application/json" + } + + response = requests.get(url, headers=headers) + response_json = response.json() + + logging.info(f"{response.status_code} in get_base_url") + + if response.status_code == 200: + success = True + if 'httpsBaseUrl' in response_json and 'hostname' in response_json['httpsBaseUrl']: + self.user_base_url = response_json['httpsBaseUrl']['hostname'] + if cascade: + self.get_current_user() + else: + success = False + + return { + "success": success, + "response_http_status": response.status_code, + "data": response_json + } + + def get_current_user(self): + url = f"https://{self.user_base_url}/api/v3.0/users/self" + headers = { + "Authorization": f"Bearer {self.access_token}", + "Accept": "application/json" + } + + response = requests.get(url, headers=headers) + response_json = response.json() + + logging.info(f"{response.status_code} in get_current_user") + + if response.status_code == 200: + success = True + self.current_user = response_json + else: + success = False + + return { + "success": success, + "response_http_status": response.status_code, + "data": response_json + } + diff --git a/EagleEyev3/settings.py b/EagleEyev3/settings.py new file mode 100644 index 0000000..abcb53b --- /dev/null +++ b/EagleEyev3/settings.py @@ -0,0 +1,15 @@ + + +# Reach out to api_support@een.com in order to get a client_id, client_secret and to have your redirect_uri whitelisted + +client_id = "" +client_secret = "" + +server_protocol = "http" +server_host = "127.0.0.1" # Do not use 'localhost', use '127.0.0.1' instead +server_port = "3333" + +# Note: +# This code is not anticipating a trailing slash at the end of the redirect_uri. +# When you submit your URLs to be whitelisted please do not include the trailing slash +# or you can modify the __init__.py file to append the slash on to the redirect_uri \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..cd91372 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# EagleEyev3 # + +## Summary ## +This is a python package for working with the Eagle Eye Networks v3 API. It is all about syntatical sugar and making things a little nicer to work with. + +## Settings File ## +There is file `settings.py` that is needed to run. Please reach out to api_support@een.com to get the necessary credentials. diff --git a/server.py b/server.py new file mode 100644 index 0000000..e1fb080 --- /dev/null +++ b/server.py @@ -0,0 +1,30 @@ + +import json, requests +from flask import Flask, request + +from EagleEyev3 import * + +een = EagleEyev3() + +app = Flask(__name__) + +@app.route('/') +def index(): + # This is getting the ?code= querystring value from the HTTP request. + code = request.args.get('code') + + if (code): + oauth_object = een.login_tokens(code) + return f"Hello {een.current_user['firstName']} {een.current_user['lastName']}" + + else: + base_url = "https://auth.eagleeyenetworks.com/oauth2/authorize" + path_url = f"?client_id={een.client_id}&response_type=code&scope=vms.all&redirect_uri={een.redirect_uri}" + + request_auth_url = f"{base_url}{path_url}" + + return "Login with Eagle Eye Networks" + + +if __name__ == '__main__': + app.run(host=een.server_host, port=een.server_port)