コインエクスチェンジ(CoinExchange)は簡単に草コインの売買ができます。
しかし現在APIはほとんど用意されてなくてちょっと不便な部分も多いです。
板に壁があって、いくら減っても追加されて見た目が変わらないときに、どれくらいの注文が削れたのか(入れ替わったのか)を知りたいです。
つまり最近のトレードからどれぐらいの売買が行われたか見たい。
ヘッドレスブラウザのPhantomjsとラッパーのCasperjsを使ってトライしてみます。
方法1 waitFor
まず正攻法のwaitForメソッドを使ってトレード日時を監視してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
//CoinExchangeRecentTrades.js var casper = require('casper').create(); var $ = require('node_modules/jquery'); var TARGET ="https://www.coinexchange.io/market/EXC/BTC"; var i=1,date; casper.userAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'); casper.start(TARGET); function observe(csp){ if(!date)date = $(csp.getHTML("#recent-trades-table tbody:last-child tr:first-child",true)).find("td:first-child")[0].innerHTML; casper.echo("---"+date); csp.captureSelector('now.png', '#recent-trades-table tbody:last-child'); csp.waitFor(function check() { return this.evaluate(function(date) { return document.querySelector("#recent-trades-table tbody:last-child tr:first-child td:first-child").innerHTML != date; },date); }, function then() { var newtrade = $(csp.getHTML("#recent-trades-table tbody:last-child tr:first-child",true)).find("td:first-child")[0].innerHTML; date = newtrade; casper.echo("find - "+newtrade); //TODO 集計などの処理 observe(csp); },function timeout() { csp.reload(function() { casper.echo("reload"); observe(this);}); },5*60*1000);//5分間見つからなければリロード } casper.then(function(){ casper.echo("wait start"); observe(this); }); casper.then(function(){ casper.echo("end"); }); casper.run(); |
これはトレード日時は同時になることがある(大量の注文が複数の注文を決済するなど)ので全部を拾いきれません。
またWebSocketを使ったページでよくあるのですが、そもそも監視中に新しい情報を取得できませんでした。
同様にWebSocketを使ったDiscordではできていたので詳しい原因はわかりません。
方法2 onResourceReceived
次に通信で受信したデータを直接見てみようと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
var casper = require('casper').create({ onResourceReceived:function(csp,res) { csp.echo(JSON.stringify(res)); }, onPageInitialized:function(page) { casper.echo("page"); page.evaluate(function(){ (function(w){ w.WebSocket = function(){ //hogohogo }; })(window); }); }, }); |
色々試してみましたが、WebSocketの通信を見ることができませんでした。
そもそも関連した情報が少なすぎる。
方法3 loop
一定時間ごとに情報を拾ってあとでまとめます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
casper.then(function(){ function loop(csp){ var tbody = csp.evaluate(function() { return document.querySelector("#recent-trades-table tbody:last-child").outerHTML; }); $(tbody).find("tr").each(function(){ var list = $(this).find("td"); casper.echo(list[1].innerHTML); //差分比較してまとめる }); casper.wait(3*60*1000,function(){ this.reload(function(){ loop(this); }); }); } loop(this); }); |
これは更新をトリガーにしていないので流れが速いと見逃します。
あと比較差分を出すのが面倒。
所感
なかなか思い通りに動かない。
色んな知識がいる中でボトルネックがあると躓くので進みが悪い。
ブラウザで直接 javascript を動かす場合の処理は思いついてるけど、WebSocketの切断対応で面倒な処理を作らないといけないから少し保留。
CEの API ver2 は使いやすいものでありますように。