Less is Best

rubyが好き。技術の話とスタートアップに興味があります。

Chefでscreenshot-as-a-serviceをインストール出来るようしてみた。

Chefでスクリーンショットサーバーを立てる話です。

現在開発中のアプリケーションにおいて、サーバーでスクリーンショットを取る必要があったためどうしようかと悩んでいた所、screenshot-as-a-serviceなるものを見つけたので、chefからインストール出来るようにレシピを書いてみました。

fzaninotto / screenshot-as-a-service

このアプリはnode.jsとphantomjsを使用してサーバーサイドでhtml,css,javascriptを動かしてレンダリングしてスクリーンショットを取ることを可能にしてくれるアプリです。便利!APIを叩くと生成されたスクリーンショットを返してくれます。

 curl http://localhost:3000/?url=www.google.com > google.png

こんな感じで動きます。 私はrubyから叩いていたので以下のような形で使ってました。

  def shot()
    open("http://localhost:4000?url=http://google.com").read
  end

  file  = Tempfile.new(["screenshot", '.png'], 'tmp',
                             :encoding => 'ascii-8bit')
  file.write shot(urlmodel.url)

自分でnodejsでも使って実装しておきたい所だったんですが、とりあえず開発中のアプリを動かすために、パーツとして組み込んだほうが圧倒的に早いのでさくっと使わせて頂きました。

当初はgemとして提供されているIMGKitを用いて実装しようとしていたのですが、このgemが使用しているwkhtmltoimageではjavascriptを使用しているサイトなど、きれいにスクリーンショットを取れないサイトが出てきました。phantomjsを使用しているこちらのアプリを使用するとjavascript使ってるサイトとかでもきれいにレンダリングできたのでこちらを使用して行きます。

csquared / IMGKit

ということで今回作ったchefレシピがこちら。

yss44 / chef-screenshot-as-a-service

initスクリプトがredhad系のos向けになっていますし、CentOSでした起動確認してませんがご了承を。defaultでポート4000番で待ち受ける設定になってます。