くろもワークス

IT系の技術メモや仮想通貨のことなど

複数の取引所から各仮想通貨の価格を取得できるComposerパッケージ「cyptalt」を公開しました。

今のところ対応している取引所は以下の通りです。
これからも増やしていきたいと思いますが、まずは国内で多く使われてそうな取引所を選びました。

  • bitFlyer
  • Bittrex
  • Coincheck
  • Poloniex
  • Zaif

ソースコードは、GitHubに公開しています。 英語はGoogle翻訳を駆使したもので恥ずかしいので、あまり深読みしないでくださいw
github.com

続きからは、README.mdの内容を日本語で整形した使い方の説明+作ってみた感想です。

インストール

PHP5.5以上を想定していて、Composerパッケージなので当然Composerが使える環境であることが必須です。
インストールは以下のコマンドでできます。

$ composer require kuromoka/cyptalt

使い方

例えばPoloniexから、BTC_ETHペアの最終取引価格を取得したい場合は、以下のようなコードで取得できます。

require 'vendor/autoload.php';

use Cyptalt\Client;

$client = new Client();
$result = $client->setExchange('Poloniex')->setPair('BTC_ETH')->getLastPrice();
echo $result['Poloniex']['BTC_ETH'];    // 0.04549105

取引所を指定せずに取得することもできます。
以下のようなコードの場合、上で書いた取引所全てから、BTC_ETHペアの最終取引価格を取得します。取引所にないペアの場合は、NULLを返します。また、ペアの指定は必須としています。

$client = new Client();
$result = $client->setPair('BTC_ETH')->getLastPrice();
echo $result['Poloniex']['BTC_ETH'];     // 0.04549105
echo $result['Bittrex']['BTC_ETH'];      // 0.04577
echo $result['Coincheck']['BTC_ETH'];    // NULL (Coincheck doesn't support BTC_ETH pair.)

指定する取引所やペアの名前は、割と自由に指定できるようにしています。
各取引所のAPIによって、特にペア名が大文字だったり小文字だったり、区切り文字が-だったり_だったりするのですが、 その辺は特に意識する必要はありません。
例として、OKとNGな名前指定を以下に挙げます。

// OK
$client->setExchange('poloniex')  
// OK
$client->setExchange('POLONIEX') 
// NG
$client->setExchange('POLONIE') 

// OK
$client->setPair('BTC_ETH'); 
// OK
$client->setPair('btc-eth'); 
// OK
$client->setPair('ETH/BTC');
// NG
$client->setPair('BTC:ETH');

結果の配列も、指定した取引所やペアの名前がそのままキーとして、参照する形になります。

$client = new Client();
$result = $client->setExchange('POLONIEX')->setPair('ETH/BTC')->getLastPrice();
echo $result['POLONIEX']['ETH/BTC'];    // 0.04549105

最終取引価格以外に、ビッド/アスクの価格と取引量のボリュームも取得できます。
その場合、getLastPrice()をそれぞれ以下のメソッドに置き換えてください。

  • getBidPrice()
  • getAskPrice()
  • getVolume()

作ってみた感想

単にAPIにリクエスト投げて価格が返ってくるものを作るだけならそこまで苦労しないですが、 今回は勉強がてらPHPUnitでテストを書いてみたり、Travis CIを導入してみたりしたので、サボった期間もありますが1ヶ月くらいかかりました。
ただ非常に勉強になることが多かったので、今後もアウトプット活動は増やしていきたいと思います。