Jump to content
blackbt17

API "end_datetime" -> Rückmeldung: "ungültige Anfrage" (C#)

Empfohlene Beiträge

Hallo zusammen!

 

Ich habe mit mit C# und der Bitcoin.de Trading API ein Tool geschrieben, welches Transaktionen ausführen soll.

Das ganze klappt wunderbar, sowohl für kaufen als auch für verkaufen.

Ich verwende bis jetzt die Parameter: max_amount, min_amount, new_order_for_remaining_amount, price und mode.

 

Wenn ich nun den Parameter end_datetime einfüge, dann bekomme ich immer die Meldung

 Ungültige Anforderung

 Invalid Signature

 

Obwohl ich nichts anderes mache als vorher.

Konkret heißt das: folgender POST-String klappt:

 

url_encoded_query_string = "max_amount=" + t_amount + "&min_amount=" + t_amount + "&new_order_for_remaining_amount=1&price=" + t_price + "&type=" + mode;    //Schritt 2

 

und folgender Code klappt nicht:

 

url_encoded_query_string = "end_datetime=" + "2017-09-30T23:45:00+02:00" + "&max_amount=" + t_amount + "&min_amount=" + t_amount + "&new_order_for_remaining_amount=1&price=" + t_price + "&type=" + mode;    //Schritt 2

 

 

Ich bin jetzt soweit, dass ich weiß, dass mit dem Doppelpunkt etwas nicht stimmt. Und das scheint auch logisch zu sein.

Nur weiß ich nicht, wie ich den String umformatieren muss, damit ich diesen mit der API ausführen kann.

 

Wenn ich nur den String "2017-09-30T23:45:00+02:00" mit URLEncode umformatiere, dann klappt es auch nicht. Es wird ja auch die Signature anhand dieses Strings berechnet.

 

Hat in der Hinsicht jemand Erfahrung? Oder klappt einfach der Parameter "end_datetime" bei der API nicht?

 

Gruß,

Michael

 
 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

also bei mir klappt das und sieht so aus (python):
end_datetime = str(time.strftime("%Y-%m-%dT%X+02:00", time.localtime(time.time()+90*24*60*60))) # 90 tage

Das sollte dem Beispielformat in der Doku "2015-01-20T15:00:00+02:00" entsprechen.

 

Allerdings sieht deins eig auch richtig aus...

Ich kenn mich mit Encoding usw leider nicht aus, aber am Beginn meines Skriptes steht:
# coding: utf8
Ob das damit was zu tun hat, weiß ich nicht :D Bin eig kein Programmierer xD

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

"2017-09-30T23:45:00+02:00" fuehrt zu einem Datumswechsel.

Versuch doch mal "2017-09-30T21:45:00+02:00" - eventuell hast Du einen Bug in der API gefunden?

 

Edit: Eventuell ist die Zeitspanne auch etwas lang gewaehlt - versuch doch mal "2017-09-10T23:45:00+02:00"

bearbeitet von Jokin

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Danke erstmal.

Das mit dem Datumswechsel habe ich nicht bedacht... Hilft aber leider nicht.

 

@Serpens66:

Muss ich die Post-Parameter nicht mit HTML-Encode oder so behandeln, damit der Doppelpunkt html-tauglich wird? Denn eigentlich darf der nicht so übergeben werden, lese ich auf sämtliche Seiten.

Nur dann stellt sich die Frage, ob ich das Codieren vor der MD5-Berechnung mache oder erst danach?  :mellow:

Kannst du mal Posten, wie du die Anfrage an den Server schickst? Änderst du an dem String vor dem Absenden noch etwas?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Online habe ich meinen Code nicht. Ich habe mich an ein Beispiel angelehnt, das ich auf den Microsoft-Seiten und in Foren gefunden habe.

Wie gesagt, es klappt alles, außer im String kommt ein Doppelpunkt oder ein "+" vor...

            webRequest = WebRequest.Create(url);
            webRequest.Method = mode;
            webRequest.Timeout = 20000;
           
            if (mode == "POST") webRequest.ContentLength = Encoding.UTF8.GetCharCount( post_data_;
            webRequest.ContentType = "application/x-www-form-urlencoded; charset=utf-8";
            webRequest.Headers.Add("X-API-KEY", api_key);
            webRequest.Headers.Add("X-API-NONCE", nonce.ToString());
            webRequest.Headers.Add("X-API-SIGNATURE", hmac);
            
            if (mode == "POST")
            {
                Stream st;
                
                st = webRequest.GetRequestStream();
                st.Write(post_data_b, 0, post_data_b.Length);
                st.Close();


            }

In deinem Python Beispiel werden die Daten als JSON übergeben. Kann ich das anstatt "application/x-www-form-urlencoded" auch tun? Dann müsste aber bitcoin.de das Format aktzepieren und ich müsste die Schreibweise "param1=wert1&param2=wert2" ändern in JSON-Format, oder? Der Rest kann ja dann gleich bleiben.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Problem gefunden:

Wenn ich als end_datetime nur angebe: "2015-01-20T15" bekomme ich die Meldung, dass das Zeitformat nicht stimmt.

Sobald ich aber den ersten Doppelpunkt mit reinnehme, dann kommt die Meldung "invalid signature".

Das heißt dann für mich, es gibt ein Problem mit den Sonderzeichen.

Mittlerweile habe ich alles URLEncodiert, damit daran nichts hapert... nur an was liegt es dann? Ich versuche in der Zwischenzeit weiter...

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Am 30.8.2017 um 21:12 schrieb blackbt17:

Mittlerweile habe ich alles URLEncodiert, damit daran nichts hapert... nur an was liegt es dann? Ich versuche in der Zwischenzeit weiter...

Hi hallo blackbt17!

Auch wenn die "Zwischenzeit" schon etwas länger zu dauern scheint ;)

Aber - hast du das Problem lösen können?!

Beste Grüße

Peter

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Wenn ich es richtig im Kopf habe, dann müssen die Query Parameter im Raw Format signiert werden, aber der Request mit URL encoded Zeichen

  • Thanks 1

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Am 7.8.2018 um 18:26 schrieb wilson76:

Wenn ich es richtig im Kopf habe, dann müssen die Query Parameter im Raw Format signiert werden, aber der Request mit URL encoded Zeichen

Ja, das stimmt soweit, so du mit "Raw Format" ganz normalen "Text" meinst. Parameter kann ich auch ganz normal übergeben, aber egal welches Datumsformat ich nutze, ich bekomme immer eine Fehlermeldung, dass das endDate-Format nicht gültig sei ....

Beste Grüße

Peter

 

PS: Sorry, dass ich erst heute antworte, aber ich hab keine Mailbenachrichtigung erhalten -.-

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Zitat

 

Ich habe mit mit C# und der Bitcoin.de Trading API ein Tool geschrieben, welches Transaktionen ausführen soll.

Das ganze klappt wunderbar, sowohl für kaufen als auch für verkaufen.

 

Cool. Das Tool würde mich auch interessieren, damit ich das Rad nicht neu erfinden muss. Programmierer sind bekanntlich faul  ;).

Würdest du das Tool evtl. weitergeben?

 

Wahrscheinlich ist das Problem inzwischen gelöst... aber ich schreib' trotzdem mal was mir dazu einfällt:

Zitat

url_encoded_query_string = "max_amount=" + t_amount + "&min_amount=" + t_amount + "&new_order_for_remaining_amount=1&price=" + t_price + "&type=" + mode;

Ich bin jetzt soweit, dass ich weiß, dass mit dem Doppelpunkt etwas nicht stimmt. Und das scheint auch logisch zu sein.

Nur weiß ich nicht, wie ich den String umformatieren muss, damit ich diesen mit der API ausführen kann.

Der String ist tatsächlich nicht URL-encoded und klar: es dürfen keine Sonderzeichen wie ":" enthalten sein.

In C# müsste es ja so gehen:

Zitat

System.Web.HttpUtility.UrlEncode(stringToEncode);

Ohne System.Web geht es wohl auch

Zitat

Wenn ich nur den String "2017-09-30T23:45:00+02:00" mit URLEncode umformatiere, dann klappt es auch nicht. Es wird ja auch die Signature anhand dieses Strings berechnet.

Leider kenne ich die API (noch) nicht. Vermutlich muss aber der ganze String URL-encoded werden und die Signatur vorher.

Das erste was die API wohl macht, ist URL-decoden. Dann liegt wieder der ursprüngliche String mit den Sonderzeichen vor, und der sollte dann ja auch zur Signatur passen.

Aber wie gesagt ist das nur eine Vermutung.

bearbeitet von Herr Coiner

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden

×

Wichtige Information

Wir speichern Cookies auf Ihrem Gerät, um diese Seite besser zu machen. Sie können Ihre Cookie-Einstellungen anpassen, ansonsten gehen wir davon aus, dass Sie damit einverstanden sind. In unseren Datenschutzerklärungen finden sie weitere Informationen.