REST API mit Python

Thema wurde von Anonymous, 28. Februar 2021 erstellt.

  1. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    13. Mai 2019
    Beiträge:
    455
    Danke erhalten:
    206
    Danke vergeben:
    149
    Ich versuche gerade die REST API meines 4.3.3.0 Shops mit Python anzusprechen. Ich möchte die /orders/search funktion nutzen, allerdings gibt mir die API immer alle Bestellungen aus, egal was ich mit "match" suche.

    Mein Code (bzw. einer von vielen verschiedenen Versuchen) sieht so aus:

    Code:
    import requests, json
    from requests.auth import HTTPBasicAuth
    
    url = "https://meinshop.de/api.php/v2/orders/search"
    payload = "{\"search\": [{\"match\": {\"orders.orders_status\": 174}}]}"
    
    response = requests.get(url, data=payload, auth=HTTPBasicAuth(username, password))
    Das kommt zu teilen aus dem Python-Beispiel hier: https://developers.gambio.de/docs/4.3.3.0/rest/gambio-gx3-api/reference/orders/search-orders/

    Was mich besonders wundert: "match" sollte doch ein exakter Suchbegriff sein. Hier würde ich erwarten, dass er mir eher zuwenig ausgibt, als zuviel? Die Abfrage dauert ziemlich lang und das Ergebnis ist eine Liste von tausenden von Bestellungen.
     
  2. markus_wick

    markus_wick Erfahrener Benutzer

    Registriert seit:
    10. Oktober 2018
    Beiträge:
    966
    Danke erhalten:
    214
    Danke vergeben:
    153
    Moin!
    Nur zum Verständnis: Welchem Status entspricht bei Dir der orders_status 174?
    Offen, Bezahlt, Verschickt...?
     
  3. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    13. Mai 2019
    Beiträge:
    455
    Danke erhalten:
    206
    Danke vergeben:
    149
    Das ist ein zusätzlich angelegter Status mit dem Titel "in Gewährleistungsabwicklung". Das war nur ein Test, denn es gibt gerade eine Bestellung mit dem Status. Ich habe vorher auch nach der Order Id abgefragt, also so:

    Code:
    payload = "{\"search\": [{\"match\": {\"orders.orders_id\": 405215}}]}"
    Auch damit bekomme ich immer alle Bestellungen ausgegeben.
     
  4. Anonymous

    Anonymous Erfahrener Benutzer
    Mitarbeiter

    Registriert seit:
    22. Juni 2011
    Beiträge:
    4.760
    Danke erhalten:
    1.748
    Danke vergeben:
    137
    Rein theoretisch sollte das gehen, wenn du aus dem GET-Request einen POST-Request machst.
     
  5. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    13. Mai 2019
    Beiträge:
    455
    Danke erhalten:
    206
    Danke vergeben:
    149
    Uff... da zählt man jede Klammer dreimal und der Fehler ist schon ganz am Anfang! Das habe ich komplett übersehen, dass das POST sein muss. Sorry, ich spreche auch zum ersten mal eine API an, muss mich an die Docs noch gewöhnen.

    Hat mit requests.post() anstandslos funktioniert. Ich kann ja hier mal das funktionierende Minimalbeispiel posten, vielleicht hilft es anderen. Mit dem Python Example Snippet aus der Doku kam ich erstmal nicht direkt klar. Das Snippet gibt die Response auch schön formartiert aus, sollte am Anfang bestimmt helfen:

    Code:
    import requests, json
    from requests.auth import HTTPBasicAuth
    
    shop_username = "REPLACE"
    shop_passwort = "REPLACE"
    headers = {
        'accept': "application/json",
        'content-type': "application/json"}
    url = "https://shopdomain.de/api.php/v2/orders/search"
    payload = "{\"search\": [{\"match\": {\"orders.orders_status\": 174}}]}"
    
    response = requests.post(url, data=payload, headers=headers, auth=HTTPBasicAuth(shop_username, shop_password))
    text = json.dumps(response.json(), sort_keys=True, indent=4)
    
    print(text)
     
  6. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    19. Juni 2012
    Beiträge:
    4.831
    Danke erhalten:
    1.122
    Danke vergeben:
    947
    Hallo Til,

    in den Beispielen ist immer die HTTPBasicAuth drin, ich weiß, aber eigentlich empfiehlt Gambio die Arbeit mit Token, um zu vermeiden, dass man überall die Shop-Zugangsdaten in den Scripten hat:
    (Link nur für registrierte Nutzer sichtbar.)
     
  7. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    13. Mai 2019
    Beiträge:
    455
    Danke erhalten:
    206
    Danke vergeben:
    149
    Das habe ich gesehen und hatte überlegt das mit Token zu machen, aber ich wollte es erstmal so einfach wie möglich halten. Ich habe username und password als Variablen schon zur Hand, da ich die an anderer Stelle auch schonmal brauche. Von daher dachte ich mir, kannste die auch an der Stelle nochmal verwenden.

    Kann man den .csv Export über einen Token anschmeißen? Bisher loggt sich Python als Admin ein, startet den Export und lädt die Datei dann herunter. Bis Eigenschaften nicht per REST API gehen, scheint ja kein Weg um den csv Export zu gehen. Und wenn der nicht mit Token geht, brauch ich eh an mindestens einer Stelle Zugangsdaten des Shops.
     
  8. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.671
    Danke erhalten:
    1.265
    Danke vergeben:
    300
    @Til Du kannst den CSV Export per CronJob machen. Der Shop hat dafür eine spezeielle URL die man anstoßen kann auch ohne Login. Dann exportiert der Shop die dafür aktivierten Export Profile und du musst dann nur die Datei danach aus dem /export/ Ordner fischen.

    (Link nur für registrierte Nutzer sichtbar.)

    (Link nur für registrierte Nutzer sichtbar.)
     
  9. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    13. Mai 2019
    Beiträge:
    455
    Danke erhalten:
    206
    Danke vergeben:
    149
    Das könnte ich, ich muss den Export aber in dem Moment anstoßen, wenn ich ihn verarbeiten möchte. Also einmal am Tag oder einmal pro Stunde reicht da nicht. Für Facebook und Google haben wir das ja eingerichtet, da ist es aber nicht so schlimm, wenn die Daten ein bisschen veralten.

    Aber es geht ja so wunderbar, wie ich es mache. Python bzw. Selenium öffnet einen Browser, loggt sich ein, lädt die Datei herunter und schiebt sie in den Ordner, in dem ich sie brauche. Bis die API soweit ist, komme ich damit eigentlich ganz gut klar.