rubyでWebページのスクリーンショットをとる

まずGtk2, WebKitが要る

Gtk2

sudo apt-get install libgtk2.0-dev
sudo gem install gtk2

WebKit

sudo apt-get install libwebkit-dev
git clone https://github.com/magec/rbwebkitgtk
cd rbwebkitgtk && ruby extconf.rb && make && sudo make install

screenshot.rb

# -*- encoding: UTF-8 -*-
require 'rubygems'
require 'open-uri'
require 'gtk2/base.rb'
require 'webkit'
require 'timeout'

class Screen < Gtk::Window
  def initialize(id, url)
    super()
    @option = {
      :id   => id,
      :url  => url,
      :size => [840, 600],
      :path => File.dirname(__FILE__) + "/tmp/#{id}.png"
    }
    self.border_width = 0
    self.resize(@option[:size][0], @option[:size][1])
  end

  def screenshot
    gdkw = self.child.parent_window
    x, y, width, height, depth = gdkw.geometry
    width -= 16
    pixbuf = Gdk::Pixbuf.from_drawable(nil, window, 0, 0, width, height)
    pixbuf = pixbuf.scale(210, 150, Gdk::Pixbuf::INTERP_HYPER)
    pixbuf.save(@option[:path], "png")
  end

  def on_net_stop
    Gtk::timeout_add(1000) do
      screenshot
      Gtk.main_quit
    end
  end
end

class ScreenShot < Screen
  def initialize(id, url)
    super
    self << Gtk::WebKit::WebView.new
    self.child.set_size_request(@option[:size][0], @option[:size][1])
    self.child.open(@option[:url])
    self.child.signal_connect("load_finished") { on_net_stop }
    self.show_all
    Gtk.init
    Gtk.main
  end
end

if ARGV[0] && ARGV[1]
  ScreenShot.new(ARGV[0], ARGV[1])
end

というように単体のファイルとして作っておき

# -*- encoding: UTF-8 -*-
ruby_command = "ruby screenshot.rb #{filename} #{url}"
`#{ruby_command}`

というように使う

CUI環境でやりたい場合はXvfbを

sudo apt-get install xvfb

でインストールして

# -*- encoding: UTF-8 -*-
xvfb_command = "xvfb-run -a --server-args=\"-screen 0 840x600x24\""
ruby_command = "ruby screenshot.rb #{filename} #{url}"
`#{xvfb_command} #{ruby_command}`

というように使う