Mtgox

MtGox websockets api 返回“400 錯誤請求”

  • May 13, 2013

我想開始使用 Mt. Gox websockets API,但我似乎無法從伺服器獲得良好的響應。

我正在發送以下內容(使用 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

伺服器響應:

HTTP/1.1 400 Bad Request

我已嘗試通過 telnet 和此 C# 程式碼發送握手,但仍然收到 400 Bad Request 錯誤:

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);
   }
}

(列印的最後一行是“Closed”,當我檢查與 Wireshark 的握手時,我看到相同的 400 Bad Request)

任何想法我做錯了什麼?我看不到太多使用 websockets API 的文件或範例,所以我真的沒有什麼可比較的:(

為了回應 sta 的建議,我嘗試了這個(使用 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();
}

這顯示FALSE所以我仍然做錯了:/我還沒有機會深入研究 WebSocketSharp

更新:使用 WebsocketSharp 正確設置 Origin 標頭,Wireshark 顯示 mtgox 伺服器接受 websocket 升級:

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

但是 WebSocketSharp 仍然報告連接已關閉:(

似乎客戶端應該在​​打開握手時將 Origin 標頭髮送到 MtGox 伺服器。

如果您使用目前的 websocket-sharp,您應該在連接之前執行以下操作。

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

你能試試嗎?

更新:

你能再試試下面的程式碼嗎?

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();
}

當客戶端在一段時間內接收到ticker類型數據時,似乎發生了異常。

我會進一步調查。

更新:

我已經找到了異常的原因,並修復了 websocket-sharp。

你能用目前的 websocket-sharp 試試你的程式碼嗎?

引用自:https://bitcoin.stackexchange.com/questions/10428