bitFlyer/LightningのAPIをPHPから呼び出すライブラリ

Bitcoin、8/1のシステム刷新を控え高騰したり暴落したり忙しいですが、Bitcoinの取引所である「bitFlyer/Lightning」の[API](https://lightning.bitflyer.jp/docs?lang=ja)があったので使えるPHPライブラリを探したのですがないようなので自作しました。

[stk2k/phitflyer](https://github.com/stk2k/phitflyer)

APIリクエストはcURLを使用しています。マルチではないのでAPIレスポンスが返ってくるまではじっと我慢です。
ライセンスはMITですが、BitFlyerAPIの[利用規約](https://bitflyer.jp/ja/api)に従ってください。

# bitFlyerって？

ビットコインの売買をすることができる取引所です。ユーザになると専用のビットコインアドレスが振られて、そこにビットコインを貯めることもできますし、ビットコインの送受信や売買を行うことができます。

# bitFlyer/Lightningとは

通常のビットコイン現物取引やビットコインFX取引、イーサリアム取引ができるマーケットです。bitFlyerのログイン後画面から移動できます。

# bitFlyer/Lightning APIとは

REST APIによって公開データの取得や自分の証拠金残高や資金移動、新規注文/キャンセルなど、通常画面から行う作業をプログラムから行うことができます。

# 本題

## インストール

composerを使ってインストール：

```
composer require stk2k/phitflyer
```

GitHub:
```
git clone git@github.com:stk2k/phitflyer.git
```

## 使い方

### APIキーの生成

APIを使って個人アカウントの情報にアクセスするためには「APIキー」と「APIシークレット」が必要になります。
[開発者ページ](https://lightning.bitflyer.jp/developer)で自分の「APIキー」と「APIシークレット」を生成してください。
(名前はなんでもOK）

![1b8d57c6c2a96edbd27645396e0adac2.png](https://qiita-image-store.s3.amazonaws.com/0/17003/333f093a-f75c-c0ee-c00f-599722ae380a.png)

間違ってAPIキー、APIシークレットをGitHubなんかに置かないようにしましょう。

## 基本的な使い方

phitFlyerは以下のように使います。

```
require './vendor/autoload.php';

use PhitFlyer\PhitFlyerClient;
 
$flyer = new PhitFlyerClient();
 
$markets = $flyer->getMarkets();
foreach($markets as $idx => $market){
    echo $idx . '.' . PHP_EOL;
    echo 'product_code:' . $market->product_code . PHP_EOL;
    echo 'alias:' . (isset($market['alias']) ? $market['alias'] : '') . PHP_EOL;
}
```

まずcomposerのオートローダーを読み込みます。
次にPhitFlyerClientを作成して、目的のAPIに対応したメソッドを呼び出します。
ここではマーケット一覧を取得しています。
取得結果はvar_dump等で確認してください。

また[API](https://lightning.bitflyer.jp/docs?lang=ja)に書かれているAPIのうち、[HTTP Public API](https://lightning.bitflyer.jp/docs?lang=ja#http-public-api)はAPIキー/APIシークレットを使用しませんが、[HTTP Private API](https://lightning.bitflyer.jp/docs?lang=ja#http-private-api)の方は個人情報にアクセスするため前述のAPIキー/APIシークレットが必要になります。


```
require './vendor/autoload.php';

use PhitFlyer\PhitFlyerClient;

$api_key = '開発者ページで作成したAPIキー';
$api_secret = '開発者ページで作成したAPIシークレット';
 
$flyer = new PhitFlyerClient($api_key, $api_secret);
 
$markets = $flyer->meGetPermissions();
```

上記の例ではAPIキーのパーミッションを取得しています。
パーミッションはそのAPIキーで何ができるかを表していて、[開発者ページ](https://lightning.bitflyer.jp/developer)で設定することができます。

![83b206de95308ae7dcebdcccafb53fb8.png](https://qiita-image-store.s3.amazonaws.com/0/17003/685b1396-3164-3d60-281f-d6988d96d8ac.png)

当然ですがこの画面でチェックがついていない機能をAPIから利用することはできません。

## 結果をオブジェクトで取ってくる

PhitFlyerClientは取得結果をjson_decodeするだけなので高速ですが、取得結果の配列アクセス時にチェックする必要があります。
(板情報のaliasなど）
PhitFlyerObjectClient経由でメソッドコールすることでオブジェクトとして返してくれるので、その辺のチェックが不要になります。
(速度的には不利になりますが）

```
use PhitFlyer\PhitFlyerClient;
use PhitFlyer\PhitFlyerObjectClient;
 
$flyer = new PhitFlyerObjectClient(new PhitFlyerClient());
 
$markets = $flyer->getMarkets();
 
foreach($markets as $idx => $market){
    echo $idx . '.' . PHP_EOL;
    echo 'product_code:' . $market->getProductCode() . PHP_EOL;
    echo 'alias:' . $market->getAlias() . PHP_EOL;
}
```

## サポートしているAPI

phitFlyerが実装しているbitFlyerAPIの機能です。

### HTTP Public API(公開データAPI)

|機能              | HTTPリクエスト         | phitFlyerのメソッド      | 対応    |
|:----------------|:----------------------|:------------------------|:------:|
|マーケットの一覧   |GET /v1/markets        |getMarkets()             |v0.1.0~      |
|板情報            |GET /v1/board          |getBoard()              |v0.1.0~      |
|Ticker           |GET /v1/ticker         |getTicker()             |v0.1.0~      |
|約定履歴           |GET /v1/executions    |getExecutions()         |v0.1.0~      |
|板の状態           |GET /v1/getboardstate    |getBoardState()         |v0.2.0~      |
|取引所の状態       |GET /v1/gethealth     |getHealth()              |v0.1.0~      |
|チャット          |GET /v1/getchats       |getChats()              |v0.1.0~      |

### HTTP Private API(個人情報API)


|機能              | HTTPリクエスト                | phitFlyerのメソッド      | 対応    |
|:----------------|:-----------------------------|:------------------------|:------:|
|API キー権限取得   |GET /v1/me/getpermissions     |meGetPermissions()       |v0.1.0~      |
|資産残高           |GET /v1/me/getbalance        |meGetBalance()           |v0.1.0~      |
|証拠金            |GET /v1/me/getcollateral      |meGetCollateral()        |v0.1.0~      |
|通貨別 証拠金      |GET /v1/me/getcollateralaccounts    |meGetCollateralAccounts()         |v0.1.0~      |
|預入用ビットコイン・イーサリアムアドレス取得|GET /v1/me/getaddresses     |meGetAddress()            |v0.1.0~      |
|ビットコイン・イーサ預入履歴       |GET /v1/me/getcoinins     |meGetCoinIns()            |v0.1.0~      |
|ビットコイン・イーサ送付履歴       |GET /v1/me/getcoinouts     |meGetCoinOuts()            |v0.1.0~      |
|銀行口座一覧取得     |GET /v1/me/getbankaccounts     |meGetBankAccounts()            |v0.1.0~      |
|入金履歴     |GET /v1/me/getdeposits     |meGetDeposits()            |v0.1.0~      |
|~~出金~~     |~~GET /v1/me/withdraw~~     |~~meWithdraw()~~          |~~v0.1.0~~~×      |
|~~出金履歴~~     |~~GET /v1/me/getwithdrawals~~     |~~meGetWithdrawals()~~            |~~v0.1.0~~~×      |
|新規注文を出す    |GET /v1/me/sendchildorder     |meSendChildOrder()            |v0.1.0~      |
|注文をキャンセルする    |GET /v1/me/cancelchildorder     |meCancelChildOrder()            |v0.1.0~      |
|新規の親注文を出す（特殊注文）    |GET /v1/me/sendparentorder     |-            |×      |
|親注文をキャンセルする    |GET /v1/me/cancelparentorder     |-            |×      |
|すべての注文をキャンセルする   |GET /v1/me/cancelallchildorders     |meCancelAllChildOrders()  |v0.1.0~      |
|注文の一覧を取得  |GET /v1/me/getchildorders     |meGetChildOrders()  |v0.1.0~      |
|親注文の一覧を取得 |GET /v1/me/getparentorders     |-  |×      |
|親注文の詳細を取得 |GET /v1/me/getparentorder     |-  |×      |
|約定の一覧を取得 |GET /v1/me/getexecutions     |meGetExecutions()  |v0.1.0~      |
|建玉の一覧を取得 |GET /v1/me/getpositions     |meGetPositions()  |v0.1.0~     |
|取引手数料を取得 |GET /v1/me/gettradingcommission     |meGetPositions()  |v0.1.0~     |

引数の詳細については[APIドキュメント](https://lightning.bitflyer.jp/docs?lang=ja)を参照してください。

特殊注文系は未対応ですが、希望が多ければ対応するかもしれません。
寄付もお待ちています！

Bitcoin: 3HCw9pp6dSq1xU9iPoPKVFyVbM8iBrrinn

※バージョンアップ情報

|日付        |バージョン     | 内容                                                      |
|:-----------|:-----------:|:---------------------------------------------------------|
|2018/2/20   |v0.2.0       | 「板の状態」API(/v1/getboardstate)を追加                   |
|            |             | 「出金」API(/v1/me/withdraw)を削除                         |
|            |             | 「出金履歴」API(/v1/me/getwithdrawals)を削除   |
|2018/5/8    |v0.3.0       | PhitFlyerClientの一部のメソッドが返すデータをオブジェクトから配列に変更|
|2018/5/22   |v0.4.0       | インタフェース名変更・HTTP接続ライブラリをstk2k/net-driverに変更・PSR-3 Logger対応|