Ik heb het inmiddels even uitgezocht met een beetje python code:
Code: Selecteer alles
import requests
from IPython.display import HTML
from urllib.parse import urlencode, parse_qs, splitquery
password = 'xxx'
username = 'xxx'
client_id = 'xxxxxxx'
client_secret = 'xxxxxxxxxxxxx'
def get_code(client_id, username, password):
url = "https://api3.stromer-portal.ch/users/login/"
s = requests.session()
res = s.get(url)
HTML(res.text)
s.cookies
qs = urlencode(
{
"client_id": client_id,
"response_type": "code",
"redirect_url": "stromerauth://auth",
"scope": "bikeposition bikestatus bikeconfiguration bikelock biketheft bikedata bikepin bikeblink userprofile",
}
)
data = {
"password": password,
"username": username,
"csrfmiddlewaretoken": s.cookies.get("csrftoken"),
"next": "/o/authorize/?" + qs,
}
res = s.post(url, data=data, headers=dict(Referer=url), allow_redirects=False)
res = s.send(res.next, allow_redirects=False)
_, qs = splitquery(res.headers["Location"])
code = parse_qs(qs)["code"][0]
return code
def get_access_token(client_id, client_secret, code):
url = "https://api3.stromer-portal.ch//o/token/"
params = {
"grant_type": "authorization_code",
"client_id": client_id,
"client_secret": client_secret,
"code": code,
"redirect_uri": "stromerauth://auth",
}
res = requests.post(url, params=params)
return res.json()["access_token"]
def call_api(access_token, endpoint, params={}):
url = f"https://api3.stromer-portal.ch/rapi/mobile/v2/{endpoint}"
headers = {"Authorization": f"Bearer {access_token}"}
res = requests.get(url, headers=headers, params={})
return res.json()["data"][0]
Code: Selecteer alles
import json
endpoint="bike/"
bike = call_api(access_token, endpoint)
print('bike:', json.dumps(bike, indent=True))
bike = call_api(access_token, endpoint="bike/")
endpoint = f'bike/{bike["bikeid"]}/state/'
params = {'cached':'false'}
state = call_api(access_token, endpoint, params)
print('state:', json.dumps(state, indent=True))
bike: {
"bikeid": ***,
"biketype": "ST2",
"color": "silver",
"hardware": "omniinterface",
"bikemodel": "ST2",
"nickname": "***",
"size": "sport 20"
}
state: {
"battery_SOC": 40,
"suiversion": "3.4.2.1",
"bike_speed": 0.0,
"tntversion": "3.5",
"trip_time": 81401,
"light_on": 255,
"average_speed_trip": 34.9,
"trip_distance": 788.5,
"average_speed_total": 34.1,
"motor_temp": 16.0,
"average_energy_consumption": 141,
"power_on_cycles": 670,
"total_time": 318409,
"atmospheric_pressure": 0,
"battery_temp": 24.0,
"battery_health": 95,
"total_distance": 3013.6,
"assistance_level": 0,
"rcvts": 1538643543,
"theft_flag": false,
"lock_flag": true,
"total_energy_consumption": 42594
}
Ik weet niet of ik die client_id en client_secret zo mag posten, maar zijn zijn heel gemakkelijk uit de APK te halen (of door een MITM op de app). Ik ga dit gebruiken om een tooltje te maken dat verifieert dat de fiets goed wordt opgeladen. Ik heb heel soms dat ie na een uurtje ofzo stopt met opladen en dan kom ik bijna niet meer thuis. Straks checkt ie dat gewoon ieder kwartier: staat de fiets bij mijn werk en is de batterij niet aan het opladen ==> stuur een mailtje