仮想通貨取引所のCoinExchangeは直近20件の取引履歴しか見ることができず、どれくらい板が消化されたのかわかりません。
このログを取ろうとして以前に失敗していたので今回は完成版です。
かなり力技なので実用に耐えれるかはわからないです。
まずはブラウザで CoinExchange のどこかを開きます。
これはCEがクロスドメインアクセスができないからです。
スクリプトを実行するので普段使っている(ログインしている)ブラウザではない方がいいと思います。
F12ボタンを押してコンソール入力画面を開いて以下を入力します。
これは DOGE/BTC を監視する場合です。
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 36 37 38 39 40 41 |
var TARGET1 ="DOGE"; var TARGET2 ="BTC"; var SUMS={}; ceRecentTradeMain(); function ceRecentTradeMain(){ var w = window.open("https://www.coinexchange.io/market/"+TARGET1+"/"+TARGET2); w.onload = function(){ function check(node){ if(node instanceof HTMLElement){ var v = node.querySelector("td:nth-child(3)").innerHTML; var n1 = node.querySelector("td:nth-child(4)").innerHTML; var n2 = node.querySelector("td:nth-child(5)").innerHTML; if(!SUMS[v])SUMS[v]=[0,0]; SUMS[v][0] += parseFloat(n1); SUMS[v][1] += parseFloat(n2); console.log("---"+new Date().toString()+"---"); for(var key in SUMS){ console.log("%.8f : %10.8f %s (%10.8f %s)",key,SUMS[key][0],TARGET1,SUMS[key][1],TARGET2); } console.log(""); } } // main observe var observer = new MutationObserver(function (rs, obs) { rs.forEach(record => { Array.from(record.addedNodes).forEach(node => { check(node); }); }); }); observer.observe(w.document.querySelector('#recent-trades-table tbody:last-child'), { childList: true }); w.bal_ws.onclose = function(evt){ //WebSocket再接続時の処理 console.log("******************************"); for(var key in SUMS){ console.log("%.8f : %10.8f %s (%10.8f %s)",key,SUMS[key][0],TARGET1,SUMS[key][1],TARGET2); } console.log("******************************"); w.close(); ceRecentTradeMain(); } }; } |
するとターゲットに指定した通貨ページが新しいウィンドウで開きます。
30分ほどたつとWebSocketが切れるので、onclose処理で再開してます。
これはスクリプトを実行したウィンドウ、新しく開いたウィンドウのどちらかを消すと停止します。
実行中はこんな感じで取引のたびに合計が出る仕様です。
所感
WebSocketのトークンが接続時に配布されること、再接続するとスクリプトが止まること、この2つを解決するために回り道しました。
もっといい解決法がある気がする。
新APIはよ。
javascriptから開いたwindowの中身をObserveしたりWebSocket変数を書き換え。
これは今までできるとは思わなかったので今後なにかに使えるかもしれない。