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/
