node.js BTC.comのAPIを利用したBitcoinトランザクション情報出力

【本文】
---

最近、Bitcoinのtxhash(txid)からtx情報を取得する必要があるので、一括で大量のトランザクション情報を自動取得する簡易的なサンプルをnodejsで作成。
APIからのレスポンス待ちが必要なのと、読み込んだ順に結果を吐き出して欲しいので、同期処理にした。
注）自分のクライアント端末で処理できるレベルなので、あまり処理負荷については考慮してない。

【使用したAPI】
---

>```java:
GET /tx/{txhash}
//例
https://chain.api.btc.com/v3/tx/{txhash}?verbose=3
>```

【サンプル】
---

**[test_btccom_api_getTxInfo.js]**

+ txidが1行ずつ書かれたテキストファイル等を読み込み、配列に格納。
+ 配列に格納されたtxidを基に1行ずつBTC.comのAPIを叩き、結果を待つ。）1000ミリ秒の応答待ち。）
+ APIの実行結果を別のテキストファイルに出力する。
+ 追加（2018/9/10）：JSON形式でファイル読み込みできるよう出力ロジックを変更。

>```java:test_btccom_api_getTxInfo.js
/* txidをファイルから読み込みkeyにしてbtc.comのAPIを叩き、結果をファイルに書き出す。 */
var request = require("request");
var fs = require('fs');
var async = require('async');
var jsonfile = require('jsonfile');
var array = [];
var array_opt = [];
var api_result;
var url;
async.waterfall([
  function(next) {
    setTimeout(function() {
      array = fs.readFileSync('./api_tx/read_txList.txt').toString().split("\n");
      for(num in array) {
        //console.log(array[num]);
      }
      next(null,1);
    }, 1000);
  },
  function(result,next) {
    fs.appendFileSync('./api_tx/write_result_tx.json', '{' + '\n', 'utf-8');
    setTimeout(function() {
      var array_num =1;
      async.forEachSeries(array, function (value, callback2) {
        console.log(value);
        url = 'https://chain.api.btc.com/v3/tx/' + String(value).replace("\r","") + '?verbose=3'
        console.log("processing: " + array_num + " / " + array.length);
        /* Apiを呼び出す */
        api_result = ApiGet(url,array_num,array.length);
        array_num = array_num + 1;
        setTimeout(callback2,1000);
      }, function (err, array) {
      });
      next(null,1,2);
    }, 1000);
  }
], function(err) {
/* 途中でnext(err)すると、ここに飛んでerrが入る。 */
//console.log("test");
})
/* REST-API: GET */
function ApiGet(url,array_num,max_array_num){
  var options = { method: 'GET',
  url: url,
  /* proxyは必要に応じて指定。 */
  //proxy: 'http://proxy.xxx:[port]',
  headers:
  { accept: 'application/json' } };
  request(options, function (error, response, body) {
    if (error) return console.error('Failed: %s', error.message);
    if (array_num == max_array_num) {
      fs.appendFileSync('./api_tx/write_result_tx.json', '"data' + array_num + '":' + body + '}\n', 'utf-8', (error));
    } else {
      fs.appendFileSync('./api_tx/write_result_tx.json', '"data' + array_num + '":' + body + ',\n', 'utf-8', (error));
    }
    return body;
  });
}
>```

**[test_TxInfo_json_to_List.js]**

+ 追加モジュール（2018/9/10）
+ 'test_btccom_api_getTxInfo.js'の実行結果であるtxを書き出したJSONファイルからkeyとvalueを再帰的にテキストファイルに吐き出す。
+ 複数の入れ子になっていて、各実行結果で入れ子の階層が相違している場合に一覧化するのに便利。

>```java:test_TxInfo_json_to_List.js
// btc.comのAPI実行結果のtxを書き出したJSONファイルからkeyとvalueを再帰的にテキストファイルに吐き出す
var request = require("request");
var fs = require('fs');
/* 読み込みファイルの階層に注意 */
var json = require("./write_result_tx.json");
var json_to_List = function json_to_List(data, callback){
  for (var key in data) {
      callback(key, data[key]);
      if (typeof data[key] === "object") {
        json_to_List(data[key], callback);
      }
  }
}
json_to_List(json, function(key, value) {
  fs.appendFileSync('./api_tx/write_result_tx.txt', key + ":" + value + '\n', 'utf-8');
});
>```

JSON.parseを使えばもっとシンプルなコードになるが、最下層からアクセスするため順序が崩れてしまう点に注意が必要。
（＊詳細は参考文献のリンクより参照。）

以上。


【参考文献】
---

**API**

+  [" BTC.com: API Documentation "](https://btc.com/api-doc)

**スクリプトとか**

+  [【JavaScript】ネストされたJSONのすべての要素にアクセスする](https://kuroeveryday.blogspot.com/2015/11/AccessNestedJSONData.html)