サーバ処理でwebページをキャプチャし、サムネイル化する方法は最近では珍しくない技術だけど、最近試してみたのでメモ。
キャプチャはImageMagickを使ってスクリーンショットを取るのが王道ですが、今回PageSaverというFireFoxアドオンのキャプチャソフトを使いました。
PageSaverはアドオンながらコマンドラインから実行できる優れ物。
ImageMagickでimportしてゴリゴリ画像加工するのもいいですが、このアドオンを使えば、縮尺、位置指定、画像フォーマット指定、さらにはFTP転送までもがコマンド一発でできちゃいます。
但しコマンドラインからの主要な機能は$15の有償版のみ使用できます。
でも安い。
以下 インストールめも。
前提 OS CentOS5.2 アーキ i386 Xvfb (仮想フレームバッファ) firefox 3.0(ブラウザ) PageSaverPro (firefoxアドオン)
Contents
インストール関連
以下、root権限で実行します。
コマンドは#で表してます。
Xvfb インストール
# yum groupinfo "X Window System" # yum upgrade xorg-x11-xfs # yum upgrade xorg-x11 # yum upgrade xorg-x11-devel # yum upgrade xorg-x11-libs # yum groupupdate "X Window System" # yum upgrade xorg-x11-libs # yum install xorg-x11-server-Xvfb
FireFoxのインストール(現在リポジトリは3.0.11になっているようです)
# yum install firefox
・キャプチャ用にプロファイルをカスタムします
~/.mozilla/firefox/xxxxxxx.default/pref.js をエディタで編集します
※xxxxx部分は自動で設定された乱数になります。
以下を追加します
user_pref("browser.sessionstore.enabled", false); user_pref("browser.sessionstore.resume_from_crash", false); user_pref("browser.startup.page", 0); user_pref("plugin.default_plugin_disabled", false); user_pref("privacy.popups.disable_from_plugins", 3); user_pref("alerts.totalOpenTime", 1); user_pref("security.enable_ssl2", false); user_pref("security.enable_ssl3", false);
前回の復元やクラッシュレポートのダイアログ等の
邪魔になる部分を設定してます。
pref.jsを編集しましたが、本当はuser.jsを新規作成して
上記を記述する方が望ましいらしいです。
パラメータ等の詳細はこちらを参考
http://firefox.geckodev.org/index.php?user.js
Flashプラグインのインストール
# yum install flash-plugin
PageSaverのイントール
# firefox -install-global-extension "pagesaverpro-2.1.xpi" 1
構築手順は以上です。
キャプチャ手順
1. 環境変数を追加
# export DISPLAY=":1.0"
2. Xvfb をデーモンで起動
# /usr/bin/Xvfb :1 -screen 0 1024x1024x24 &
サイズは任意です
3. firefoxをデーモンで起動
# /usr/bin/firefox -display :1 -width 1024 -height 1024 &
サイズは任意です
参考;firefox command line
http://kb.mozillazine.org/Command_line_arguments
4. PageSaverで秘密の花園を盗撮。
# firefox -saveimage http://hogehoge.jp/ -saveas "/tmp/sample.jpg" -captureflash
URLと保存先は任意の文字列です。
PageSaverのドキュメント
http://pearlcrescent.com/products/pagesaver/doc/
のcommand lineの項を参照
キャプチャ手順は以上
考察
- 実際にはキャプチャ手順の1~3を常駐プロセスにさせ、WebAPIとするケースは外部コマンドをキックするモジュールを各Action側でコールする感じかなと。
- 3について、懸念点があり、4でURLを流し込むとfirefox自体は過去開いたページはそのままに、新しいURLを新規タブで開いているかもしれません。その場合、常駐し続けるとメモリ消費が大きくなる可能性があります。連続でキャプチャし続けてfirefoxプロセスのメモリ状況を監視して確認する必要がありそうです。
- 上記の場合、キャプチャを取得する度にfirefoxの起動停止が必要かもしれません。
- PageSaverがキャプチャ後、標準エラー出力にステータスを出力するのでエラーのハンドリングが可能かもしれません。ただ、ステータス出力はコマンドが終了後,遅れて出力されている(コマンド非同期)のでそこら辺はファイルなりにパイプが必要かも。
さっさとWebAPI公開しなきゃ。
次のエントリはPlaggerについて調査してみようと思う