無駄と文化

実用的ブログ

node-webshotをcoに対応させる

URLと保存先のパスを渡すだけでWebサイトのスクリーンショットを保存してくれるnode-webshotがなかなか便利。
オプションも豊富で真っ当で、ちょっと遅ぇけど余計な事考えずに使える。


なんですけど、coに対応してないのでちょっとツラいですね。
複数ページでスクリーンショット取るときとかツラい。いちいちcallback渡して繋いでいくとかやってらんない。

そんなわけでちょっと手を加えます。

co-webshot.js

var webshot = require('webshot');

var co_webshot = function(url, path, options) {
  return function(cb) {
    options = options != null ? options : {};
    return webshot(url, path, options, cb);
  };
};

module.exports = co_webshot;

実際に使うときは、

index.js

var co      = require('co');
var webshot = require('./co-webshot');

sites = [
  {url: 'https://www.google.co.jp/', name: 'google'},
  {url: 'http://www.yahoo.co.jp/', name: 'yahoo'},
  {url: 'http://www.cnn.co.jp/', name: 'cnn'},
];

var run = function() {
  return co(function*() {
    return (yield sites.map(function(site) {
      return webshot(site.url, site.name + ".png");
    }));
  });
};

run().then(function(result) {
  return console.log('done.');
});

こんな感じで。

Generator関数を使うので、Node.js v1.12.xで実行する際は--harmonyオプションを忘れずに。


私からは以上です。


参考にしました

eugeneware/co-sleep · GitHub