ビットコインの会社、BitFlyerのAPIについて調べてみました。
C#のサンプルコードを見てみると、StreamJsonRpcを使うらしい・・・。
うーん、またNuGetで入れるものを増やすのか。無しでできないものかね?
と思って、他のマーケットのサンプルを見つつ、書いてみました。
Publicの、板情報を取得する部分のみです。
※以下のプログラムは後日改定版が出ています。こちら
const string endpoint = "wss://ws.lightstream.bitflyer.com/json-rpc";
const string message = "{ \"method\" : \"subscribe\" , \"params\" : { \"channel\" : \"lightning_board_FX_BTC_JPY\"} , \"id\":null }";
using var clientWebSocket = new System.Net.WebSockets.ClientWebSocket();
clientWebSocket.Options.KeepAliveInterval = TimeSpan.Zero;
await clientWebSocket.ConnectAsync(new Uri(endpoint), CancellationToken.None);
var messageBytes = Encoding.UTF8.GetBytes(message);
await clientWebSocket.SendAsync(
new ArraySegment<byte>(messageBytes),
System.Net.WebSockets.WebSocketMessageType.Text,
true,
CancellationToken.None);
while (true)
{
if (clientWebSocket.State != System.Net.WebSockets.WebSocketState.Open) { break; }
var incomingData = new byte[8192];
var result = await clientWebSocket.ReceiveAsync(new ArraySegment<byte>(incomingData), CancellationToken.None);
if (result.Count > 0)
{
// incomingData , result.Countを使って何かする
}
}
しかし、WebSocketのAPIは、各マーケットでずいぶん振る舞いが違いますね。
差分を送ってくるところ、板の中央部分を丸ごと送ってくるところ。
変更の度に送ってくるところ、定期的に送ってくるところ。
何なんでしょうね。この一貫性の無さは。不思議だ。