スポンサーリンク

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

取引所API

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

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

コード

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

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

/// <summary>bitFlyer取引所の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メソッド。"GET"か"POST"を指定します。</param>
/// <param name="query">URLクエリ。</param>
/// <param name="body">APIメソッドが"POST"のとき指定するリクエストボディ。</param>
/// <returns>レスポンスとして返されるJSON形式の文字列。</returns>
internal async Task<string> Send(HttpClient http, Uri path, string apiKey, string secret, string method, Dictionary<string, string> query = null, object body = null)
{
    // 相対URLにクエリパラメータを追加
    if (query != null && query.Any())
    {
        var content = new FormUrlEncodedContent(query);
        string q = await content.ReadAsStringAsync();

        path = new Uri(path.ToString() + "?" + q, UriKind.Relative);
    }

    // リクエスト時のUNIXタイムスタンプ
    string timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();

    //リクエストボディをJSON化
    string jsonBody = body == null ? "" : JsonConvert.SerializeObject(body);

    // POSTするメッセージを作成
    string message = timestamp + method + path.ToString() + jsonBody;

    // メッセージをHMACSHA256で署名
    byte[] hash = new HMACSHA256(Encoding.UTF8.GetBytes(secret)).ComputeHash(Encoding.UTF8.GetBytes(message));
    string sign = BitConverter.ToString(hash).ToLower().Replace("-", "");//バイト配列をを16進文字列へ

    // HTTPヘッダをセット
    http.DefaultRequestHeaders.Clear();
    http.DefaultRequestHeaders.Add("ACCESS-KEY", apiKey);
    http.DefaultRequestHeaders.Add("ACCESS-TIMESTAMP", timestamp);
    http.DefaultRequestHeaders.Add("ACCESS-SIGN", sign);

    // 送信
    HttpResponseMessage res;
    if (method == "POST")
    {
        var content = new StringContent(jsonBody, Encoding.UTF8, "application/json");
        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)は取引所から取得したものに置き換えてください。

板情報を取得する

//bitFlyer取引所にアクセスする HttpClient
HttpClient http = new HttpClient();
http.BaseAddress = new Uri("https://api.bitflyer.jp");

//URLのクエリパラメータ
var query = new Dictionary<string, string>
{
    { "product_code", "BTC_JPY" },//通貨の種類
};

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

資産を取得する

//bitFlyer取引所にアクセスする HttpClient
HttpClient http = new HttpClient();
http.BaseAddress = new Uri("https://api.bitflyer.jp");

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

買い注文を出す

bitFlyerでは、日本円の端数が次のように処理されます。
・トレーダーが支払う日本円の一円未満は切り上げ
・トレーダーが貰える日本円の一円未満は切り下げ

//bitFlyer取引所にアクセスする HttpClient
HttpClient http = new HttpClient();
http.BaseAddress = new Uri("https://api.bitflyer.jp");

//リクエストボディ
market_order order = new market_order
{
    product_code = "BTC_JPY",//取引する通貨の種類
    child_order_type = "LIMIT",//指値 "LIMIT"、成行 "MARKET" 
    side = "BUY",//注文の売買の種類(買い:BUY, 売り:SELL)
    price = 100000m,//ビットコインのレート
    size = 0.01m//ビットコインの注文量
};

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

まとめ

こちがbitFlyerのAPIのヘルプです。APIキーの取得についても書かれています。
https://lightning.bitflyer.jp/docs/api

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

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