スポンサーリンク

ビットコイン取引所「BTCBOX」のAPIをC#から実行してみた!

取引所API

前回の投稿で、「bitFlyer」のAPIを紹介しました。
今回はビットコイン取引所「BTCBOX」のAPIをC#で実装したサンプルを紹介します!

他の取引所のAPIについてはコチラ

コード

取引所と通信する基本部のコード

秘密キーによる署名と、HTTPによる応答を行うメソッドをC#で実装したものです。取引所サイトにHTTPでリクエストして、レスポンスとしてJSON形式のテキストを受け取ります。

BTCBOXの場合、秘密キーのMD5ハッシュで署名するところがミソです。

/// <summary>BTCBOX取引所のAPIを実行します。
/// </summary>
/// <param name="http">取引所と通信する HttpClient。</param>
/// <param name="path">APIの通信URL(取引所サイトからの相対)。</param>
/// <param name="apiKey">APIキー。</param>
/// <param name="secret">秘密キー。</param>
/// <param name="method">APIのメソッド名。</param>
/// <param name="parameters">APIのパラメータのリスト(Key:パラメータ名, Value:パラメータの値)。</param>
/// <returns>レスポンスとして返されるJSON形式の文字列。</returns>
internal async Task<string> Send(HttpClient http, Uri path, string apiKey, string secret, string method, Dictionary<string, string> parameters = null)
{
    //送信
    HttpResponseMessage res;
    if (method == "POST")
    {
        if (parameters == null)
            parameters = new Dictionary<string, string>();

        //ノンス作成
        string nonce = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();

        //パラメータに公開キーとノンスを追加
        parameters.Add("key", apiKey);
        parameters.Add("nonce", nonce);

        //ここで一旦、パラメータからURLクエリパラメータ文字列を作成
        var content = new FormUrlEncodedContent(parameters);
        string query = await content.ReadAsStringAsync();

        //秘密キーのMD5ハッシュを作成。MD5ハッシュ(バイナリ)→16進文字列化→バイナリにするのがコツ!
        byte[] md5Hash = new MD5CryptoServiceProvider().ComputeHash(Encoding.ASCII.GetBytes(secret));
        string key = BitConverter.ToString(md5Hash).ToLower().Replace("-", "");//バイト配列をを16進文字列へ

        //URLクエリパラメータをHMACSHA256で署名
        //秘密キーは、MD5ハッシュ化(バイナリ)→16進文字列化→バイナリ にして渡すのがコツ!
        byte[] chaHash = new HMACSHA256(Encoding.ASCII.GetBytes(key)).ComputeHash(Encoding.ASCII.GetBytes(query));
        string sign = BitConverter.ToString(chaHash).ToLower().Replace("-", "");//バイト配列をを16進文字列へ

        //パラメータに署名を追加
        parameters.Add("signature", sign);
        content = new FormUrlEncodedContent(parameters);

        res = await http.PostAsync(path, content);
    }
    else if (method == "GET")
    {
        res = await http.GetAsync(path);
    }
    else
    {
        throw new ArgumentException("method は POST か GET を指定してください。", method);
    }

    //応答内容を取得
    string text = await res.Content.ReadAsStringAsync();

    //応答失敗
    if (!res.IsSuccessStatusCode)
        return "";

    return text;
}

使用例

先に紹介した通信メソッドの使用例です。コード内のAPIキー(apiKey)と秘密キー(secret)は取引所から取得したものに置き換えてください。

板情報を取得する

//BTCBOX取引所にアクセスする HttpClient
HttpClient http = new HttpClient();
http.BaseAddress = new Uri("https://www.btcbox.co.jp");

//板情報を取得
Uri path = new Uri("/api/v1/depth", UriKind.Relative);//APIの通信URL
string apiKey = "XXXXX";//APIキー        
string secret = "XXXXX";//秘密キー
string method = "GET";//APIメソッド
string json = await Send(http, path, apiKey, secret, method);

資産を取得する

//BTCBOX取引所にアクセスする HttpClient
HttpClient http = new HttpClient();
http.BaseAddress = new Uri("https://www.btcbox.co.jp");

//資産残高取得
Uri path = new Uri("/api/v1/balance", UriKind.Relative);//APIの通信URL
string apiKey = "XXXXX";//APIキー        
string secret = "XXXXX";//秘密キー
string method = "POST";//APIメソッド
string json = await Send(http, path, apiKey, secret, method);

買い注文を出す

最低取引量は0.01btcです。それ以下の注文はエラーになります。

ビットコインを売るときは、貰う日本円から手数料が引かれ、ビットコインを買うときは、貰うビットコインから手数料が引かれます。

//BTCBOX取引所にアクセスする HttpClient
HttpClient http = new HttpClient();
http.BaseAddress = new Uri("https://www.btcbox.co.jp");

//パラメータ
var param = new Dictionary<string, string>
{
    { "type", "buy" },//注文の売買の種類(買い:buy, 売り:sell)
    { "price", "100000" },//ビットコインのレート
    { "amount", "0.01" },//ビットコインの注文量(0.01以上から)
};

//注文を出す
Uri path = new Uri("/api/v1/trade_add/", UriKind.Relative);//APIの通信URL
string apiKey = "XXXXX";//APIキー        
string secret = "XXXXX";//秘密キー
string method = "POST";//APIメソッド
string json = await Send(http, path, apiKey, secret, method, param);

まとめ

こちがBTCBOXのAPIのヘルプです(残念ながら英語です)。APIキーの取得についても書かれています。
https://www.btcbox.co.jp/help/api.html

他の取引所のAPIについてはコチラ

タイトルとURLをコピーしました