Zum Inhalt springen

Noobfire

Mitglied
  • Gesamte Inhalte

    10
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von Noobfire

  1. Super, dass es bei dir schonmal voran geht. Zu dem Senden von "40/market,". Bei mir war es enorm wichtig, dass dies als Python-Bytes, also ASCII, kodiert war und nicht als Python-String, also UTF-8/Unicode. Da gibt es nämlich insbesondere beim Slash meines Wissens wichtige Unterschiede. Wie das in Perl geht, weiß ich leider nicht.
  2. @jacketis Dass die aktuelle python-socketio & python-engineio Implementierung EIO Version 4 nutzt, ist hardgecoded in engineio.client.py Z.559: https://github.com/miguelgrinberg/python-engineio/blob/2f806acc927ac334541f77455b3a51a879649aeb/engineio/client.py#L559 Da kann man ohne Änderung am Source-Code auch nichts dran ändern. Das funktioniert bei mir aber auch ohne Probleme, daher kann es nicht daran liegen. Ich würde mal in den Debugger reinschauen, was genau da das Problem ist. Klingt nach einem Netzwerk- oder Package-Problem. Der Fehler kommt jedenfalls hier: https://github.com/miguelgrinberg/python-socketio/blob/6f812ef8e4b86db8d15fcc9a4d79b721fe7ca068/socketio/client.py#L295 , was wiederum vermutlich hier einen Fehler wirft: https://github.com/miguelgrinberg/python-engineio/blob/2f806acc927ac334541f77455b3a51a879649aeb/engineio/client.py#L419 Logging am besten mal voll einschalten, um genau zu sehen, was genau wann versucht wird. Das geht mit den beiden "[...].logger.setLevel("INFO")" Statements, die ich genannt hatte. Scheint ja am VPN zu liegen? @Serpens66 Das mit den Namespaces war mir ja wie im ersten Beitrag beschrieben vorher auch nicht bekannt :-D Habe das nur durch Package-"Sniffing" im Chrome mitbekommen (F12 - Network). Das ist für so etwas ziemlich praktisch, weil man sich absolut sicher sein kann, dass genau nur solche Pakete gesendet werden müssen, die ja im Browser anscheinend auch schon funktionieren. Z.B. im Vergleich zu dem Code-Ungestüm von Matthias Linden.
  3. Ebenfalls funktioniert die Websocket-Implementierung noch ohne Problem: 0{"sid":"Y6QAXrXiDrWyebpwAu_E","upgrades":[],"pingInterval":25000,"pingTimeout":5000} 40 40/market, 42/market,["remove_order",{"id":"127294631","order_id":"YQ62GV","order_type":"buy","type":"order","reason":"0yzjOGFy3vQgfFm0re8.","trade_user_id":"0yybR5sNowsmfFXerrA.","trading_pair":"btceur"}] 42/market,["add_order",{"id":"127294908","type":"order","amount":"0.62","min_amount":"0.0122","price":"39584.09","volume":"24542.1358","min_trust_level":"bronze","only_kyc_full":"0","seat_of_bank_of_creator":"de","bic_short":"0yzjuYIRljklPFBa","bic_full":"0yzjuYIR3nAUN_5IB4io2TAw2g..","uid":"0ywbxpkNpYslfFWTrss.","trade_to_sepa_country":"[\"DE\",\"AT\",\"CH\",\"BE\",\"GR\",\"MT\",\"SI\",\"BG\",\"IE\",\"NL\",\"SK\",\"DK\",\"IT\",\"ES\",\"HR\",\"PL\",\"CZ\",\"EE\",\"LV\",\"PT\",\"HU\",\"FI\",\"LT\",\"RO\",\"GB\",\"FR\",\"LU\",\"SE\",\"CY\",\"IS\",\"LI\",\"NO\",\"MQ\"]","is_shorting":"0","is_shorting_allowed":"0","is_trade_by_sepa_allowed":"1","is_trade_by_fidor_reservation_allowed":"0","is_sip_possible":"0","trading_pair":"btceur","fidor_account":"0","is_kyc_full":"1","price_de":"39.584,09 €","volume_de":"24.542,14 €","amount_de":"0,62","min_amount_de":"0,0122","country_payment_method_de":"Deutschland","price_formatted_de":"39.584,09 ","price_en":"€39,584.09","volume_en":"€24,542.14","amount_en":"0.62","min_amount_en":"0.0122","country_payment_method_en":"Germany","price_formatted_en":"39,584.09","price_fr":"39 584,09 €","volume_fr":"24 542,14 €","amount_fr":"0,62","min_amount_fr":"0,0122","country_payment_method_fr":"Allemagne","price_formatted_fr":"39 584,09 ","price_es":"€ 39.584,09","volume_es":"€ 24.542,14","amount_es":"0,62","min_amount_es":"0,0122","country_payment_method_es":"Alemania","price_formatted_es":" 39.584,09","price_it":"€ 39.584,09","volume_it":"€ 24.542,14","amount_it":"0,62","min_amount_it":"0,0122","country_payment_method_it":"Germania","price_formatted_it":" 39.584,09","order_id":"8YZNC8","order_type":"buy","sepa_option":"0","payment_option":"2"}] Mit diesem Code import websocket ws = websocket.create_connection("wss://ws3.bitcoin.de/socket.io/1/?EIO=3&transport=websocket") # Aufbauen des Websocket # Es kommen noch keine add_order / remove_order events an ws.send(b"40/market,") # Verbinden mit Namespace "market" while True: print(ws.recv()) # Jetzt sieht man Haufenweise Events
  4. Ich habe gerade die von mir bereits genannte socket.io Implementierung getestet und diese hat über eine Viertelstunde Ergebnisse gezeigt (hier einmal mit aktiviertem Debug-Logging): Attempting WebSocket connection to wss://ws3.bitcoin.de/socket.io/1/?transport=websocket&EIO=3 WebSocket connection accepted with {'sid': 'Zhfxo1U8-51GOHlsAuwi', 'upgrades': [], 'pingInterval': 25000, 'pingTimeout': 5000} Engine.IO connection established Sending packet PING data None Received packet MESSAGE data 0 Namespace / is connected Sending packet MESSAGE data 0/market connection established Received packet PONG data None Received packet MESSAGE data 0/market, Namespace /market is connected Received packet MESSAGE data 2/market,["add_order",{"id":"127294699","type":"offer","amount":"3","min_amount":"2.6","price":"23.55","volume":"70.65","min_trust_level":"bronze","only_kyc_full":"0","seat_of_bank_of_creator":"de","bic_short":"0yzjPeTwlzkig1B-","bic_full":"0yzjPeTw33DssfxIB4io2Mow-w..","uid":"0yybRRwJoQshfFW-rrE.","trade_to_sepa_country":"[\"DE\",\"AT\",\"CH\",\"BE\",\"GR\",\"MT\",\"SI\",\"BG\",\"IE\",\"NL\",\"SK\",\"DK\",\"IT\",\"ES\",\"HR\",\"PL\",\"CZ\",\"EE\",\"LV\",\"PT\",\"HU\",\"FI\",\"LT\",\"RO\",\"GB\",\"FR\",\"LU\",\"SE\",\"CY\",\"IS\",\"LI\",\"NO\",\"MQ\"]","is_shorting":"0","is_shorting_allowed":"0","is_trade_by_sepa_allowed":"1","is_trade_by_fidor_reservation_allowed":"1","is_sip_possible":"0","trading_pair":"btgeur","fidor_account":"0","is_kyc_full":"1","price_de":"23,55 €","volume_de":"70,65 €","amount_de":"3","min_amount_de":"2,6","country_payment_method_de":"Deutschland","price_formatted_de":"23,55 ","price_en":"€23.55","volume_en":"€70.65","amount_en":"3","min_amount_en":"2.6","country_payment_method_en":"Germany","price_formatted_en":"23.55","price_fr":"23,55 €","volume_fr":"70,65 €","amount_fr":"3","min_amount_fr":"2,6","country_payment_method_fr":"Allemagne","price_formatted_fr":"23,55 ","price_es":"€ 23,55","volume_es":"€ 70,65","amount_es":"3","min_amount_es":"2,6","country_payment_method_es":"Alemania","price_formatted_es":" 23,55","price_it":"€ 23,55","volume_it":"€ 70,65","amount_it":"3","min_amount_it":"2,6","country_payment_method_it":"Germania","price_formatted_it":" 23,55","order_id":"TRGM75","order_type":"sell","sepa_option":"0","payment_option":"3"}] Received event "add_order" [/market] Hier noch einmal der genutzte Code: import socketio sio = socketio.Client() sio.logger.setLevel("INFO") sio.eio.logger.setLevel("INFO") @sio.on('connect') def connect(): print('connection established') @sio.on('add_order', namespace="/market") def add_order(data): print('add received with ', data) @sio.on('remove_order', namespace="/market") def remove_order(data): print('remove received with ', data) @sio.on('disconnect') def disconnect(): print('disconnected from server') sio.connect("wss://ws3.bitcoin.de", socketio_path="/socket.io/1", transports="websocket", namespaces=["/market"]) sio.wait()
  5. @Tyler_Durden Klingt sehr stark danach, als sei am Code generell etwas falsch oder das Netzwerk macht Probleme, wenn du Disconnect messages gespammt bekommst. @Serpens66 Dass das generell "so geht", hatte ich in meinem ersten Beitrag ja auch beschrieben. Es ist nur völlig überflüssig und umständlich, da ja schon eine socket.io-Anbindung existiert, in die man mit einem 2 Liner connecten kann und sich um nichts mehr kümmern muss. Das mit den "Namespaces" siehst du in meinem zweiten Kommentar erläutert: https://coinforum.de/topic/23801-websocket-vs-socketio-socketio-zeigt-keine-events/?do=findComment&comment=544326 Da zeige ich, wie alles ohne Probleme mit ein wenig Zeilen Code funktioniert. Dafür muss man aber Socket.io verwenden. Im Hintergrund passiert da folgendes (Zitat aus meinem Kommentar) nach dem Verbinden mit dem Websocket, um den Namespace zu triggern: "Und schlussendlich mit allen angegebenen Namespaces verbunden wird (in meinem Falle nur "/market") mit einem Paket "40/market" (Z. 478 f. in socketio/client.py):" Im gleichen Kommentar zeige ich übrigens ein Minimal-Working Beispiel anhand von einem websocket.
  6. Klingt extrem stark danach als hättest du "venv" bei dir in PyCharm konfiguriert. Das sind so kleine Python-Umgebungen in denen man Pakete installieren kann. Schau mal, welchen Python-Interpreter du in PyCharm definiert hast.
  7. Ich weiß gerade nicht, welches OS du verwendest. Ich vermute mal eher Windows. Es sollte einfach ein pip3 install python-socketio python-engineio websockets ausreichen. Bei Linux Clients (z.B. Ubuntu mit Debian Paketmanager) geht z.B. sudo apt install python3-socketio python3-engineio python3-websockets
  8. Hi Tyler, super, dass der Code schon Leuten helfen konnte! Ohne weitere Informationen kann man da nicht viel helfen. Bitte füge mal direkt nach Instantiieren des SocketIO Clients folgende Zeilen hinzu: sio = socketio.Client() # Neue Zeilen: sio.logger.setLevel("INFO") sio.eio.logger.setLevel("INFO") Damit werden dann Debug-Informationen mit ausgegeben. Ein korrekter Output ist dann z.B.: Attempting WebSocket connection to wss://ws3.bitcoin.de/socket.io/1/?transport=websocket&EIO=3 WebSocket connection accepted with {'sid': 'AN8nFfqcyh4cAo3bCdOU', 'upgrades': [], 'pingInterval': 25000, 'pingTimeout': 5000} Engine.IO connection established Sending packet PING data None Received packet MESSAGE data 0 Namespace / is connected Sending packet MESSAGE data 0/market connection established Received packet PONG data None Received packet MESSAGE data 0/market, Namespace /market is connected Received packet MESSAGE data 2/market,["add_order",{"id":"124387689","type":"order","amount":"1","min_amount":"0.5","price":"1260.01","volume":"1260.01","min_trust_level":"bronze","only_kyc_full":"1","seat_of_bank_of_creator":"de","bic_short":"0yzjuYIRljklPFBa","bic_full":"0yzjuYIR3nAUN_5IB4io2TAw2g..","uid":"0ywbxpkNpYslfFWTrss.","trade_to_sepa_country":"[\"DE\",\"AT\",\"CH\",\"BE\",\"GR\",\"MT\",\"SI\",\"BG\",\"IE\",\"NL\",\"SK\",\"DK\",\"IT\",\"ES\",\"HR\",\"PL\",\"CZ\",\"EE\",\"LV\",\"PT\",\"HU\",\"FI\",\"LT\",\"RO\",\"GB\",\"FR\",\"LU\",\"SE\",\"CY\",\"IS\",\"LI\",\"NO\",\"MQ\"]","is_shorting":"0","is_shorting_allowed":"0","is_trade_by_sepa_allowed":"1","is_trade_by_fidor_reservation_allowed":"0","is_sip_possible":"0","trading_pair":"etheur","fidor_account":"0","is_kyc_full":"1","price_de":"1.260,01 €","volume_de":"1.260,01 €","amount_de":"1","min_amount_de":"0,5","country_payment_method_de":"Deutschland","price_formatted_de":"1.260,01 ","price_en":"€1,260.01","volume_en":"€1,260.01","amount_en":"1","min_amount_en":"0.5","country_payment_method_en":"Germany","price_formatted_en":"1,260.01","price_fr":"1 260,01 €","volume_fr":"1 260,01 €","amount_fr":"1","min_amount_fr":"0,5","country_payment_method_fr":"Allemagne","price_formatted_fr":"1 260,01 ","price_es":"€ 1.260,01","volume_es":"€ 1.260,01","amount_es":"1","min_amount_es":"0,5","country_payment_method_es":"Alemania","price_formatted_es":" 1.260,01","price_it":"€ 1.260,01","volume_it":"€ 1.260,01","amount_it":"1","min_amount_it":"0,5","country_payment_method_it":"Germania","price_formatted_it":" 1.260,01","order_id":"A72B6X","order_type":"buy","sepa_option":"0","payment_option":"2"}] Received event "add_order" [/market]
  9. Danke @jacketis für den Tipp, mit den Chrome Developer Tools die Netzwerkpakete zu sniffen. Dort ist mir mit verschiedenen Websocket-Client-Tools und dem schon von mir angesprochenen Socket.io Client Tool (neue URL: https://amritb.github.io/socketio-client-tool/v1/#url=aHR0cHM6Ly93czIuYml0Y29pbi5kZTo0NDMv&path=L3NvY2tldC5pby8x&opt=&events=add_order,remove_order) aufgefallen, dass neben dem Verbinden mit dem Websocket noch das Packet "40/market," gesendet wird. Nach ein bisschen Recherche war mir dann bewusst, dass es dabei um den Namespace "/market" geht, der noch verbunden werden muss. Das war der Grund, wieso die Connection ohne Probleme funktioniert hatte, die Events aber nicht triggern. Diese werden nämlich erst geschickt, sobald man mit dem Namespace "/market" verbindet. Außerdem ist mir beim Paket sniffen auch aufgefallen, dass die Websocket/Socket.io-Tools nur ein "Upgrade"-Paket an "wss://ws3.bitcoin.de/socket.io/1/?EIO=3&transport=websocket" senden, mit dem dann ein Websocket aufgebaut wird. Also kein "Get"-Paket, um dann in einem Handshake Verfahren eine "sid" (Session ID) zu erhalten, mit der man sich daraufhin wieder neu verbinden/die Connection upgraden muss. Ein einzelnes Paket tut es also auch. Hier also der nun ohne Probleme funktionierende und wesentlich kompaktere/aufgeräumtere Code im Vergleich zu z.B. dem Code von Matthias Linden: import socketio sio = socketio.Client() @sio.on('connect') def connect(): print('connection established') @sio.on('add_order', namespace="/market") def add_order(data): print('add received with ', data) @sio.on('remove_order', namespace="/market") def remove_order(data): print('remove received with ', data) @sio.on('disconnect') def disconnect(): print('disconnected from server') sio.connect("wss://ws3.bitcoin.de", socketio_path="/socket.io/1", transports="websocket", namespaces=["/market"]) sio.wait() Wenn man da mal "hinter die Kulissen" schaut, also den Source-Code betrachtet, sieht man, dass nur ein Websocket aufgebaut wird (Z. 373 f. in engineio/client.py): try: ws = websocket.create_connection( websocket_url + self._get_url_timestamp(), header=headers, cookie=cookies, enable_multithread=True, **extra_options) Dann auf ein "OPEN"-Paket (z.B.: 0{"sid":"oDpvivQAFR2URXc_CUTF","upgrades":[],"pingInterval":25000,"pingTimeout":5000} ) gehorcht wird (Z. 417 f. in engineio/client.py): try: p = ws.recv() except Exception as e: # pragma: no cover raise exceptions.ConnectionError( 'Unexpected recv exception: ' + str(e)) open_packet = packet.Packet(encoded_packet=p) if open_packet.packet_type != packet.OPEN: raise exceptions.ConnectionError('no OPEN packet') Und schlussendlich mit allen angegebenen Namespaces verbunden wird (in meinem Falle nur "/market") mit einem Paket "40/market" (Z. 478 f. in socketio/client.py): for n in self.namespaces: self._send_packet(packet.Packet(packet.CONNECT, namespace=n)) Im Hintergrund passiert dann noch in der "_ping_loop" (Z. 523 f. in engineio/client.py), dass im angegebenen Intervall ein Paket "2" gesendet wird, welches wiederum vom Websocket mit einem Paket "3" erwidert wird. self._send_packet(packet.Packet(packet.PING)) self.ping_loop_event.wait(timeout=self.ping_interval) Also im Grunde genommen keine große Magie, man muss auch nicht irgendwelche Sessions im Handshake-Verfahren upgraden, eigene Socks-Sockets aufbauen, etc. Man kann das sehr einfach selbst nachstellen: import websocket ws = websocket.create_connection("wss://ws3.bitcoin.de/socket.io/1/?EIO=3&transport=websocket") # Aufbauen des Websocket # Es kommen noch keine add_order / remove_order events an ws.send(b"40/market,") # Verbinden mit Namespace "market" while True: print(ws.recv()) # Jetzt sieht man Haufenweise Events Wenn man jetzt noch in einem extra Thread immer wieder einmal ein Ping Paket ("2") gesendet wird, bricht diese Verbindung auch nicht ab und läuft im Prinzip endlos. Das passiert bei python-socketio/engine io in Zeile 439 f. in engineio/client.py und spawnt intern einen Thread mit dem threading-Modul: self.ping_loop_task = self.start_background_task(self._ping_loop)
  10. Hallo zusammen, ich habe schon in der Vergangenheit mit der Trading-API gearbeitet und da nie große Probleme gehabt. Egal, ob man vorgefertige Modules nimmt oder die paar GET/POST-Requests eben selbst implementiert, das ging immer einwandfrei. Als ich mich aber mit der Echtzeit-Tradingbook-Abfrage über den Websocket/Socket.IO-Server beschäftigte, bin ich auf größere Probleme gestoßen. Wie ich sehe, gibt es folgende Möglichkeiten, diese Server zu nutzen (bitte mich korrigieren bzw. weitere Möglichkeiten nennen, wenn ich sie nicht nenne!): Wie in der Doku unter https://www.bitcoin.de/de/api/tapi/v4/docu beschrieben den Socket.IO-Server in Version 0.9.16 unter https://ws.bitcoin.de nutzen. Das war mir persönlich einfach zu blöd, da entsprechende Libraries mit einer solch alten Version zu finden HTTP-GET-Request an https://ws.bitcoin.de/socket.io/1, um Websocket-Key zu bekommen und dann Websocket an wss://ws.bitcoin.de/socket.io/1/websocket/[KEY] binden. Funktioniert soweit super, bricht aber wie mehrfach im Forum genannt nach rund 90 Sekunden ab. Den Websocket unter wss://ws.bitcoin.de/socket.io/1/websocket/ nicht getrennt vom GET-Request aufbauen, sondern die ursprüngliche HTTP-Verbindung zum Erhalt eines Keys zu einer Websocket-Verbindung "upgraden", wie im Code von Matthias Linden geschehen: https://github.com/matthiaslinden/bitcoinDE_API/blob/master/bitcoinDEws.py. Das behebt das Problem des Abbrechens nach 90 Sekunden. Wieso der ganze Stress? Im Quellcode zum Marketplace von Bitcoin.de auf z.B.: https://www.bitcoin.de/de/etheur/market sieht man ganz klar in Zeile 710 u.f., dass KEINER dieser genannten Server verwendet wird, sondern ein REINER Socket.IO Server unter https://ws2.bitcoin.de:443/market (path: /socket.io/1), siehe diesen Auszug aus Quellcode: var socket = io('https://ws2.bitcoin.de:443/market', {path: '/socket.io/1'}); Wenn ich diesen in einem Online-Socket.IO-Open-Source-Tool teste, funktioniert auch alles direkt ohne verschwurbeltes Connection-"Upgrade", uralten Socket.IO-Versionen oder irgendwelchen Websockets ["always aim for the simplest solution"]: https://amritb.github.io/socketio-client-tool/#url=aHR0cHM6Ly93czIuYml0Y29pbi5kZTo0NDMvbWFya2V0&path=L3NvY2tldC5pby8x&opt=&events=add_order,remove_order Wenn ich das aber mit diesem Minimal-Example-Code teste, erhalte ich eine Message, dass die Connection hergestellt werden konnte, aber leider KEINE add_order/remove_order-Events: import socketio sio = socketio.Client() @sio.event def connect(): print('connection established') @sio.event def add_order(data): print('message received with ', data) @sio.event def remove_order(data): print('message received with ', data) @sio.event def disconnect(): print('disconnected from server') sio.connect("https://ws2.bitcoin.de:443/market/", socketio_path="/socket.io/1") sio.wait() # connection established # [Warten...Warten...] # [STRG-C] # disconnected from server Handelt es sich dabei um ein Problem an meinem Netzwerk oder ist etwas an meinem Code falsch? Mit Socket.IO kenne ich mich leider nicht so super aus, bin eher in der Numerik unterwegs..
×
×
  • 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.