【GAS】bitbank(ビットバンク)のAPIをGoogle Apps Scriptで利用する ~ビットコインを注文(売買)してみる~

##前提として
:white_check_mark:  bitbankに登録(口座開設)済、かつ口座に日本円が入金済　※売る場合は該当通貨も保有済であること(当たり前)
https://app.bitbank.cc

:white_check_mark:  bitbankのAPIアクセスキーとアクセスシークレットを発行済である
https://support.bitbank.cc/hc/ja/articles/360036234574-API%E3%82%AD%E3%83%BC%E3%81%AE%E7%99%BA%E8%A1%8C%E3%81%A8API%E4%BB%95%E6%A7%98%E3%81%AE%E7%A2%BA%E8%AA%8D%E6%96%B9%E6%B3%95

:white_check_mark:  Googleアカウント取得済である
https://www.google.com/intl/ja/account/about/

:white_check_mark:  Google Apps Scriptを利用したことがある
https://script.google.com/home

:relaxed:  前回までの記事は読んだ
[【GAS】bitbank(ビットバンク)のAPIをGoogle Apps Scriptで利用する ~ビットコインの最新取引価格を取得してみる~](https://qiita.com/kaketechjapan/items/d6ae9a0630e949fcc517 "【GAS】bitbank(ビットバンク)のAPIをGoogle Apps Scriptで利用する ~ビットコインの最新取引価格を取得してみる~")
[【GAS】bitbank(ビットバンク)のAPIをGoogle Apps Scriptで利用する ~自分の資産情報を取得してみる~](https://qiita.com/kaketechjapan/items/da6696146adcdb631ab9 "【GAS】bitbank(ビットバンク)のAPIをGoogle Apps Scriptで利用する ~自分の資産情報を取得してみる~")

## ビットコインを注文してみる
プライベートAPI公式ドキュメント(日本語)
https://github.com/bitbankinc/bitbank-api-docs/blob/master/rest-api_JP.md

このドキュメント中の
**新規注文を行う**の項目を利用します。

[前回の記事](https://qiita.com/kaketechjapan/items/da6696146adcdb631ab9 "【GAS】bitbank(ビットバンク)のAPIをGoogle Apps Scriptで利用する ~自分の資産情報を取得してみる~")で認証のくだりはクリアしているので、
今回の注意点は```GET```ではなく```POST```であるという点です。

##POSTの場合の変更点

* パラメータを***Json文字列***にしてリクエストボディに含める
* 署名作成用の連結文字列は「***ACCESS-NONCE、リクエストボディのJson文字列***」 を連結させる


一つずつ見ていきましょう。

#### パラメータを***Json文字列***にしてリクエストボディに含める
パラメータとは、以下のように、注文する内容の各項目をセットしたものです。

```
const body = {
  "pair": "btc_jpy", 　// 買いたい銘柄(ビットコイン)
  "price": "4000000", // 買いたい価格(円)
  "amount": "0.0001", // 買いたい量
  "side": "buy", // buy(買) or sell(売)
  "type": "limit" //  limit(指値) or market(成行)
};
```
これを、json文字列に変換します。

```
const payload = JSON.stringify(body);

// payloadとは、一般的にhttpリクエストのhttpヘッダーを除いたボディ部分、つまり送信内容そのものです
```

#### 署名作成用の連結文字列は「***ACCESS-NONCE、リクエストボディのJson文字列***」 を連結させる
nonceと、先ほどのpayloadを組み合わせて連結文字列とします。

```
const concatenated_string = `${nonce}${payload}`;
```

## いざ、注文
あとは、これらをoptionに含めて、注文APIにPOSTします。
完成したプログラムはこちらです。

```spotOrderCoin.gas
function spotOrderCoin(){
  // プライベートAPI
  const PRIVATE_URL = "https://api.bitbank.cc/v1";

  // APIアクセスキーとアクセスシークレット
  const ACCESS_KEY = "XXXXXXXXXXXXXXXXXXXXXXXXXX", // ご自分のアクセスキーを入れてください
  ACCESS_SECRET = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; // ご自分のアクセスシークレットを入れてください

  // UNIXタイムスタンプからナンスを作成
  const date = new Date();
  const nonce = Math.floor( (date.getTime() / 1000) ).toString();

  // パラメータをリクエストボディに設定
  const body = {
    "pair": "btc_jpy", // ビットコインの場合です。他の通貨を希望する場合は変更してください
    "price": "4000000", // 例です。ご自分が希望する価格を入れてください
    "amount": "0.0001", // 例です。ご自分が希望する量を入れてください
    "side": "buy", // 買い注文
    "type": "limit" // 指値
  };

  // bodyの内容をJSON文字列に変換
  const payload = JSON.stringify(body);

  // 連結文字列を作成
  const concatenated_string = `${nonce}${payload}`;

  // 著名を作成
  const signature_base = Utilities.computeHmacSha256Signature(concatenated_string, ACCESS_SECRET);
  const signature = signature_base.reduce( function(str, chr) {
    chr = (chr < 0 ? chr + 256 : chr).toString(16);
    return str + (chr.length == 1 ? '0' : '') + chr;
  }, '');

  // ヘッダー情報を設定
  const headers = {
    "Content-Type": "application/json",
    "ACCESS-KEY": ACCESS_KEY,
    "ACCESS-NONCE": nonce,
    "ACCESS-SIGNATURE": signature　
  };

  // payloadをoptionsに設定
  const options = {
    "method": "POST",
    "headers": headers,
    "payload": payload
  };

  // ビットコインを買い注文
  const response = JSON.parse( UrlFetchApp.fetch(PRIVATE_URL + '/user/spot/order', options) );
  console.log(response);
}
```
結果例

```
{ success: 1,
  data: 
   { order_id: 12345678901,
     pair: 'btc_jpy',
     side: 'buy',
     type: 'limit',
     start_amount: '0.0001',
     remaining_amount: '0.0001',
     executed_amount: '0.0000',
     price: '4000000',
     average_price: '0',
     ordered_at: 1612514297428,
     status: 'UNFILLED' } }
```
こんな感じのレスポンスが返ってきたら成功です。




## 売り注文の場合
買い注文と同じことです。パラメータの```"side"```の値を```buy```から```sell```に変えるだけです。

## APIで何かやってる実感
おそらくこの売り買い注文のあたりから、
APIでいろいろやってる実感が出てくるのではないでしょうか。

あとは例えば、

* 資産の推移をスプレッドシートに記録しグラフ化する
* タイマーで自動実行する
* ある値段になったら自動で買う、売る
* 毎日、毎月決まった額だけ積み立て注文する

などなど、
このあたりのこともGoogleサービスでいろいろできますのでぜひ試してみてください。