mirror of
https://github.com/Fireislander/otf.git
synced 2025-12-16 19:47:54 -06:00
128 lines
6.0 KiB
Python
128 lines
6.0 KiB
Python
import requests
|
|
import json
|
|
|
|
email = "EMAIL"
|
|
password = "PASSWORD"
|
|
|
|
def printBreak():
|
|
print("----------------------")
|
|
|
|
header = '{"Content-Type": "application/x-amz-json-1.1", "X-Amz-Target": "AWSCognitoIdentityProviderService.InitiateAuth"}'
|
|
|
|
body = '{"AuthParameters": {"USERNAME": "'+email+'", "PASSWORD": "'+password+'"}, "AuthFlow": "USER_PASSWORD_AUTH", "ClientId": "65knvqta6p37efc2l3eh26pl5o"}'
|
|
|
|
header = json.loads(header)
|
|
body = json.loads(body)
|
|
|
|
response = requests.post("https://cognito-idp.us-east-1.amazonaws.com/", headers=header, json=body)
|
|
|
|
token = json.loads(response.content)['AuthenticationResult']['IdToken']
|
|
|
|
endpoint = "https://api.orangetheory.co/virtual-class/in-studio-workouts"
|
|
data = {}
|
|
header = {"Content-Type": "application/json", "Authorization": token, "Connection": "keep-alive", "accept": "appliction/json", "accept-language": "en-US,en;q=0.9", "origin": "https://otlive.orangetheory.com", "referer": "https://otlive.orangetheory.com", "sec-ch-ua": '".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"', "sec-ch-ua-platform": '"macOS"', "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"}
|
|
|
|
|
|
inStudioResponse = requests.get(endpoint, headers=header)
|
|
|
|
inStudioResponse_json = json.loads(inStudioResponse.content)
|
|
memberUuid = inStudioResponse_json['data'][0]['memberUuId']
|
|
classTypeCounter = {}
|
|
classesByCoach = {}
|
|
|
|
for item in inStudioResponse_json['data']:
|
|
if item['classType'] == None:
|
|
item['classType'] = "No Class Type Found"
|
|
if item['classType'] in classTypeCounter:
|
|
classTypeCounter[item['classType']] = classTypeCounter[item['classType']] + 1
|
|
else: classTypeCounter[item['classType']] = 1
|
|
studioCoach = (item['coach'] if 'coach' in item and item['coach'] is not None else "NoCoach") + \
|
|
"- " + (item['studioName'] if 'studioName' in item and item['studioName'] is not None else "NoStudio")
|
|
if studioCoach in classesByCoach:
|
|
classesByCoach[studioCoach] = classesByCoach[studioCoach] + 1
|
|
else:
|
|
classesByCoach[studioCoach] = 1
|
|
|
|
print("Number of classes by coach:")
|
|
for coach in classesByCoach:
|
|
|
|
print(coach+": "+str(classesByCoach[coach]))
|
|
printBreak()
|
|
print("Classes by type:")
|
|
for item in classTypeCounter:
|
|
print(item+": "+str(classTypeCounter[item]))
|
|
|
|
# print(memberUuid)
|
|
|
|
memberDetailsUrl = "https://api.orangetheory.co/member/members/"+memberUuid+"?include=memberClassSummary"
|
|
# print(memberDetailsUrl)
|
|
memberDetaialsResponse = requests.get(memberDetailsUrl, headers=header)
|
|
# print(memberDetaialsResponse.content)
|
|
memberDetaialsResponse_json = json.loads(memberDetaialsResponse.content)['data']
|
|
|
|
|
|
hrTotals = {}
|
|
minCount = {}
|
|
secsInZone = {"Red": 0, "Orange": 0, "Green": 0, "Blue": 0, "Black": 0}
|
|
dataClassCounter = 0
|
|
maxHrAverageTotal = 0
|
|
averageHrTotal = 0
|
|
averageSplatsTotal = 0
|
|
averageCaloriesTotal = 0
|
|
for workout in inStudioResponse_json['data']:
|
|
dataClassCounter = dataClassCounter + 1
|
|
count = 1
|
|
if 'minuteByMinuteHr' in workout and workout['minuteByMinuteHr'] is not None:
|
|
for hr in workout['minuteByMinuteHr'].split("[")[1].split("]")[0].split(","):
|
|
if count in hrTotals:
|
|
hrTotals[count] = int(hrTotals[count]) + int(hr)
|
|
else:
|
|
hrTotals[count] = int(hr)
|
|
if count in minCount:
|
|
minCount[count] = minCount[count] + 1
|
|
else:
|
|
minCount[count] = 1
|
|
count = count + 1
|
|
secsInZone['Red'] = secsInZone['Red'] +workout['redZoneTimeSecond']
|
|
secsInZone['Orange'] = secsInZone['Orange'] + workout['orangeZoneTimeSecond']
|
|
secsInZone['Green'] = secsInZone['Green'] + workout['greenZoneTimeSecond']
|
|
secsInZone['Blue'] = secsInZone['Blue'] + workout['blueZoneTimeSecond']
|
|
secsInZone['Black'] = secsInZone['Black'] + workout['blackZoneTimeSecond']
|
|
maxHrAverageTotal = maxHrAverageTotal + workout['maxHr']
|
|
averageHrTotal = averageHrTotal + workout['avgHr']
|
|
averageSplatsTotal = averageSplatsTotal + workout['totalSplatPoints']
|
|
averageCaloriesTotal = averageCaloriesTotal + workout['totalCalories']
|
|
|
|
|
|
printBreak()
|
|
print("Home Studio: "+str(memberDetaialsResponse_json['homeStudio']['studioName']))
|
|
print("Total classes booked: "+str(memberDetaialsResponse_json['memberClassSummary']['totalClassesBooked']))
|
|
print("Total classes attended: "+str(memberDetaialsResponse_json['memberClassSummary']['totalClassesAttended']))
|
|
print("Total intro classes: "+str(memberDetaialsResponse_json['memberClassSummary']['totalIntro']))
|
|
print("Total OT Live classes booked: "+str(memberDetaialsResponse_json['memberClassSummary']['totalOTLiveClassesBooked']))
|
|
print("Total OT Live classes attended: "+str(memberDetaialsResponse_json['memberClassSummary']['totalOTLiveClassesAttended']))
|
|
print("Total classes used HRM (Note: I have no idea why this doesn't match total classes attended): "+str(memberDetaialsResponse_json['memberClassSummary']['totalClassesUsedHRM']))
|
|
print("Total studios visited: "+str(memberDetaialsResponse_json['memberClassSummary']['totalStudiosVisited']))
|
|
print("Max HR: "+str(memberDetaialsResponse_json['maxHr']))
|
|
|
|
printBreak()
|
|
print("The remainder of the data is based on workout summaries available. You have " + str(dataClassCounter) + " workouts with data available")
|
|
print("Average Max HR: " + str(maxHrAverageTotal / dataClassCounter))
|
|
print("Average HR: " + str(averageHrTotal / dataClassCounter))
|
|
print("Average Splats: " + str(averageSplatsTotal / dataClassCounter))
|
|
print("Average calorie burn: "+ str(averageCaloriesTotal / dataClassCounter))
|
|
|
|
printBreak()
|
|
print("Average HR by Min:")
|
|
for min in minCount:
|
|
average = hrTotals[min] / minCount[min]
|
|
stringBuilder = str(min)+": "+str(average)
|
|
print(stringBuilder)
|
|
printBreak()
|
|
print("Average time in each zone (Mins)")
|
|
print("Red: "+str(secsInZone['Red']/dataClassCounter/60))
|
|
print("Orange: "+str(secsInZone['Orange']/dataClassCounter/60))
|
|
print("Green: "+str(secsInZone['Green']/dataClassCounter/60))
|
|
print("Blue: "+str(secsInZone['Blue']/dataClassCounter/60))
|
|
print("Black: "+str(secsInZone['Black']/dataClassCounter/60))
|