summaryrefslogtreecommitdiff
path: root/app/request
diff options
context:
space:
mode:
Diffstat (limited to 'app/request')
-rw-r--r--app/request/energy/energy_request.py82
-rw-r--r--app/request/login/login_request.py53
2 files changed, 135 insertions, 0 deletions
diff --git a/app/request/energy/energy_request.py b/app/request/energy/energy_request.py
new file mode 100644
index 0000000..5217b18
--- /dev/null
+++ b/app/request/energy/energy_request.py
@@ -0,0 +1,82 @@
+import json
+import requests
+from ...constants.constants import usageRequestCookies, genericRequestHeaders, electricUsageRequestJson, waterUsageRequestJson, waterRequestEndpoint, electricRequestEndpoint
+
+# Electric
+
+def dayElectricRequest():
+ electricUsageRequestJson['Mode'] = 'D'
+ return performElectricRequest()
+
+def monthElectricRequest():
+ electricUsageRequestJson['Mode'] = 'M'
+ return performElectricRequest()
+
+def performElectricRequest():
+ electricUsageResponse = requests.post(
+ electricRequestEndpoint,
+ cookies=usageRequestCookies,
+ headers=genericRequestHeaders,
+ json=electricUsageRequestJson
+ )
+ return parseResponse(electricUsageResponse)
+
+def requestElectric():
+ return {
+ "day": dayElectricRequest(),
+ "month": monthElectricRequest()
+ }
+
+# Water
+
+def dayWaterRequest():
+ waterUsageRequestJson['Mode'] = 'D'
+ return performWaterRequest()
+
+def monthWaterRequest():
+ waterUsageRequestJson['Mode'] = 'M'
+ return performWaterRequest()
+
+def performWaterRequest():
+ waterUsageResponse = requests.post(
+ waterRequestEndpoint,
+ cookies=usageRequestCookies,
+ headers=genericRequestHeaders,
+ json=waterUsageRequestJson
+ )
+ return parseResponse(waterUsageResponse)
+
+def requestWater():
+ return {
+ "day": dayWaterRequest(),
+ "month": monthWaterRequest()
+ }
+
+# Utility methods
+
+def parseResponse(response):
+ # such an icky response from an endpoint
+ jsonResponse = json.loads(response.text.replace("\\\"", "\"").replace("\\\"", "\"").replace("\"{\"", "{\"").replace("}\"}", "}}"))['d']
+ # TODO: Remove useless data from response
+ return {
+ "usageData": jsonResponse['objUsageGenerationResultSetTwo'], # Raw usage data for each timeframe
+ "tentativeData": jsonResponse['getTentativeData'] # Accumulated usage data and predictions
+ }
+
+def setupRequestParameters(parameters):
+ # Setup cookies and csrftoken to perform requests
+ usageRequestCookies['ApplicationGatewayAffinityCORS'] = parameters['aga']
+ usageRequestCookies['ApplicationGatewayAffinity'] = parameters['aga']
+ usageRequestCookies['ASP.NET_SessionId'] = parameters['asi']
+ usageRequestCookies['SCP'] = parameters['lt']
+ genericRequestHeaders['csrftoken'] = parameters['ct']
+
+# Service calling method
+
+def requestUsageData(requestParameters):
+ setupRequestParameters(requestParameters)
+ return {
+ "electric": requestElectric(),
+ "water": requestWater()
+ }
+
diff --git a/app/request/login/login_request.py b/app/request/login/login_request.py
new file mode 100644
index 0000000..c74986e
--- /dev/null
+++ b/app/request/login/login_request.py
@@ -0,0 +1,53 @@
+import requests
+import re
+from ...constants.constants import loginPageHeaders, loginRequestJson, genericRequestHeaders, loginPageUri, loginRequestEndpoint
+
+def login():
+ # Grab generated session keys from viewing the webpage
+ aga, asi, ct = grabRequiredKeys()
+ # Perform a login request using keys found on the page and JSON data (credentials)
+ lt = performLoginRequest(aga, asi, ct)
+ # Return the keys required to make endpoint calls
+ return {
+ "lt": lt,
+ "aga": aga,
+ "asi": asi,
+ "ct": ct
+ }
+
+
+def grabRequiredKeys():
+ loginPageResponse = requests.get(loginPageUri, headers=loginPageHeaders)
+ affinityMatcher = re.compile("CORS=(.+?);")
+ affinityResults = affinityMatcher.search(loginPageResponse.headers['Set-Cookie'])
+ appGatewayAffinity = affinityResults.group(1)
+
+ aspNetSessionIdMatcher = re.compile("ASP\.NET\_SessionId=(.+?);")
+ aspnetResults = aspNetSessionIdMatcher.search(loginPageResponse.headers['Set-Cookie'])
+ aspNetSessionId = aspnetResults.group(1)
+
+ csrfMatcher = re.compile("id=\"hdnCSRFToken\" value=\"(.+)\"")
+ csrfResults = csrfMatcher.search(loginPageResponse.text)
+ csrfToken = csrfResults.group(1)
+ return appGatewayAffinity, aspNetSessionId, csrfToken
+
+def performLoginRequest(appGatewayAffinity, aspNetSessionId, csrfToken):
+ loginRequestCookies = {
+ 'ApplicationGatewayAffinityCORS': appGatewayAffinity,
+ 'ApplicationGatewayAffinity': appGatewayAffinity,
+ 'ASP.NET_SessionId': aspNetSessionId,
+ }
+
+ genericRequestHeaders['csrftoken'] = csrfToken
+
+ loginResponse = requests.post(
+ loginRequestEndpoint,
+ cookies=loginRequestCookies,
+ headers=genericRequestHeaders,
+ json=loginRequestJson,
+ )
+
+ scpMatcher = re.compile("SCP=(.{36});")
+ scpSearchResults = scpMatcher.search(loginResponse.headers['Set-Cookie'])
+ loginToken = scpSearchResults.group(1)
+ return loginToken