技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

WebSocketとJSON-RPCでリアルタイムAPIデータ取得【Go】

外部package、websocket - GoDoc を使います。

下記は、bitflyerAPIを使用して、BTCとJPYの取引をリアルタイムに取得する例です。

type JsonRPC2 struct {    // JSON-RPCのプロトコルをtype定義
    Version string      `json:"version"`
    Method  string      `json:"method"`
    Params  interface{} `json:"params"`
    Result  interface{} `json:"result"`
    ID      *int        `json:"id"`
}

type SubscribeParams struct {    // bitflyerのJSON-RPCプロトコルが、名前付き引数("channel")での利用を想定して設計されているため、別途typeを定義
    Channel string `json:"channel"`
}

func main() {
    u := url.URL{Scheme: "wss", Host: "ws.lightstream.bitflyer.com", Path: "/json-rpc"}    // bitflyer公式の案内に従う
    log.Printf("connecting to %s", u.String())    // どこに接続したのかが分かるよう、最初にログ出力(ログのため、時間が分かる)

    c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)    // websocketによる接続を確立
    if err != nil {
        log.Fatalln("dial:", err)
    }
    defer c.Close()    // 最後に接続を閉じる

    // JSON形式で送信。プロトコルは、bitflyer公式の案内に従う
    if err := c.WriteJSON(&JsonRPC2{Version: "2.0", Method: "subscribe", Params: SubscribeParams{Channel: "lightning_ticker_BTC_JPY"}}); err != nil {
        log.Fatalln("write:", err)
    }
    c.SetWriteDeadline(time.Now().Add(10 * time.Second))    // 10秒以内に送信が成功できない場合、エラーを返す

    for {
        message := new(JsonRPC2)
        if err := c.ReadJSON(message); err != nil {    // JSON形式で受信。プロトコルは、定義したJsonRPC2
            log.Fatalln("read:", err)
        }
        c.SetReadDeadline(time.Now().Add(10 * time.Second))    // 10秒以内に受信が成功できない場合、エラーを返す
        if message.Method == "channelMessage" {    // bitflyer公式の案内に従う
            log.Println(message.Params)
        }
    }
}

送信、受信共にDeadlineの指定は必須です。
Deadlineの指定がなく、プロトコルの中身に間違いがあった場合、
応答がないまま、待ち続けることになります。

ビットコイン取引所【bitFlyer Lightning】

kagigotonet.hatenablog.com