REAL API

Hallo zusammen,


ich würde gerne Tickets direkt über die Real API abrufen, scheitere aber noch an der HM-Signature, bzw. wie ich den UNIX timestamp so einbinde, dass der Request auch zu einem Ergebnis führt.


Hat hier jemand einen Tipp?


Beschrieben ist es hier: https://www.real.de/api/v1/?page=rest-api


Danke für eure Hilfe vorab und Grüße

Enrico

Hallo Enrico,


ich habe mal ein Beispiel erstellt wie das mit der HM Signatur funktionieren könnte.


<#assign method = "POST">
<#assign uri = "https://www.real.de/api/v1/units/">
<#assign body = "">
<#assign timestamp = 1411055926>
<#assign gesamt>${method}${"\n"}${uri}${"\n"}${body}${"\n"}${timestamp}</#assign>
${gesamt}
<#assign secret ="a7d0cb1da1ddbc86c96ee5fedd341b7d8ebfbb2f5c83cfe0909f4e57f05dd403">
${hmacSHA256(gesamt, secret, "hex")!}
75312eabe66e4b9e74552a5e8959456d69cfa52a7cae9049093aede4bcdf71e7

Viele Grüße

Stefan Helme

Hallo Stefan,


danke schonmal hierfür. Kannst du mir auch sagen, wie ich die Aktuelle Zeit als Unix-Zeit in rein bekomme. Irgendwas klappt hier bei der Umwandlung nicht.


Danke und Grüße

Enrico

Hallo Enrico,


den aktuellen UNIX Timestamp bekommst du über folgenden Ausdruck:


<#assign unix = (.now?long / 1000)?split(".")[0]>



Viele Grüße

Stefan Helme

Ich nochmal,


Wenn ich mir das ganze nun in einen TextHtmlWriter packe, wie sage ich hier, dass ich das Ergebnis von Timestamp und die Signature als "output" darstelle. Denn ich muss die Ergebnisse dann ja im ApiCall step in klartext in den Header schreiben. Im Moment bekomme ich als Feedback immer nur:


(Unauthorized), Inhalt Antwort: {"message":"API Client is not set"}


VG

Enrico


Hallo Enrico,


soweit ich dich richtig verstehe willst du mehrere Werte aus dem HTMLTextWriter rausbekommen.

Du könntest in der Theorie entweder die Werte Kommasepariert rauschreiben und das ganze als CSV nochmal einlesen. Du hast dann die Möglichkeit auf die Werte zuzugreifen.
Alternativ schreibst du alles in ein JSON und und parset das dann im Header wieder. Das würde zum Beispiel so aussehen:

<#assign method = "POST">
<#assign uri = "https://www.real.de/api/v1/units/">
<#assign body = "">
<#assign timestamp = 1411055926>
<#assign gesamt>${method}${"\n"}${uri}${"\n"}${body}${"\n"}${timestamp}</#assign>
<#assign secret ="a7d0cb1da1ddbc86c96ee5fedd341b7d8ebfbb2f5c83cfe0909f4e57f05dd403">
<#assign signature = hmacSHA256(gesamt, secret, "hex")!>
{
"timestamp": "${timestamp}",
"signature" : "${signature}"
}

Im zweiten Schritt gehst du dann hin und und parsest das ganze im Header

wie folgt

<#assign output = htmlWriterOutput?eval> <#-- hier musst du den htmlWriterStep verlinken -->
HM-Signature=${output.signature}
HM-Timestamp=${output.timestamp}

Wenn du das ganze aber Zeilenbasiert machen musst und du für jeden Call die Signatur neu berechnen musst, würde es sich anbieten die Signatur immer im Spreadsheetmapper zu berechnen.


Ich habe das ganze jetzt natürlich nicht ausprobiert, weil ich keinen Zugriff auf die REAL API habe, deswegen müsstest du das ein wenig rumprobieren bis es klappt.

In der Theorie sollte aber das generieren der Signatur (wie im ersten Post beschrieben) funktionieren, denn die vorgegebenen Testwerte aus der Doku stimmen mit dem hier generierten Ergebnis überein.


Viele Grüße

Stefan

Hi Stefan,


heute stehe ich mir irgendwie selber auf den Füßen.


Im JSON ist es denke ich die beste Variante, allerdings funktioniert das Parsen im Header noch nicht. Er scheint ein Problem mit der Verlinkung zu Writer zu haben.


Wenn ich mir die Vorschau anzeigen lasse vom Writer zeigt er mir

TEMPLATE_OUTPUT_STRING@TextHTMLWriter_17


Wenn ich das aber einbaue sagt er mir er hat einen String Fehler. Muss ich das in die Zeile mit assign output irgendwie anders einbauen als es in der Vorschau Ausgabe steht?

Dankeund Grüße
Enrico

Hallo Enrico,


könntest du mir bitte ein paar Screenshots zukommen lassen? Besonders von der Fehlermeldung wäre gut.

Bei mir sieht das so aus:

image


image

image

image



Viele Grüße

Stefan

Hallo Stefan,


ich habe den Fehler gefunden, hatte noch < zuviel drin, daher ging es nicht.

Nun will ich den Header so in den Apicall bauen. Muss ich dafür noch eine KEY,Value Varable setzen oder sollte der Abruf im Header so funktionieren?:


image

Die Zugangsdaten von der Real Api sollten eigentlich als Test funktionieren, allerdings habe ich weiterhin:

HTTP Status: 401 (Unauthorized), Inhalt Antwort: {"message":"API Client is not set"}


Grüße

Enrico

Hallo Enrico,


ich bin mir nicht sicher ob das einen Unterschied macht, aber soweit ich weiß sind die Anführungszeichen um die Key-Value Paare nicht notwendig.

Weiterhin sehe ich noch, dass dein Accept Key klein geschrieben ist. Ich nehme an der muss groß sein.

Das sieht dann so aus:

image


Danach bekomme ich zwar immer noch einen "Wrong Client Key set", ich nehme hier aber mal an, dass das tatsächlich daran liegt, dass der in der Doku vorgegebene Client Key nicht valide ist. Heißt du musst das dann mit deinem eigenen Client/Secret Testen.

Ich bekomme immerhin selbige Fehlermeldung wenn ich das über das Testmodul von Real probiere:

image



Viele Grüße

Stefan

Hi Stefan,


ich habe die beiden Keys nun durch gültige ersetzt, allerdings immernoch der selbe Fehler.

Wenn du mir sagst wo, dann gebe ich dir die Keys per Nachricht durch, eventuell kannst du noch etwas testen.


VG

Enrico

Nochmal ich,


bin etwas weiter, nun erhalte ich:


Step: APICall [APICall, step position 3] HTTP Status: 400 (Bad Request), Inhalt Antwort: {"message":"Request signature is corrupted. Expected: \"8b74............................................................\", given: \"017b9456cc568bc0779ae64dda24d364d57bb7b7fb711d5b0f18dc1dff88d4df\""...



Hallo Enrico,


Das sieht stark danach aus als ob irgendwas beim generieren der Signatur schief läuft.

Könntest du mir mal bitte sagen gegen welche Route du den Call machst und mir den Inhalt deines HTMLWriter Steps zurück gibst. Bitte beachte, dass deine Methode (POST oder GET) mit dem Cal, den du machst, übereinstimmt. Ich würde das einfachheitshalber zunächst mit einem GET Call probieren.


Deine Keys möchte ich an dieser Stelle aus rechtlichen Gründen nicht haben.

Tut mir Leid, dass ich da nicht besser helfen kann.


Viele Grüße

Stefan

Hallo Stefan,


es hat funktioniert, du bist Klasse, danke!

Nun müsste ich nur wissen, wie ich es schaffe, mehr als 19 Einträge abzufragen.


Ich packe die Daten in ein Spreadsheet damit ich Sie mir dann anschließend im Mapper bearbeiten kann. Jedoch bekomme ich immer nur die aktuellsten 19 Zeilen zurück.


Was aknn da der Grund sein?


VG

Enrico

Hallo Enrico,


soweit ich weiß arbeitet die REAL API mit Pagination.
Dazu gibt es hier mehr Informationen: https://www.real.de/api/v1/?page=rest-api#collection-pagination


Viele Grüße

Stefan

Hi Stefan,


das heißt ich könnte hier mit NextURL arbeiten und den offset jedesmal um die entsprechende Anzahl erhöhen.

Ich müsste aber für jeden offset der abgerufen wird sie Signatur neu berechnen.

Du hattest vorher schonmal geschrieben, das würde dann im Mapper Sinn machen. Sprich ich baue mir da einen counter ein und setze den dann jeweils als offset so dass der counter um die entsprechende Menge hochzählt oder habe ich einen Denkfehler?


VG

Enrico


Hallo Enrico,


an dieser Stelle würde das theoretisch auch ohne Spreadsheetmapper funktionieren. Das hätte aber wahrscheinlich viel mit rumprobieren zu tuen.

Du kannst ja alles was du im Moment im textHTMLWriter hast auch in den Header selbst reinpacken. Soweit ich weiß wird der Header pro Call immer neu berechnet, also würde das da auch immer neu ausgeführt werden. Das müsste aber @synesty mal beantworten.

Wenn dir das aber mit dem Spreadsheetmapper + SpreadsheetURLDownload einfacher ist, dann mach es so wie du willst :)


Viele Grüße

Stefan

"Du kannst ja alles was du im Moment im textHTMLWriter hast auch in den Header selbst reinpacken. Soweit ich weiß wird der Header pro Call immer neu berechnet, also würde das da auch immer neu ausgeführt werden."

Das macht natürlich dann viel mehr Sinn.

@Synesty, habt ihr einen Tipp, wie ich das direkt im Api Call lösen kann, so dass pro call der offset um 30 steigt sowohl in der Signatur als auch in der direkten URL?


Danke für deine Hilfe Stefan!


Hallo nochmal,


ich habe nun alles in den API-Call Step gepackt, so dass es im RequestHeader steht.

Nun muss ich es nur noch hinbekommen, den Counter in der "signature" Abfrage bei 0 starten zu lassen und pro call um 30 zu erhöhen. Das gleiche dann in der "NextURL) dann sollte es funtionieren.


Ich bekomme aber den counter nicht zum zählen.

@Synesty bezüglich des counters irgendwelche Tipps? Der muss ja im Prinzip irgendwie hier rein, wenn der Header tatsächlich mit jedem Call neu aufgerufen wird:


<#assign uri = "https://www.real.de/api/v1/ticket-messages/seller?limit=30&offset=xx">


VG

Enrico

Hallo Enrico,


so weit ich weiß kannst du über die setVariable Funktion von Synesty eine Variable Setzen.

In die könntest du dann beim Parsen immer den momentanen/nächsten Offset reinschreiben und per getVariable beim Header wieder abholen.

https://apps.synesty.com/transformy/de-de?action=showTemplateFunctionDocumentation#setVariable


Viele Grüße

Stefan Helme