藤井太洋氏の小説『アンダーグラウンド・マーケット』を読んで興味を持ち、仮想通貨ってやつをちょっとかじってみようということでBtcboxに登録してみた先週。
「儲けたいぜー」というよりは「ちょっと遊んでみよう」というスタンスではあるけれど、それでも手持ちのコインが値上がりすると少しワクワクしますな。
ヘルプによるとAPIが用意されているらしく、確かにサンプルの通りに叩くとそれらしい値が返ってくるが、どうもBitcoinだけが対象でより単価の低いLitecoinやDogdecoinについては見当たらない。
サイトを確認するかぎりスクレイピング自体を禁止する規約は無さそうだった(拾った情報を使ったウェブアプリとかになると流石にNGぽい)ので、各コインの現在の状況を取得できるスクリプトを書いてみた。
使うもの
以前はCasperJSを使用していたものの、あれらはNodeとは独立して動く仕組みなため、取得してきたデータを活用するには「外部コマンドの形で呼んで戻り値として・・・」とか「ファイルを定期的に吐かせて・・・」とか何かしらの歪曲的な手段が必要になる。
そんなわけで今回はNodeからPhantomJS使えるようにするブリッジphantomjs-nodeを使用してみた。
また、Hubotのスクリプトを書いていてフィーリングが悪くなかったCoffeescriptを使用してみた。
導入
PhantomJS自体とCoffeescriptをインストールした上でnpm install phantom cheerio
で今回使用するphantomjs-nodeおよびcheerioをインストール。
記述
githubのReadmeを参考にCoffeescriptで記述する。
引数として指定されたコインの種類のURLをpage.openで開き、取得してきたhtmlタグをcheerioに食わせてスクレイピングする。
phantomJSの説明は割愛。(一番上で挙げたエントリの方に書いた)
cheerioはjQueryを再実装したもの(らしい)で、つまり使い慣れたセレクタでhtmlの要素を取得したりできる。
よってChromeディベロッパーツールなんかで欲しい部分のタグを調べてそれを記述してやればよいのだ。
使用法
例えばLitecoinについて取得したければ・・・
$ coffee btcbox.coffee ltc opened btcbox-ltc? success 価格 ¥169 高値 ¥172 安値 ¥169 売気配値 ¥169 買気配値 ¥168 出来高 668.244
てな具合。
Coffeescriptなんで当然のごとくコンパイルしてJavascriptにもできる。
$ coffee -c btcbox.coffee $ node btcbox.js doge opened btcbox-doge? success 価格 ¥0.0144 高値 ¥0.0145 安値 ¥0.0144 売気配値 ¥0.0144 買気配値 ¥0.0125 出来高 17756
今回のスクリプトだけだと特に何をするでもないけど、例えばこれをcronで動かしてストレージに貯めて長期的な値動きをみるとか自動取引に使うとか、何かしらのメッセージにより自分への通知として流すだとか、Nodeなんでそれなりに使いようはあると思う。
Coffeescript最初は目が慣れずに戸惑ったけど、書いていってみればなかなか合理的な文法で面白いですな。
Javascriptのコールバック無間地獄がかなり見易く書き易くなる。
コンパイルされたJavasciptも人間が読める記述になっているのは好印象。
AltJSはそんなに気乗りしなくてやるとしてもDartかなーと思ってたけど、これはちょっと始めてみても良いかなって気がしてきた。

- 作者: 飯塚直
- 出版社/メーカー: アスキー・メディアワークス
- 発売日: 2013/05/29
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
追記
と、ここまでやってきて、Githubに同じくbtcbox関連のプロジェクトを見つけて読んでみたら、何か普通にltcとかdogeとかも扱えそうな雰囲気。
もしやと思ってAPIの後ろにcoinパラメータ追加してみたら取れた!
https://www.btcbox.co.jp/api/v1/ticker/?coin=btc
https://www.btcbox.co.jp/api/v1/ticker/?coin=ltc
https://www.btcbox.co.jp/api/v1/ticker/?coin=doge
そういうのあるなら書いといてよー・・・
まあそれはそれとして、Node&Coffeescriptでphantomjsを扱えたので、例えばHubot越しにページのスクリーンショットを取得するとか、もっと複雑なことをさせるとかできるわけだ。
応用は効きそうである。