search
LoginSignup
4

More than 3 years have passed since last update.

posted at

updated at

GoでZaifのストリーミング APIを試してみる

これからの時代は「FinTechでGo!!」という噂を聞きつけたので、
udemyの「現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発」で勉強中。

講座の中ではbitFlyer Lightning Realtime API を使っているけど、
Zaifに口座を持っているのでそっちで試してみたい...

ってことで手始めにZaifのGoでストリーミングAPI試してみた。

ZaifのストリーミングAPIはwebsocketを利用してリアルタイム板情報と終値を配信している。

使い方は簡単で以下のリクエストURLに接続するだけ。

リクエスト
wss://ws.zaif.jp/stream?currency_pair={currency_pair}
ws://ws.zaif.jp/stream?currency_pair={currency_pair}

戻り値はこんな感じ。

{
        "asks":[
            [
                30000.0,
                0.1
            ],
            [
                30010.0,
                0.2
            ],
            ...
        ],
        "bids":[
            [
                29500.0,
                0.5
            ],
            [
                29300.0,
                0.1
            ],
            ...
        ],
        "trades":[
            {
                "currenty_pair":"btc_jpy",
                "trade_type":"ask",
                "price":30001,
                "tid":123,
                "amount":0.02,
                "date":1427879761
            },
        ...,
        "timestamp":"2015-04-01 18:16:01.739990",
        "last_price:{
            "action":"ask",
            "price":30001
        },
        "currency_pair":"btc_jpy"
}

それでコードはこれ。

main.go
package main

import (
    "fmt"
    "github.com/gorilla/websocket"
    "log"
    "net/url"
    "time"
)

type Results struct {
    Asks         []interface{} `json:"asks"`
    Lastprice    Lastprice     `json:"last_price"`
    Targetusers  []interface{} `json:"target_users"`
    Trades       []interface{} `json:"trades"`
    Bids         []interface{} `json:"bids"`
    Currencypair string        `json:"currency_pair"`
    Timestamp    string        `json:"timestamp"`
}

type Lastprice struct {
    Action string  `json:"action"`
    Price  float64 `json:"price"`
}

func main() {

    u := &url.URL{
        Scheme:   "wss",
        Host:     "ws.zaif.jp",
        Path:     "stream",
        RawQuery: "currency_pair=btc_jpy",
    }

    c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
    if err != nil {
        log.Fatal("dial:", err)
    }
    defer c.Close()

    for {
        result := new(Results)
        if err := c.ReadJSON(&result); err != nil {
            log.Fatal(err)
        }
        // 後は構造体から必要な結果を取ってくる。
        fmt.Println(result.Currencypair)

        time.Sleep(1 * time.Second)

    }
}

Goのwebsocketライブラリはいろいろあるみたいだけどudemyの講座内で使ってて情報も多いので[github.com/gorilla/websocket]を使用。

アクセスして情報を引っ張ってくるまでは簡単だけどJSONの扱い方にちょっと戸惑った...
定義した構造体にそのままデータを放り込めるから慣れると便利なのかも。
コードにツッコミとかアドバイスいただけると嬉しいです。

実際にシストレさせるまでの道のりはまだまだ遠いな。

Goをやってみたい方はこの講座がおすすめです。
現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発

あと同じ講師の方のPythonコースもとてもわかりやすいのでおすすめです。
Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学び、実践的なアプリ開発の準備をする

udemyは結構な頻度で割引セールをやっているのでその時にほしい講座をまとめて買っておくといいと思います。
(だいだい2000円以下まで下がった時が買い時です。それ以外の時は待ちましょう!!)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4