LoginSignup
2
0

More than 5 years have passed since last update.

BitBankの取引価格と残高を自動で取得

Last updated at Posted at 2018-04-21

GoogleAppsScriptでバッチを定時実行して
Gmailで送信させることにより、
各取引所の取引価格や残高を自動取得させることが可能です。

ソースは一部省略しています。

GoFのデザインパターンで言うところの
Commandを参考にしました。

POSTメソッドを使えば自動取引も可能です。

doGet.js
//-------Const-------
var EXCHANGE_CC = "CoinCheck";
var URL_CC = "https://coincheck.com";
var URL_CC_ACCOUNT = URL_CC + "/api/accounts/balance";
var URL_CC_TICKER  = URL_CC + "/api/ticker";
var URL_CC_RATE    = URL_CC + "/api/rate/btc_jpy";

var EXCHANGE_BB = "BitBank";
var URL_BB     = "https://public.bitbank.cc";
var URL_BB_PRV = "https://api.bitbank.cc";
var URL_BB_TICKER = URL_BB + "/btc_jpy/ticker";
var URL_BB_ASSETS = "/v1/user/assets";

var EXPORT_MAIL = "Mail";
var EXPORT_LOG  = "Log";

//-------JSON_Item-------
// Public
var mostLowPrice;  //24時間最安値
var mostHighPrice; //24時間最高値

var rateBtcJpy; //BTC/JPY価格

// private
var blncJpy; //JPY残高
var blncBtc; //BTC残高

/*******************************
 *  EntryPoint
 *******************************/ 
function doGet(){
  try{
    //JSONを取得
    getJson(EXCHANGE_BB);

    //メールで報告
    export(EXPORT_MAIL);

  }catch (e){
    var errMsg = "";
    if (e.fileName && e.lineNumber) {
            errMsg = "ファイル: " + e.fileName 
                   + ", 行: "    + e.lineNumber;
    }
    errMsg += ", " + e.message;
    export(EXPORT_MAIL, "エラーcatch: " + errMsg);
  }

  return;
}
getJson.js
/*******************************
 *  JSONの取得
 *******************************/
function getJson(exchange){
  //Bitbank
  if (exchange === EXCHANGE_BB) { getBbJson(); }
  //CoinCheck
  if (exchange === EXCHANGE_CC) { getCcJson(); }
}

/*******************************
 *  JSONの取得(BitBank
 *******************************/
function getBbJson(){
  var methodGet = 'get';
  var nonce = Date.now().toString();

  //publicオプション
  var pubOption = {
    'method' : methodGet
    , 'muteHttpExceptions' : true
    , "contentType": "application/json"
  };

  //シグネチャ
  var sign = createSignature(EXCHANGE_BB, nonce);  

  //privateオプション
  var prvOption = {
    'method' : methodGet
    , 'muteHttpExceptions' : true
    ,  headers: {
        'ACCESS-KEY': BB_ACCESS_KEY
        , 'ACCESS-NONCE': nonce
        , 'ACCESS-SIGNATURE': sign
      }
    , "contentType": "application/json"
  };

  // fetch / responce
  var resTicker = UrlFetchApp.fetch(URL_BB_TICKER, pubOption);
  var resBalance = UrlFetchApp.fetch(URL_BB_PRV + URL_BB_ASSETS, prvOption);

  //取得の確認ログメール発行
  if (resTicker.getResponseCode() != 200) {export(EXPORT_MAIL, "ティッカーJSON取得失敗 " + resTicker.getContentText());}
  if (resBalance.getResponseCode() != 200) {export(EXPORT_MAIL, "残高JSON取得失敗 " + resBalance.getContentText());}

  // JSONファイル
  var jsonTicker  = JSON.parse(resTicker.getContentText());
  var jsonBalance = JSON.parse(resBalance.getContentText());

  //値の設定
  rateBtcJpy = jsonTicker["data"]["last"]; //BTC/JPY価格
  blncJpy = jsonBalance["data"]["assets"][IDX_JSON_BB_ASSET_JPY]["onhand_amount"];
  blncBtc = jsonBalance["data"]["assets"][IDX_JSON_BB_ASSET_BTC]["onhand_amount"];
}


//CoinCheck省略

createSignature.js

/*******************************
 *  シグネチャ作成
 *******************************/
function createSignature(exchange, nonce, body){
  //BitBank
  if (exchange === EXCHANGE_BB) { 
    return createSignatureBb(URL_BB_ASSETS
                             , BB_SECRET_ACCSESS_KEY
                             , nonce
                             , body
                             ); 
  }
}

/*******************************
 *  シグネチャ作成(Bitbank
 *******************************/
function createSignatureBb(url, secretKey, nonce, body){
  var text =  (typeof body === "undefined") ? 
              nonce + url : nonce + url + body;

  var signature = Utilities.computeHmacSha256Signature(text, secretKey);

  var sign = signature.reduce(function(str,chr){
    chr = (chr < 0 ? chr + 256 : chr).toString(16);
    return str + (chr.length==1?'0':'') + chr;
  },'');

  return sign;
}
mail.js
/*******************************
 *  出力
 *******************************/
function export(typeExport, msg){
  if (typeExport === EXPORT_MAIL) {
    reportMail(msg); 

    if (typeof msg !== 'undefined'){logSheet(msg);}
  }

  if (typeExport === EXPORT_LOG) { logSheet(msg); }
}

/*******************************
 *  メールで報告
 *******************************/
function reportMail(msg){
  var date = Utilities.formatDate(new Date()
                                  , 'Asia/Tokyo'
                                  , 'yyyy年MM月dd日: HH時mm分ss秒'
                                 );

 GmailApp.sendEmail(
    TO_MAIL_ADDRESS
    , "自動売買の報告"
    ,""
    + "[BitBank]\n"
    + "残高JPY: " + delimit(blncJpy) + "\n"
    + "残高BTC: " + String(blncBtc)  + " BTC\n"
    + "\n\n"
    + "レート: " + delimit(rateBtcJpy)    + "\n" 
    + "\n"
    + date
  );
}

/******************************
 *  カンマ生成
 ******************************/
function delimit(val, floorble) { 
  var result = String(Math.floor(val)).replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,');

  return result;
}

参考

ビットコおじさんの仮想通貨情報局 API入門(1)取引所のリアルタイムレートをゲット!
Google Apps Scriptを使って定期実行するcronを作る
【保存版】Google Apps Scriptリファレンス~キーワード別インデックス

2
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0