Skip to content

Instantly share code, notes, and snippets.

@c-rotte
Created June 21, 2024 14:02
Show Gist options
  • Save c-rotte/88654f1e99c08c4ae68d99182d2427f9 to your computer and use it in GitHub Desktop.
Save c-rotte/88654f1e99c08c4ae68d99182d2427f9 to your computer and use it in GitHub Desktop.
Vonovia App API Endpoints (Selection)
import base64
import requests
class VonoviaAPI:
def __init__(self):
self.base_url = "https://wl-app-api.vonovia.de/api/v7/"
self.oauth_client_secret = "9AXmlvivWNIr1k5pGgCs5AuzkuvgTv7Zp8wmRQhcf9I="
self.client_id = "c02060c8-02b0-4127-a565-0a5327528e37"
self.tenant_id = "49fa5f93-42de-4332-9f4d-1ad74cb093ee"
self.token_url = f"https://login.microsoftonline.com/{self.tenant_id}/oauth2/v2.0/token"
self.session = requests.Session()
self.access_token = self._get_access_token()
self.session.headers.update({
"Authorization": f"Bearer {self.access_token}",
"Content-Type": "application/json",
"Accept": "text/plain",
"Brand": "Vonovia",
})
def _get_access_token(self):
payload = {
"client_id": self.client_id,
"scope": ".default",
"client_secret": self.oauth_client_secret,
"grant_type": "client_credentials"
}
response = self.session.post(self.token_url, data=payload)
response.raise_for_status()
return response.json().get("access_token")
def login(self, username, password):
encoded_username = base64.b64encode(username.encode()).decode()
encoded_password = base64.b64encode(password.encode()).decode()
response = self.session.post(
f"{self.base_url}Identity/SignIn",
json={"userName": encoded_username, "password": encoded_password, "isPersistent": True}
)
response.raise_for_status()
if "Token" not in self.session.headers:
self.session.headers["Token"] = response.text
print("Token:", self.session.headers["Token"])
def logout(self):
if "Token" not in self.session.headers:
return
response = self.session.post(f"{self.base_url}Identity/SignOut")
response.raise_for_status()
del self.session.headers["Token"]
def post(self, endpoint, data=None):
url = f"{self.base_url}{endpoint}"
response = self.session.post(url, json=data)
response.raise_for_status()
return response
def get(self, endpoint):
url = f"{self.base_url}{endpoint}"
response = self.session.get(url)
response.raise_for_status()
return response
if __name__ == "__main__":
api = VonoviaAPI()
# landing page
print("Feature/LandingPage:", api.get("Feature/LandingPage").text)
# signing in
username = ""
password = ""
api.login(username, password)
# roles
print("Identity/Roles:", api.get("Identity/Roles").text)
# contracts
contracts = api.get("Contracts").json()
print("Contracts:", contracts)
for contract in contracts:
contract_id = contract["contractId"]
# badge counters
print(f"BadgeCounters?contractId={contract_id}:", api.get(f"BadgeCounters?contractId={contract_id}").text)
# news
print(f"Feature/News?contractId={contract_id}:", api.get(f"Feature/News?contractId={contract_id}").text)
# tenant area
print(f"Feature/TenantArea?contractId={contract_id}:",
api.get(f"Feature/TenantArea?contractId={contract_id}").text)
# articles
print(f"NewsFeed/Articles?contractId={contract_id}&top=20&skip=0:",
api.get(f"NewsFeed/Articles?contractId={contract_id}&top=20&skip=0").text)
# details
print(f"Contracts/{contract_id}/details:",
api.get(f"Contracts/{contract_id}/details").text)
# former renter payment
print(f"FormerRenter/Payment?contractId={contract_id}:",
api.get(f"FormerRenter/Payment?contractId={contract_id}").text)
# payments
print(f"Contracts/{contract_id}/Payments/Activities?top=20&skip=0:",
api.get(f"Contracts/{contract_id}/Payments/Activities?top=20&skip=0").text)
# payment document
with open(f"/tmp/{contract_id}_pay.pdf", "wb") as file:
file.write(api.get(f"Contracts/{contract_id}/Payments/Activities/Document").content)
# inbox
documents = api.get("Inbox/Documents/Inbox?top=2147483647").json()
print("Inbox/Documents/Inbox?top=2147483647:", documents)
# documents
for document in documents["partnerDocs"]:
document_id = document["arcDocId"]
# document
with open(f"/tmp/{document_id}.pdf", "wb") as file:
file.write(api.get(f"Inbox/Document?contractId={contract_id}&docId={document_id}").content)
# archive documents
print(f"Inbox/Documents/Archive?top=2147483647:", api.get(f"Inbox/Documents/Archive?top=2147483647").text)
# partner
print("Partner:", api.get("Partner").text)
# logout
api.logout()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment