LoginSignup
18
21

More than 5 years have passed since last update.

[golang]GoでbitFlyerのAPIへアクセスしてみた

Last updated at Posted at 2016-02-11

仮想通過ビットコインの取引所であるbitFlyerが提供するAPIを試してみました。
今回試すのは、こちらにあるbitFlyer LightningのAPIです。

bitFlyer Lightning API
Documentation

ドキュメントにいくつかプログラムのサンプルがありますが、Goのサンプルは無かったので他言語を参考に、Goで実装しました。

環境

Mac OSX 10.9.5
Go 1.5

概要

APIは基本的に指定されたエンドポイント(URI)へGET or POSTでアクセスすればokで、JSONのレスポンスが取得できます。
APIにはざっくりと認証不要なPublic APIと、認証必要なPrivate APIの2種あります。

認証不要なPublic APIの実装

こちらの実装は非常に単純で、単に指定されたエンドポイントへHTTPリクエストするだけです。
Goの場合は標準パッケージの"net/http"を利用すれば簡単にアクセスできます。
今回は例として、Public APIの「取引所の状態」へアクセスしてみます。

取引所の状態
エンドポイント
GET /v1/gethealth

gethealth.go
package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    uri := "https://api.bitflyer.jp/v1/gethealth"
    req, _ := http.NewRequest("GET", uri, nil)

    client := new(http.Client)
    resp, _ := client.Do(req)
    defer resp.Body.Close()

    byteArray, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(byteArray))
}

上記のプログラムをターミナルから実行すると、きちんとJSONのレスポンスが取得できたました。

ターミナル
go run gethealth.go
{"status":"NORMAL"}

Public APIは特に認証などが無いので、簡単にAPIへアクセスできます。
便利ですね。ちなみに"NORMAL"は「取引所は稼動しています。」です。

認証必要なPrivate APIの実装

次に、認証をしないとアクセスできない(情報が取得できない)APIを実装します。
上記のPublic APIよりは認証情報をセットする分、実装が難しくなります。

まずPrivate APIへアクセスするため、bitFlyer Lightningにアカウントを作成します。
bitFlyer Lightning

アカウントを作成したら開発者画面へ遷移して、新しいAPIキーを発行して新しいAPI KeyとAPI Secretを取得しておきます。
bitFlyer Lightning developer

ここまで出来たら、早速プログラムを実装します。
Private APIへアクセスするには、先ほど取得したAPI KeyとAPI Secretを利用して、HTTPのリクエストヘッダへ指定された情報をセットします。
リクエストヘッダへセットする情報はAPIドキュメントの認証に記載されてます。

上記ドキュメントの内容を実装してAPIへアクセスします。
今回は例として、Private APIの「資産残高を取得」へアクセスしてみます。

資産残高を取得
エンドポイント
GET /v1/me/getbalance

getbalance.go
package main

import (
    "crypto/hmac"
    "crypto/sha256"
    "encoding/hex"
    "fmt"
    "io/ioutil"
    "net/http"
    "strconv"
    "time"
)

func main() {
    key    := "=== your api key ==="
    secret := "=== your api secret ==="
    method := "GET"

    uri  := "https://api.bitflyer.jp"
    path := "/v1/me/getbalance"

    ts   := strconv.FormatInt(time.Now().Unix(), 10)
    text := ts + method + path

    // API secretでSHA256 署名を生成する
    hash := hmac.New(sha256.New, []byte(secret))
    hash.Write([]byte(text))
    sign := hex.EncodeToString(hash.Sum(nil))

    req, err := http.NewRequest(method, uri+path, nil)
    if err != nil {
        // TODO 例外処理
    }

    req.Header.Set("content-type", "application/json; charset=UTF-8")
    req.Header.Set("ACCESS-KEY", key)
    req.Header.Set("ACCESS-TIMESTAMP", ts)
    req.Header.Set("ACCESS-SIGN", sign)

    client := new(http.Client)
    resp, _ := client.Do(req)
    defer resp.Body.Close()

    byteArray, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(byteArray))
}

上記のプログラムをターミナルから実行する、きちんとJSONのレスポンスが取得できます。

さいごに

Private APIの実装途中でリクエストヘッダの生成処理でハマったが、チャットで聞いたら祝日でも管理人からすぐ返事があり、解決できて嬉しかったです(かのうさん、ありがとうございました!)。
bitFlyerさんのサポートや取り組みには、真摯な態度が感じられてとても好印象です。

日本ではMt.GOX事件の影響や、小難しい専門用語が出てくるビットコイン取引所に対して悪印象を持っている人が多いですが、個人的にはビットコイン(ブロックチェーン)は素晴しい発想だと思うし、今後の動向にとても興味があります。
まだまだ日本での普及は遠いと思いますが、引き続き影ながら応援していきたいと思います。

以上です。

18
21
0

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
  3. You can use dark theme
What you can do with signing up
18
21