@Prinz_Monty: Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Also eher `login_url` statt `urlLogin` (was irgendwie auch falsch herum ist).
Ich finde es ja ein bisschen komisch das bei der einen URL der Port 8080 angegeben wird, und bei der anderen nicht. Sind das tatsächlich zwei verschiedene Ziele? *Dann* würde mich in der Tat auch wundern das man bei der zweiten URL die Session-ID angeben kann die man bei der ersten URL bekommen hat.
JSON kann man mit `requests` einfacher senden: statt über `data`, selbst als JSON kodieren, und manuell den 'Content-Type'-Header zu setzen, kann man einfach das `json`-Argument verwenden.
Die Namen `sid` und `domain` sind falsch weil beides Antworten sind die jeweils die Session-ID und Daten zu einer Domain *enthalten* aber noch nicht selbst diese Werte sind. Das `i` müsste `sid` heissen.
Die Ausnahmebehandlung macht so keinen Sinn. Zum einen umfasst der ``try``-Block gar nicht alles was diese Ausnahme auslösen kann – die kann ja auch beim Anmelden passieren. Zum anderen ist es wenig sinnvoll einfach nur die Ausnahme selbst als Text auszugeben und effektiv den Traceback zu unterdrücken. Wenn ein Fehler auftritt den man nicht sinnvoll behandeln kann, möchte man doch so viel wie möglich Informationen um auf die Ursache schliessen zu können.
``if`` ist keine Funktion, also sollte man da mindestens ein Leerzeichen nach setzen. Die Klammern sind aber insgesamt überflüssig.
Die Ausgabe im ``else`` sieht so geraten aus. Klar kann das Passwort falsch sein. Aber auch der Login. Oder es wahren nicht alle Daten in der Anfrage die erwartet wurden. Oder die Daten hatten irgendwelche anderen Probleme (illegale Zeichen im Benutzernamen, zu lang, zu kurz, Vollmond, …). Ich habe auf die schnelle keine Dokumentation der API gefunden, nur ein paar Beispiele im Netz. Die haben suggeriert, das es neben 'code' und 'response' auch 'message' in den Antworten gibt, wo im Fehlerfall wohl etwas drinsteht.
Wieso denkst Du das übergeben der Session-ID, die Du beim Anmelden bekommen hast, müsste man nicht im folgenden an alle anderen Aufrufe übergeben? Woher soll der Server denn sonst wissen wer Du bist und das Du das darfst, wenn Du ihm das nicht jedes mal durch vorzeigen der Session-ID beweisen kannst? Sonst könnte da ja jeder kommen und Anfragen stellen ohne sich angemeldet zu haben.
Wenn ich die Beispiele im Netz richtig verstanden habe, kann man statt einer konkreten 'primary_id' auch ein JSON-Objekt mit Filterkriterien angeben, womit man dann zum Beispiel alle aktiven Domains abfragen kann. Das sollte aber auch in der API-Dokumentation stehen.
Bei der zweiten API-Anfrage prüfst Du den 'code' der Antwort gar nicht‽
Die Verkettung mit ``+`` bei der Ausgabe der Domain-Werte ist „unpythonisch“ – es gibt Zeichenkettenformatierung für so etwas, und auch irgendwie falsch, denn da werden die Werte ja völlig ohne Leerzeichen aneinander geklebt.
Ich komme dann letztendlich ungefähr hier raus (ungetestet):
Code: Alles auswählen
#!/usr/bin/env python3
import requests
BASE_URL = 'https://localhost:8080/remote/json.php'
LOGIN_URL = BASE_URL + '?login'
SITES_WEB_DOMAIN_GET_URL = BASE_URL + '?sites_web_domain_get'
def main():
auth_data = {'username': 'USER_NAME', 'password': 'USER_PW'}
response = requests.post(LOGIN_URL, json=auth_data).json()
if response['code'] == 'ok':
session_id = response['response']
arguments = {'session_id': session_id, 'primary_id': {'active': True}}
response = requests.get(SITES_WEB_DOMAIN_GET_URL, json=arguments).json()
if response['code'] == 'ok':
for domain in response['response']:
print(
f'{domain["domain"]} {domain["traffic_quota"]}'
f' {domain["ssl_letsencrypt"]}'
)
else:
print(
f'Fehler beim Abfragen der aktiven Domains:'
f' {response["message"]}'
)
else:
print(f'Fehler beim Anmelden: {response["message"]}')
if __name__ == '__main__':
main()
Wobei ich wahrscheinlich noch das externe Modul `addict` verwenden und die `json()`-Ergebnisse in dessen `Dict` verpacken würde um etwas ”schöner” auf die Ergebnisse zugreifen zu können.
Und spätestens bei einer dritten Wiederholung des immer gleichen API-Aufrufrituals mit dem 'code'/'ok' würde ich das mindestens in einer Funktion isolieren, wenn nicht gar in einer Klasse die dann auch gleich die Session-ID kapselt.