中安拓也のブログ

プログラミングについて書くブログ

仮想通貨取引所のAPIを使ってみる #3 - Private API にアクセスする

前回記事はこちら

仮想通貨取引所のbitFlyerのHTTP Private APIにアクセスして、自分の資産残高を取得する。

バージョン情報

JavaScriptのフレームワークであるAngularを使用する

  • Angular: 5.2.9

  • crypto-js: 3.1.9-1

今回アクセスするAPIは認証が必要

第1回目第2回目でアクセスした、認証が不要なPublic APIではなく、認証が必要なPrivate APIにアクセスする

Private APIの認証

https://lightning.bitflyer.jp/docs

Private APIの認証では、下記の情報をHTTPリクエストヘッダーに含める必要がある。

  • ACCESS-KEY: 開発者ページで発行した API key

  • ACCESS-TIMESTAMP: リクエスト時の Unix Timestamp

  • ACCESS-SIGN: ACCESS-TIMESTAMP, HTTP メソッド, リクエストのパス, リクエストボディ を文字列として連結したものを、 API secret で HMAC-SHA256 署名を行った結果

下準備

HMAC-SHA256 署名を実施するのに必要なライブラリ、crypto-jsをインストールする。

$ npm i crypto-js

コード

Private API の一つにアクセスして、自分の資産残高を取得してみる

src/app/services/bitflyer.service.ts

// ...省略
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import { PrivateAPIKeySet } from '../private/private.component';
import * as crypto from 'crypto-js';

const URLS = {
  BASE: 'https://api.bitflyer.jp',
  GET_BALANCE: '/v1/me/getbalance'
};

@Injectable()
export class BitflyerService {
  constructor(
    private http: HttpClient,
    private action: BitflyerTickerActions
  ) {}

  getBalance = (keySet: PrivateAPIKeySet): void => {
    const timestamp = Date.now().toString();
    const method = 'GET';
    // ACCESS-TIMESTAMP, HTTP メソッド, リクエストのパス,
    // リクエストボディ を文字列として連結したもの
    const text = timestamp + method + URLS.GET_BALANCE;

    // HMAC-SHA-256で署名を作成する
    // keySet.secretはAPI secret
    const hmac = crypto.HmacSHA256(text, keySet.secret);
    // 署名をHEXでエンコード
    const sign = crypto.enc.Hex.stringify(hmac);

    const httpOptions = {
      headers: new HttpHeaders({
        // keySet.keyはAPIキー
        'ACCESS-KEY': keySet.key,
        'ACCESS-TIMESTAMP': timestamp,
        'ACCESS-SIGN': sign
      })
    };
    this.http
      .get(`${URLS.BASE}${URLS.GET_BALANCE}`, httpOptions)
      .subscribe(console.log);
  };
}

動作確認

上記のコードを実行すると、下記の結果(自分の資産残高)が帰ってくる。

[{
    "currency_code": "JPY",
    "amount": 531.0,
    "available": 531.000000000000
}, {
    "currency_code": "BTC",
    "amount": 0.0000648,
    "available": 0.000064800000
}, {
    "currency_code": "BCH",
    "amount": 0.0,
    "available": 0.0
}, {
    "currency_code": "ETH",
    "amount": 0.0,
    "available": 0.0
}, {
    "currency_code": "ETC",
    "amount": 0.0,
    "available": 0.0
}, {
    "currency_code": "LTC",
    "amount": 0.0,
    "available": 0.0
}, {
    "currency_code": "MONA",
    "amount": 0.0,
    "available": 0.0
}, {
    "currency_code": "LSK",
    "amount": 0.0,
    "available": 0.0
}]

参考サイト

HMAC-SHA256 署名 プログラム・ソース・ソフトウェアの配布 PJC

base64ってなんぞ??理解のために実装してみた - Qiita

GolangでHMAC-SHA256署名する - 逆さまにした

HMAC - Wikipedia