Perlで遊ぼう
ってことで、私がちょいと調べてみたPerlのサンプルスクリプトなどを載せてみます。
最低限CPANの知識が必要です。その他Linuxの知識がいろいろと。
構造生物学とは関係ないです。
GtkMozEmbedを使ってWebページをキャプチャ
MozillaのAPIを使ってWebページをキャプチャしてみます。
Gtk::MozEmbedのインストール
CPANからGtk::MozEmbedを取得してインストールします。システムで必要だったのは以下のものです。
- glib-devel
- gtk2-devel
- cairo-devel
- mozilla-devel
ぐらいだったと思います。これだけ入れたらたぶんcpanシェルでもすんなり入ると思います(手動でインストールしましたが)。
スクリプトサンプル
こんな感じで作りました。Gtk2 APIを使うのが初めてだったので妥当なコードかどうかはわかりませんが・・・
Gtk::MozEmbedのサンプルを使って作成しました。
- captest.pl
#!/usr/bin/perl use strict; use warnings; use Glib qw(TRUE FALSE); use Gtk2 -init; use Gtk2::MozEmbed; main(); sub main { Gtk2::MozEmbed->set_profile_path($ENV{HOME} . "/.mybrowser", "MyBrowser"); my $window = Gtk2::Window->new("toplevel"); # windowを作成 my $moz = Gtk2::MozEmbed->new(); # MozEmbedを作成 # windowクローズ時のシグナル $window->signal_connect(delete_event => sub { Gtk2->main_quit; return FALSE; }); $moz->signal_connect(net_stop => \&on_net_stop); # データダウンロード後のシグナル $window->set_title("MyBrowser"); $window->set_default_size(600,400); # ウィンドウサイズ $window->add($moz); $window->show_all(); $moz->load_url("http://gtk2-perl.sf.net"); # 接続先URL Gtk2->main; # メインループへ } # データダウンロード後の処理 # すぐにキャプチャすると描画されていないのでタイマーで1秒待つ sub on_net_stop { my $self = shift; Glib::Timeout->add(1000,sub { capture($self) }); } # キャプチャメソッド sub capture { my $moz = shift; my ($x,$y,$w,$h,$depth) = $moz->window->get_geometry(); my $pixbuf = Gtk2::Gdk::Pixbuf->new("GDK_COLORSPACE_RGB",FALSE,8,$w,$h); $pixbuf->get_from_drawable($moz->window,$moz->window->get_colormap,0,0,0,0,$w,$h); $pixbuf->save("screen.png","png"); print "Captured!!\n"; Gtk2->main_quit(); return FALSE; }
このサンプルはGtk2を使うので当然X環境が必要になります。X環境が構築されているなら問題ありませんが、Xを導入していないようなサーバで使う場合はXvfb(X Virtual Frame Buffer)を使います。
# Xvfb :1 -screen 0 1024x768x24 & <-- rootでXvfbスクリーンを作成する $ setenv DISPLAY :1.0 <-- cshの場合 $ perl captest.pl
これでscreen.pngという名前でキャプチャされます。コマンドラインで便利に使いたい場合はURLとファイル名を指定できるようにすればおっけー。
- 参考
- Gtk2-Perl Home -- http://gtk2-perl.sourceforge.net/