URLスクリーンキャプチャを行う方法は、
大きく3つあります。
1、スクリーンショット取得用WEBサービスの利用
簡単に導入できるけど、他社サービスに依存。
2、JSで取得
⬇みたいなのがありましたが、canvasタグを使うのでHTML5が前提。
よって、オールドブラウザは使えない
3、仮想フレームバッファ(Xvfb)+ブラウザ経由
何でもできる。けど実装難度(工数)が高い。
ということで、何でもできるという点を評価し、
上記3で実装を行いました。
実装方法
実装難度が高いと言いましたが、
これはルート権限があれば、比較的簡単に実装が出来ます。
ところが、今回はherokuが前提となっているため。
少々手こずりました。(少々じゃないか。。)
結論から言うと、
IMGkitを使う
IMGkitとは、wkhtmltoimage(Qt4を使用してhtmlレンダリングを行い、イメージ出力するソフト)をラッパーしたgemです。
wkhtmltoimageをダウンロードして、IMGkitでパスを指定してあげれば、
以下のような記述でスクリーンショットを取得できます。
IMGKit.configure do |config|
config.wkhtmltoimage = Rails.root.join('bin', 'wkhtmltoimage-amd64').to_s if ENV['RACK_ENV'] == 'production'
end
file = Tempfile.new(["hogehoge", '.png'], 'tmp', :encoding => 'ascii-8bit')
file.write(IMGKit.new(hogehoge_url, quality: 100, :"crop-w" => 1024).to_png)
で、コントローラ側でDJで呼びつつ、
保存先にcarrierwaveを組み合わせるとベストかと。
日本語が文字化けするんですけど・・・
herokuな方は、fontconfigを使うを参考にしてみてください。
追記
※ リクエスト処理のバリデーションが甘いのでexconを使って事前にチェックするといいですよ。
※ DJは、まわす方じゃないよ、Delayed_job!本家みるとDJで呼んでほしいみたい。
※ wkhtmltoimageはwkhtmltopdfの一部で、PDF出力することも出来ます。