Otto.de API ansprechen

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Superuse.

    Otto.de API ansprechen

    Hallo Forum,

    ich soll von Otto.de die aktuell offenen Bestellungen abrufen. Dazu gibt es eine ehr schlechte als rechte Doku hier:
    https://public-docs.live.api.otto.market/01_Developers_Guide/index.html

    Die sprechen die API dort via CURL an.

    Beispiele in irgend einer Programmiersprache gibt es leider keine. Ich habe mir bisher die folgenden Ansätze zusammengegoogled, komme aber mit keinem weiter.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim wHeader As WebHeaderCollection = New WebHeaderCollection()
    3. Dim myHttpWebRequest = CType(WebRequest.Create("https://api.otto.market/v1/token"), HttpWebRequest)
    4. myHttpWebRequest.Headers.Add("Authorization: Bearer 0da6cf0d-848c-4266-9b47-cd32a6151b1f")
    5. myHttpWebRequest.Headers.Add("Assume-User: john.doe%40smartsheet.com")
    6. Dim myHttpWebResponse = CType(myHttpWebRequest.GetResponse(), HttpWebResponse)
    7. wHeader.Clear()
    8. wHeader.Add("Authorization: Bearer 0da6cf0d-848c-4266-9b47-cd32a6151b1f")
    9. wHeader.Add("Assume-User: john.doe")
    10. Dim sUrl As String = "https://api.otto.market/v1/token"
    11. Dim wRequest As HttpWebRequest = DirectCast(System.Net.HttpWebRequest.Create(sUrl), HttpWebRequest)
    12. 'wRequest.ContentType = "application/json" '
    13. wRequest.Headers = wHeader
    14. wRequest.Method = "GET"
    15. Dim wResponse As HttpWebResponse = DirectCast(wRequest.GetResponse(), HttpWebResponse)
    16. Dim sResponse As String = ""
    17. Using srRead As New StreamReader(wResponse.GetResponseStream())
    18. sResponse = srRead.ReadToEnd()
    19. End Using
    20. End Sub


    bzw. ein anderer Ansatz:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim Postdata As String = "XXX"
    3. Dim tempcookies As New CookieContainer
    4. Dim encoding As New System.Text.UTF8Encoding
    5. Dim byteData As Byte() = encoding.GetBytes(Postdata)
    6. Dim postReq As HttpWebRequest = DirectCast(WebRequest.Create("https://api.otto.market/v1/token"), HttpWebRequest)
    7. Dim username, password As String
    8. postReq.Method = "Post"
    9. postReq.KeepAlive = True
    10. postReq.
    11. postReq.Credentials = New System.Net.NetworkCredential("user", "password") 'Set the credentials
    12. postReq.CookieContainer = tempcookies
    13. postReq.ContentType = "application/x-www-form-urlencoded"
    14. postReq.Referer = "https://api.otto.market/v1/token"
    15. postReq.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/4.0 (.NET CLR 3.5.30729)"
    16. postReq.ContentLength = byteData.Length
    17. Dim postreqstream As IO.Stream = postReq.GetRequestStream()
    18. postreqstream.Write(byteData, 0, byteData.Length)
    19. postreqstream.Close()
    20. Dim postresponse As HttpWebResponse
    21. postresponse = DirectCast(postReq.GetResponse(), HttpWebResponse)
    22. tempcookies.Add(postresponse.Cookies)
    23. logincookie = tempcookies
    24. Dim postreqreader As New IO.StreamReader(postresponse.GetResponseStream())
    25. Dim thepage As String = postreqreader.ReadToEnd
    26. End Sub


    Hat jemand eine Idee/Ansatz, wie das machbar sein könnte?
    first: Ich würde an deiner Stelle ganz schnell die Tokens und persönlichen Daten aus dem Post raus nehmen.

    Was passiert mit deinem Code? Kommt ein Fehler - wenn ja, welcher? Wo genau brauchst du Hilfe?

    VG,
    Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    keine sorge. Das sind keine Token von Otto ... sind noch aus dem Beispielen, die ich gefunden habe.

    Momentan habe ich nicht mal einen Fehler. Weiß nicht, ob das überhaupt die richtigen Ansätze für so was sind. Hab sowas noch nicht gemacht und die Doku dort ist sehr dürftig
    Also sind das nur kopierte, ungetestete Schnipsel?

    Hast du schon irgendwas davon ausprobiert und Fehler/Exceptions bekommen?
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    Hmm, ich kann zwar keine Lösung anbieten aber meine Erfahrungen schildern. Der von mir verwendete Programmcode entsprach ungefähr deinem Beispiel 2.

    A) World of Tanks von Wargaming.net developers.wargaming.net/docum…on/guide/getting-started/
    Meine API Anfragen wurden vom Server akzeptiert, ohne das ich irgendwelche Angaben zu Benutzer oder Passwort gemacht habe oder meine Anwendung zuvor registriert hatte. Allerdings erfolgten alle Anfragen per http und nicht per https.

    B) Grand Prix Racing Online gpro.net/de/gpro.asp
    Da die Webseite generell nur über https korrekt funktioniert, habe ich verschiedene Schritte probiert:
    Anfrage ohne Angaben zu Benutzer und Passwort: Programm läuft ohne Fehler durch, Server antwortet nicht.
    Anfrage mit Angabe zu Benutzer und Passwort: Programm läuft ohne Fehler durch, Server antwortet nicht.
    Mehrere Code Beispiele über Google gefunden (alle Autoren behaupten, das ihre Beispiele fehlerfrei funktionieren), alle ausprobiert: Programm läuft ohne Fehler durch, Server antwortet nicht.

    Nach sehr zeitaufwändiger und intensiver Suche herausgefunden, dass der Anbieter einen Urlaubsmodus per http anbietet. Nach Angaben des Herstellers ist dies notwendig, da sonst einige Smartphones bzw. Tablets nicht auf https Inhalte zugreifen können. Dann habe ich mein eigenes Programm so geändert, das es statt https wieder http verwendet. Programm läuft ohne Fehler durch, Server liefert die richtigen Daten zu meiner Anfrage.
    Ich würde behaupten HTTPS ist hier nicht ausschlaggebend, da im Main-Post auch schon an via HTTPS die otto-API angesprochen wird.

    Wenn der TE den Code nur wie oben eingefügt hat, wird es schwerlich gehen können.

    Beim ersten Beispiel stehen Credentials drin -> wenn die bspw. Obsolet sind, wird der Server kein Token zurückgeben - zumal der Bearer wahrscheinlich abgelaufen ist.
    Beim zweiten Beispiel sind (sogar mit Kommentar) Dummy-Werte (username, password) drin. Ist die Frage ob der TE hier seine Daten eingesetzt hatte oder "nur" blind kopiert.

    Aber Ohne Aussage vom selbigen können wir nur im trüben fischen.

    VG,
    Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    Bin da jetzt ein Stück weiter gekommen. Auf der Linux-Konsole bekomme ich über CURL einen Token. Wenn ich diesen in diese Funktion einsetze, dann bekomme ich von der Funktion die offenen Bestellungen als JSON zurück

    VB.NET-Quellcode

    1. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    2. Dim wHeader As WebHeaderCollection = New WebHeaderCollection()
    3. wHeader.Clear()
    4. wHeader.Add("Authorization: Bearer hierstehtnormalerweisederToken")
    5. Dim sUrl As String = "https://api.otto.market/v2/orders"
    6. Dim wRequest As HttpWebRequest = DirectCast(System.Net.HttpWebRequest.Create(sUrl), HttpWebRequest)
    7. 'wRequest.Headers.Add("
    8. 'wRequest.ContentType = "application/json"
    9. wRequest.Headers = wHeader
    10. wRequest.Method = "GET"
    11. Dim wResponse As HttpWebResponse = DirectCast(wRequest.GetResponse(), HttpWebResponse)
    12. Using srRead As New StreamReader(wResponse.GetResponseStream())
    13. Me.TextBox1.Text = srRead.ReadToEnd()
    14. End Using
    15. End Sub


    Das klappt schon mal soweit.

    Den Token kann ich mir aber nicht alle 1800 Sekunden in einer Linux-Kosole holen ;-). Deshalb sollte das eigentlich auch eine Funktion tun. Hier mein aktueller Stand:

    VB.NET-Quellcode

    1. Dim wHeader As WebHeaderCollection = New WebHeaderCollection()
    2. wHeader.Clear()
    3. wHeader.Add("cache-control: no-cache")
    4. Dim sUrl As String = "https://api.otto.market/v1/token"
    5. Dim wRequest As HttpWebRequest = DirectCast(System.Net.HttpWebRequest.Create(sUrl), HttpWebRequest)
    6. wRequest.Credentials = New System.Net.NetworkCredential("user", "password")
    7. wRequest.Method = "GET"
    8. wRequest.ContentType = "application/x-www-form-urlencoded"
    9. wRequest.Headers = wHeader
    10. Dim wResponse As HttpWebResponse = DirectCast(wRequest.GetResponse(), HttpWebResponse)
    11. Using srRead As New StreamReader(wResponse.GetResponseStream())
    12. Me.TextBox1.Text = srRead.ReadToEnd()
    13. End Using


    hier bekomme ich aber statt der Tokenantwort nur

    HTML-Quellcode

    1. <html>
    2. <head>
    3. <meta http-equiv="refresh" content="0; url=/00_Home/index.html">
    4. </head>
    5. </html>

    zurück

    Hat dazu noch jemand eine Idee?
    Ist ja auch falsch ... erstens solltest du dich nicht alle 1800 Sekunden neu anmelden, sondern den Refresh Token benutzen, wenn der Access Token abgelaufen ist, um einen neuen Access Token zu bekommen.
    Zweitens steht in der Doku ganz klar wie der Aufruf auszusehen hat.
    Du sollst folgendes als POST Parameter schicken: username=<YourUsername>&password=<YourPassword>&grant_type=password&client_id=token-otto-api

    Also wie folgt:
    1. Post an https://api.otto.market/v1/token um Refresh-/Access Token zu bekommen
    2. Refresh Token sicher speichern (keine Zugangsdaten/Token im Quellcode!!!!!!!!)
    3. Access Token für deine Anfragen benutzten
    4. Wenn Access Token ungültig ist, mit dem Refresh Token einen neuen Access Token erfragen
    5. Bei 3. weiter machen

    Sonderfall:
    Wenn der Refresh Token abgelaufen/zurückgerufen wurde, musst du dich komplett neu Anmelden (Schritt 1).
    Hab ich schon versucht, aber ich weiß nicht, wie ich diese Parameter im Post übergeben soll. Hab das auch mit


    VB.NET-Quellcode

    1. wHeader.Add("username:xxx")
    2. wHeader.Add("password:yyy")
    3. wHeader.Add("grant_type:password")
    4. wHeader.Add("client_id:token-otto-api")


    schon versucht. Parallel auch die Benutzerdaten mit den Credentials versucht.
    So... hab noch etwas gegoogled und ein C# Beispiel gefunden. Mit dem klappt es nun. Vielleicht hilft das ja mal zukünftig jemand anderen weiter

    VB.NET-Quellcode

    1. Dim URLAuth As String = "https://api.otto.market/v1/token"
    2. Dim postString As String = String.Format("username=xxx&password=yyy&grant_type=password&client_id=token-otto-api")
    3. Dim contentType As String = "application/x-www-form-urlencoded"
    4. Dim Webrequest As HttpWebRequest = Webrequest.Create(URLAuth)
    5. Webrequest.Method = "POST"
    6. Webrequest.ContentType = contentType
    7. Webrequest.ContentLength = postString.Length
    8. Webrequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1"
    9. Webrequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
    10. Dim requestWriter As StreamWriter = New StreamWriter(Webrequest.GetRequestStream)
    11. requestWriter.Write(postString)
    12. requestWriter.Close()
    13. Dim responseReader As StreamReader = New StreamReader(Webrequest.GetResponse.GetResponseStream)
    14. Dim responseData As String = responseReader.ReadToEnd()
    15. Me.TextBox1.Text = responseData
    16. responseReader.Close()
    17. Webrequest.GetResponse().Close()