LinuxサーバでWebページのサムネイル画像生成(Python編)
SimpleAPI や はてなスクリーンショット はWindowsのIEベースみたいですけど、どうせならLinuxサーバでやってみましょう。
Xの仮想フレームバッファとgtkmozembedのライブラリを使うので、次のパッケージが必要です。あらかじめyum等でインストールしてください(Fedora Core 5を想定しています)。
- xorg-x11-server-Xvfb
- gnome-python2-gtkmozembed
- mozilla
使い方
$ export DISPLAY="localhost:1.0" $ Xvfb :1 -screen 0 1024x768x24 & (フォント関連のエラーが出ても気にしない) $ export LD_LIBRARY_PATH=/usr/lib/mozilla-1.7.13:$LD_LIBRARY_PATH $ python screenshot-tng.py http://www.yahoo.co.jp/
A potted account of Ross' life をFedora Core 5で動くようにしただけなんですが、以下にソースコードを載せておきます。デーモンとして動くようにちょっといじれば、サムネイル画像生成サーバも簡単にできますね。
#!/usr/bin/python
# This file is released into the public domain.
# Originally Written by Andrew McCall - <andrew@textux.com>
# modified by Matt Biddulph - <matt@hackdiary.com> - to take screenshots
# modified by Hidetaka Yamashita - <hidetaka at gmail.com> - migrate to FC5
import os
import sys
import gtk
import gtk.gdk as gdk
import gtkmozembed
class PyGtkMozExample:
def __init__(self, URL = None, parent = None):
if parent == None:
self.parent = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.parent.set_border_width(10)
else:
self.parent = parent
# Initialize the widgets...
self.widget = gtkmozembed.MozEmbed()
self.widget.set_size_request(816,600)
# Connect signals
self.widget.connect("net_stop", self.on_net_stop)
self.widget.connect("progress", self.on_progress)
self.parent.add(self.widget)
if URL != None:
self.widget.load_url(URL)
self.parent.show_all()
self.countdown = 3
def on_progress(self, data, cur, max):
print cur,"bytes loaded"
def on_net_stop(self, data = None):
gtk.timeout_add(1000,self.do_countdown,self)
print "Taking screenshot in 3...",
sys.stdout.flush()
def do_countdown(self, data = None):
self.countdown -= 1
if(self.countdown > 0):
print str(self.countdown)+"...",
sys.stdout.flush()
gtk.timeout_add(1000,self.do_countdown,self)
return True
else:
print
self.screenshot()
def screenshot(self, data = None):
window = self.widget.window
(x,y,width,height,depth) = window.get_geometry()
width -= 16
pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB,False,8,width,height)
pixbuf.get_from_drawable(window,self.widget.get_colormap(),0,0,0,0,width,height)
pixbuf = pixbuf.scale_simple(266, 200, gdk.INTERP_HYPER)
pixbuf.save("screenshot-thumb.png","png")
print "Wrote screenshot-thumb.png"
gtk.main_quit()
return True
def __windowExit(widget, data=None):
gtk.main_quit()
if __name__ == "__main__":
try:
HomeDir = os.environ["HOME"]
except KeyError:
raise "No Home Directory, Don't Know What to Do"
ProfileDir = HomeDir + "/.gtkmozembedexample/"
print "Note: a mozilla profile has been created in : " + ProfileDir
gtkmozembed.gtk_moz_embed_set_profile_path(ProfileDir, "helpsys")
window = PyGtkMozExample(URL=sys.argv[1])
window.parent.connect("destroy", __windowExit)
gtk.main()










slav0nic said
on 2008-04-27 5:08 a.m.
tnx! this what i need;)