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 :(
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?
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.
ralphtheninja
digitalPhonix
Benutzer4903