MtGox Websockets API gibt "400 Bad Request" zurück

Ich möchte mit der Mt. Gox-Websockets-API beginnen, bekomme aber anscheinend keine gute Antwort vom Server.

Ich sende Folgendes (erfasst mit Wireshark):

GET /mtgox HTTP/1.1
User-Agent: websocket-sharp/1.0
Upgrade: websocket
Connection: Upgrade
Host: websocket.mtgox.com
Sec-WebSocket-Key: LtH+YFgnW1N8KDLDbocsUQ==
Sec-WebSocket-Version: 13

und der Server antwortet:

HTTP/1.1 400 Bad Request

Ich habe versucht, den Handshake über Telnet zu senden, und mit diesem C#-Code erhalte ich immer noch einen 400 Bad Request-Fehler:

class Program
{
    static void Main(string[] args)
    {
        ClientWebSocket ws = new ClientWebSocket();
        Task connectionTask = ws.ConnectAsync(new Uri("ws://websocket.mtgox.com/mtgox"), CancellationToken.None);
        Console.Write("Connecting");
        while (!connectionTask.IsCompleted)
        {
            Console.Write(".");
            Thread.Sleep(100);
        }
        Console.WriteLine(ws.State);
    }
}

(Die letzte gedruckte Zeile ist "Closed" und wenn ich den Handshake mit Wireshark inspiziere, sehe ich die gleiche 400 Bad Request)

Irgendwelche Ideen, was ich falsch mache? Ich kann nicht viel Dokumentation oder Beispiele mit der Websockets-API sehen, also habe ich nicht wirklich etwas zum Vergleichen :(

Als Antwort auf den Vorschlag von sta habe ich Folgendes versucht (mit WebsocketSharp):

static void Main(string[] args)
{
    WebSocket ws = new WebSocket("ws://websocket.mtgox.com/mtgox");
    ws.Origin = "http://websocket.mtgox.com";
    ws.Connect();
    ws.OnMessage += (sender, e) =>
    {
        if (!String.IsNullOrEmpty(e.Data))
        {
            Console.WriteLine("{0}", e.Data);
        }
    };
    Console.WriteLine("{0}", ws.IsAlive);
    Console.ReadLine();
}

Dies wird angezeigt FALSE, sodass ich immer noch etwas falsch mache: / Ich hatte jedoch noch keine Gelegenheit, mich mit WebSocketSharp zu beschäftigen

Update: Wenn WebsocketSharp den Origin-Header korrekt einstellt, zeigt Wireshark, dass der mtgox-Server das Websocket-Upgrade akzeptiert:

HTTP/1.1 101 Switching Protocols\r\n
Upgrade: websocket\r\n
Connection: Upgrade\r\n
Sec-WebSocket-Accept: 2+1ghzJ/Itt6w1aBdUteghcsJHk=\r\n
\r\n

Aber WebSocketSharp meldet die Verbindung immer noch als geschlossen :(

Lustig, ich habe gerade dasselbe bemerkt, aber ich schreibe einen Websocket-Client für node.js.
Es scheint einen großen Unterschied zwischen dem websocket.mtgox.com/mtgox-Server und dem socketio.mtgox.com/mtgox-Server zu geben ... Das unten gepostete Loourr-Beispiel funktioniert für socketio (etwas anderer Handshake), aber ich bin mir immer noch nicht sicher, warum ich kann keine Verbindung zum Websocket herstellen (mit C# WebSockets oder dieser Websockets-Implementierung für den Knoten: github.com/Worlize/WebSocket-Node )
Kann ich versuchen, es mit einem anderen Kanal zu tun? ticker.BTCEUR, ticker.BTCAUD...etc Mit freundlichen Grüßen.

Antworten (2)

Es scheint, dass der Client den Origin-Header beim Öffnen des Handshakes an den MtGox-Server senden sollte.

Wenn Sie aktuelles Websocket-Sharp verwenden, sollten Sie wie folgt vorgehen, bevor Sie eine Verbindung herstellen.

ws.Origin = "http://websocket.mtgox.com";

Könntest du es versuchen?

Aktualisieren:

Könnten Sie den folgenden Code erneut versuchen?

static void Main(string[] args)
{
    var ws = new WebSocket("ws://websocket.mtgox.com/mtgox?Currency=USD");
    ws.Origin = "http://websocket.mtgox.com";
    ws.OnOpen += (sender, e) =>
    {
      ws.Send(
@"{
    ""op"": ""unsubscribe"",
    ""channel"": ""d5f06780-30a8-4a48-a2f8-7ed181b4a13f""
}"
      );
    };
    ws.OnMessage += (sender, e) =>
    {
        if (!String.IsNullOrEmpty(e.Data))
        {
            Console.WriteLine("{0}", e.Data);
        }
    };
    ws.Connect();
    Console.ReadLine();
    ws.Close();
}

Es scheint, dass eine Ausnahme aufgetreten ist, wenn der Client seit einiger Zeit Ticker-Daten empfängt.

Ich werde ein wenig weiter recherchieren.

Aktualisieren:

Ich habe die Ursache der Ausnahme herausgefunden und websocket-sharp behoben.

Könnten Sie Ihren Code mit aktuellem Websocket-Sharp ausprobieren?

Ich habe das gerade versucht und WebsocketSharp meldet, dass die Verbindung geschlossen wird: (Code zur Frage hinzugefügt)
Das mit wss:// funktioniert!

Zum einen sollte die URL lauten websocket.mtgox.com/mtgox. Hier ist ein Beispielprojekt, das die node.js socket.io-Bibliothek verwendet.

Ich habe nicht viel Erfahrung in C#, aber hier ist eine Implementierung in node.js

var io = require('socket.io-client');
var socket = io.connect( 'https://socketio.mtgox.com/mtgox' );

var message = {
  "op": "subscribe",
  "channel": "24e67e0d-1cad-4cc0-9e7a-f8523ef460fe" // this is the market depth channel
};

socket.send(JSON.stringify(message));

socket.on('message', function(message) { console.log(message); });

Dadurch werden Änderungen der Markttiefe in der Konsole protokolliert.

Ich habe keinen Ruf, um abzustimmen :( Danke! Ich werde versuchen herauszufinden, wie das Node.JS-Beispiel anders handshaket ... Ändern meines Codes, um eine Verbindung zu socketio.mtgox.com/mtgox herzustellen , anstatt zu dem, was ich hatte dazu geführt, dass der Server die Verbindung sofort geschlossen hat (sendet nicht einmal eine schlechte Antwort auf die Anfrage)
Schön, dass es geholfen hat. Sie können jedoch eine Antwort als richtig annehmen ;-)
Ich möchte die rohe Websocket-API verwenden. Socket.io erstellt schlechte Abstraktionen.