Zum Inhalt springen

API mit Python


Empfohlene Beiträge

vor 4 Stunden schrieb Tyler_Durden:

Hallo David,

ich gehe davon aus, du nutzt auch Python als Sprache?
Ich habe keine hilfreiche Antwort vom bitcoin.de-Team bekommen.
Wenn ich zu Hause bin, schaue ich mal, wo ich bei dem Code aufgehört habe daran zu arbeiten, da auch dieser Thread hier eher... weniger hilfreich war.

Letztes mal war es die response "message: Invalid signature", "code: 5" und meine credits.

Hi,

ich probiere es auch mit Python und bekomme die selbe Error Message.
Ich schaue mich grade für Lösungen und alternative um, wenn ich es nicht mit der API von Bitcoin.de hin bekomme, würde ich auf die Kraken API wechseln. Jedoch ist mein Englisch für solch ein Fachbereich leicht eingeschränkt.  Vielleicht können wir uns zusammen tun und gemeinsam ein Fehler freien Request bekommen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sicher, dass ihr die Signatur richtig baut? In der API Doku ist das ganz gut beschrieben:

Zitat

Schritt 1: Aufsteigendes Sortieren der POST-Parameter anhand ihres Namens¹



{
    'max_amount' : 5.3,
    'price'   : 255.50,
    'type'     : 'buy'
}

Schritt 2: Einen validen URL-encoded Query-String aus den POST-Parametern generieren¹



url_encoded_query_string = 'max_amount=5.3&price=255.5&type=buy'

Schritt 3: md5-Hash über den in Schritt 2 erstellten Query-String der POST-Parameter bilden



post_parameter_md5_hashed_url_encoded_query_string = md5(url_encoded_query_string) // Es wird der MD5-Hash in hexadezimaler Form benötigt
=> '5f4aece1d75c7adfc5ef346216e9bb11'

Schritt 4: Konkatinieren der HMAC-Eingabedaten



hmac_data = http_method+'#'+uri+'#'+api_key+'#'+nonce+'#'+post_parameter_md5_hashed_url_encoded_query_string
=> 'POST#https://api.bitcoin.de/v4/orders#MY_API_KEY#1234567#5f4aece1d75c7adfc5ef346216e9bb11'

Schritt 5: Bilden des eigentlichen sha256-HMACs



hmac = HMAC('sha256', hmac_data, api_secret)
=> ''

 

edit:

Da ist sogar ein Beispiel. Testet mal eure Signatur-Generation mit dem Beispiel durch.

Bearbeitet von fox42
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hab schon ewig nichts mehr mit der bitcoin.de API gemach, aber mein Account geht sogar noch... Hab mir mal eben die Abschnitte mit der Signature angeschaut und mal deinen python code entsprechend angepasst.

Die Stelle hast du wohl überlesen " Als Konsequenz kann bei GET- und DELETE-Requests der md5-Hash d41d8cd98f00b204e9800998ecf8427e für Variable post_parameter_md5_hashed_url_encoded_query_stringverwendet werden." und auch den Schritt 4 nicht mit übernommen ?! 

Viel spass damit...

get_parameter_url_encoded_query_string = "type=buy"

uri = uri + '?' + get_parameter_url_encoded_query_string
 
post_parameter_md5_hashed_url_encoded_query_string = md5(''.encode("UTF-8")).hexdigest()
 
hmac_data = http_method+'#'+uri+'#'+api_key+'#'+nonce+'#'+ post_parameter_md5_hashed_url_encoded_query_string
 
h = hmac.new(bytes(api_secret, 'utf-8'), b'', hashlib.sha256)
h.update(bytes(hmac_data, 'utf-8'))
 
get_parameter = {'type': 'buy'}
 
head ={'X-API-KEY': api_key, 'X-API-NONCE': nonce, 'X-API-SIGNATURE': h.hexdigest()}
 
r = requests.get(uri, headers=head)
 
print(r.text)

 

Bearbeitet von ¯\_(ツ)_/¯
  • Love it 1
  • Like 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 12 Minuten schrieb ¯\_(ツ)_/¯:

Hab schon ewig nichts mehr mit der bitcoin.de API gemach, aber mein Account geht sogar noch... Hab mir mal eben die Abschnitte mit der Signature angeschaut und mal deinen python code entsprechend angepasst.

Die Stelle hast du wohl überlesen " Als Konsequenz kann bei GET- und DELETE-Requests der md5-Hash d41d8cd98f00b204e9800998ecf8427e für Variable post_parameter_md5_hashed_url_encoded_query_stringverwendet werden." und auch den Schritt 4 nicht mit übernommen ?! 

Viel spass damit...

 

Wait, what. Danke

Es funktioniert wirklich!

Habe aber bei mir noch nicht den Fehler gefunden, aber das war schon mal eine große Hilfe.😅👌

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 49 Minuten schrieb ¯\_(ツ)_/¯:

Hab schon ewig nichts mehr mit der bitcoin.de API gemach, aber mein Account geht sogar noch... Hab mir mal eben die Abschnitte mit der Signature angeschaut und mal deinen python code entsprechend angepasst.

Die Stelle hast du wohl überlesen " Als Konsequenz kann bei GET- und DELETE-Requests der md5-Hash d41d8cd98f00b204e9800998ecf8427e für Variable post_parameter_md5_hashed_url_encoded_query_stringverwendet werden." und auch den Schritt 4 nicht mit übernommen ?! 

Viel spass damit...

 

Vielen vielen Dank.

Ich hatte offentsichtlich einen anderen Fehler als Davidwater, aber du hast mir hiermit sehr geholfen.
Zusätzlich hatte ich aber auch einen Nonce, der anscheinend mal mit einem zu großen Faktor multipliziert war, das heißt es gab noch mehere Probleme bei mir :D

Ich habe gerade keine Orders, daher ist meine response leer. Ich will also das orderbook aufrufen, und da klappt es wieder nicht.

Bin vielleicht mit den Parametern nicht fit genug, aber das bekommeich hoffentlich auch noch hin

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb Mr.Davidwater:

Hi,

ich probiere es auch mit Python und bekomme die selbe Error Message.
Ich schaue mich grade für Lösungen und alternative um, wenn ich es nicht mit der API von Bitcoin.de hin bekomme, würde ich auf die Kraken API wechseln. Jedoch ist mein Englisch für solch ein Fachbereich leicht eingeschränkt.  Vielleicht können wir uns zusammen tun und gemeinsam ein Fehler freien Request bekommen.

Also mein Request ist jetzt sauber durchgelaufen.

Interessanterweise klappt es, wenn ich die uri als variable übergebe, nicht aber, wenn ich sie noch einmal als string an der gleichen Stelle eintrage.
Weiß nciht warum, aber jetzt geht es.

  • Like 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

Wahrscheinlich bin ich wieder irgendwie bescheuert, und der Fehler ist offentsichtlich.
Aber ich habe es gegengecheckt und sehe ihn nicht.

Ich wollte nun, wo meine Get-Prozeduren laufen und ich die Daten soweit verarbeite und abspeichere eine manuelle Post-Prozedur schreiben.
Sinn ist quasi einfach der ersten Posten der Kaufen-Seite zu kaufen (in diesem Fall die minimal mögliche Menge)

Code sieht sinngemäß so aus:

nonce                    = str(int(time.time() * 1000000))
uri = "https://api.bitcoin.de/v4/btceur/trades/"                                                                            #URL aus Trades - executeTrade
http_method              = 'POST'
ID                       = buy.json()["orders"][0]["order_id"]                                                              #ID der günstigsten Oder ermitteln
Menge                    = str(buy.json()["orders"][0]["min_amount_currency_to_trade"])                                     #Minimalmenge ermitteln
url                      = uri + ID                                                                                         #Ergänzen um die Ordernummer
url_encoded_query_string = "amount_currency_to_trade="+Menge+"&payment_option=1&type=buy"                                   #POST - Parameter in alph. Reihenfolge
post_parameter_md5_hashed_url_encoded_query_string = hashlib.md5(bytes(url_encoded_query_string.encode())).hexdigest()      #md5 encoding - leerer String gibt korrrekt "d41d8cd98f00b204e9800998ecf8427e" aus
hmac_data = http_method + '#' + url + '#' + api_key + '#' + nonce + '#' + post_parameter_md5_hashed_url_encoded_query_string#Aus Schritt 4
h = hmac.new(bytes(api_secret, 'utf-8'), hmac_data.encode(encoding='utf-8'), hashlib.sha256)                                #Aus funktionierender Get-Methode

headers = {'X-API-KEY': api_key, 'X-API-NONCE': nonce, 'X-API-SIGNATURE': h.hexdigest()}
r = requests.post(url, headers=headers)

print(r.json())

 

Vielleicht müsste ich es meiner Gummiente erklären, aber die ist gerade nicht zugegen.

Daher hoffe ich, dass einer von euch direkt mit der Hand vor die Stirn schlägt und mir den Fehler zeigt und am besten erklärt.

 

PS: r.json() = {'errors': [{'message': 'Invalid signature', 'code': 5}], 'credits': 43}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich sehe bei der Dokumentation, das hier beim hmac_data die uri verwendet wird: hmac_data = http_method+'#'+uri+'#'+api_key+'#'+nonce+'#'+post_parameter_md5_hashed_url_encoded_query_string

Du verwendest die url !

Bin jetzt mir nicht sicher ob das der Fehler ist, aber irgendwas mit deiner Signature wieder.

Edit: Bin echt überrascht das du 43 Credits hast, ich habe nur 23.

Bearbeitet von Mr.Davidwater
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb Mr.Davidwater:

Also ich sehe bei der Dokumentation, das hier beim hmac_data die uri verwendet wird: hmac_data = http_method+'#'+uri+'#'+api_key+'#'+nonce+'#'+post_parameter_md5_hashed_url_encoded_query_string

Du verwendest die url !

Bin jetzt mir nicht sicher ob das der Fehler ist, aber irgendwas mit deiner Signature wieder.

Das ist glaube ich eine Variablenbezeichnungfrage. Mein Code ist natürlich etwas stümperhaft und ungelenk.

Meine Varaible url ist final: https://api.bitcoin.de/v4/btceur/trades/[ID]
Stimmt also mit der URL inTrades - executeTrade überein: https://api.bitcoin.de/v4/:trading_pair/trades/:order_id

Aber auch mit der uri in der hmac_data, also https://api.bitcoin.de/v4/btceur/trades/ kommt der code 5 Fehler.

 

Zitat

Edit: Bin echt überrascht das du 43 Credits hast, ich habe nur 23.

Je nach Trust-Level auf Bitcoin.de hast du ein anderes Maximum.

Bearbeitet von Tyler_Durden
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb Tyler_Durden:

Wahrscheinlich bin ich wieder irgendwie bescheuert, und der Fehler ist offentsichtlich.
Aber ich habe es gegengecheckt und sehe ihn nicht.

Ich wollte nun, wo meine Get-Prozeduren laufen und ich die Daten soweit verarbeite und abspeichere eine manuelle Post-Prozedur schreiben.
Sinn ist quasi einfach der ersten Posten der Kaufen-Seite zu kaufen (in diesem Fall die minimal mögliche Menge)

Code sieht sinngemäß so aus:


nonce                    = str(int(time.time() * 1000000))
uri = "https://api.bitcoin.de/v4/btceur/trades/"                                                                            #URL aus Trades - executeTrade
http_method              = 'POST'
ID                       = buy.json()["orders"][0]["order_id"]                                                              #ID der günstigsten Oder ermitteln
Menge                    = str(buy.json()["orders"][0]["min_amount_currency_to_trade"])                                     #Minimalmenge ermitteln
url                      = uri + ID                                                                                         #Ergänzen um die Ordernummer
url_encoded_query_string = "amount_currency_to_trade="+Menge+"&payment_option=1&type=buy"                                   #POST - Parameter in alph. Reihenfolge
post_parameter_md5_hashed_url_encoded_query_string = hashlib.md5(bytes(url_encoded_query_string.encode())).hexdigest()      #md5 encoding - leerer String gibt korrrekt "d41d8cd98f00b204e9800998ecf8427e" aus
hmac_data = http_method + '#' + url + '#' + api_key + '#' + nonce + '#' + post_parameter_md5_hashed_url_encoded_query_string#Aus Schritt 4
h = hmac.new(bytes(api_secret, 'utf-8'), hmac_data.encode(encoding='utf-8'), hashlib.sha256)                                #Aus funktionierender Get-Methode

headers = {'X-API-KEY': api_key, 'X-API-NONCE': nonce, 'X-API-SIGNATURE': h.hexdigest()}
r = requests.post(url, headers=headers)

print(r.json())

 

Vielleicht müsste ich es meiner Gummiente erklären, aber die ist gerade nicht zugegen.

Daher hoffe ich, dass einer von euch direkt mit der Hand vor die Stirn schlägt und mir den Fehler zeigt und am besten erklärt.

 

PS: r.json() = {'errors': [{'message': 'Invalid signature', 'code': 5}], 'credits': 43}

Hast du schon versucht bei ID, Menge und den Rest mal manuell einzugeben. Die Umwandlung sieht für mich was ich sehe eigentlich richtig aus, habe es jetzt noch nicht selbst ausgeführt. 

Ich würde jetzt erst mal versuchen, alles was geht, manuell einzugeben um das erstmal auszuschließen. 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb Mr.Davidwater:

Hast du schon versucht bei ID, Menge und den Rest mal manuell einzugeben. Die Umwandlung sieht für mich was ich sehe eigentlich richtig aus, habe es jetzt noch nicht selbst ausgeführt. 

Ich würde jetzt erst mal versuchen, alles was geht, manuell einzugeben um das erstmal auszuschließen. 

Gute Idee, das versuche ich morgen mal.
Wenn ich die Daten in ein Print gebe sieht es gut aus, aber wer weiß.

Du hast also Post-Methoden noch nicht in Angriff genommen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe derzeit viel mit der Schule zu tun, da ich dieses Jahr meinen Abschluss mache. Werde entweder nur ganz wenig machen bzw. ich analysiere derzeit noch die Kurse, um später einen funktionierenden Algorithmus zu schreiben. Wahrscheinlich werde ich mich jedoch leider erst ab Juni richtig rein hängen. Aber dann werde ich mich nicht nur an der API von Bitcoin.de versuchen, sondern auch an anderen APIs von Wechselstuben. 
Konnte jetzt nur den kleinen Teil von Bitcoin.de schreiben, weil ich Winter Ferien hatte.

Edit: Versuche hier aber zu Unterstützen, dann kann ich hoffentlich später bei mir selber ein paar Fehler vermeiden.   

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kleines Update auch für dich, wenn du dann so weit bist:

 

Die Post-Parameter müssen im Body übergeben werden.
Das habe ich jetzt gemacht und es kommt auch alles so wie es soll beim Server an:

Zitat
API-Aktion: executeTrade
Angelegt am: 17. Januar 2021 23:13:45 CET
API-Key: RED
Request-URI: https://api.bitcoin.de/v4/btceur/trades/TESTETSTETSTETSTETS
HTTP-Methode:
POST
POST-Parameter:


{
   "amount_currency_to_trade":"0.01",
   "payment_option":"1",
   "type":"buy"
}
   
   

 

Jetzt bekomme ich 'errors': [{'message': 'Invalid order_id', 'code': 26, 'field': 'order_id'}].
Also quasi das, was ich provoziert habe mit der Test-Order. Ich denke, dass der Trade dann durchgehen sollte, wenn die Order ID korrekt ist.

 
 
Bearbeitet von Tyler_Durden
  • Like 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 22.1.2021 um 17:10 schrieb flynk:

Hi,

könntest du mal den kompletten Code zeigen mit dem du die Bitcoin API zu dieser Fehlermeldung bringst.
Ich hab versucht den Code zu rekonstruieren, scheitere jedoch.

Vielen Dank schonmal im voraus.

Ich hatte die Post-Parameter nicht im body des Requests:

    headers = {'X-API-KEY': api_key, 'X-API-NONCE': nonce, 'X-API-SIGNATURE': h.hexdigest()}
    body = {'amount_currency_to_trade': Menge,'payment_option': 1, 'type': Typ}
    r = requests.post(url, headers=headers, data=body)

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 Jahr später...

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
×
×
  • Neu erstellen...

Wichtige Information

Wir haben Cookies auf Deinem Gerät platziert. Das hilft uns diese Webseite zu verbessern. Du kannst die Cookie-Einstellungen anpassen, andernfalls gehen wir davon aus, dass Du damit einverstanden bist, weiterzumachen.