Firefox web browser - Faster, more secure & customizable

Webブラウザで閲覧しているWebページのスクリーンキャプチャを撮るための機能やエクステンションはすでに数多く登場している。しかし、その多くが手動でスクリーンキャプチャを実施するというもので、自動的に特定のページに接続してそのページのスクリーンキャプチャを撮るといった機能を提供しているものは多くない。

Mozilla Automated Website Screen Grabber - The BuiltWith Blogにおいて、Firefox / XULRunnerを使って、Webページのスクリーンキャプチャを自動的に取得する方法とその成果物「ScreenGrabber 1.0」が紹介されている。Mozilla Automated Website Screen GrabberではXULRunnerを使っているが、Firefox 3以降であれば-appオプションをつけて実行することでプライベートモードのXULRunnerが起動するため、同じようなことができる。また、コードはWindows向けに開発されているが、若干の変更でほかのプラットフォームでも利用できる。

たとえば、まず次のようにスクリーンキャプチャを取りたいサイトのURLを記載したテキストファイルsite-list.txtをホームディレクトリに用意しておく。

google.co.jp
twitter.com
journal.mycom.co.jp/enterprise
journal.mycom.co.jp/keiei

展開したScreenGrabber 1.0に次のパッチを適用する。ここではFreeBSDで利用することを念頭においてパッチをつくってある。

--- chrome/content/mybrowser/mybrowser.js.orig  2010-07-06 16:21:23.000000000 +0900
+++ chrome/content/mybrowser/mybrowser.js       2010-07-06 16:31:13.000000000 +0900
@@ -393,7 +393,7 @@
   ctx.drawWindow(content, 0, 0, w, h, "rgb(255,255,255)");
   ctx.restore();

-  saveCanvas ( canvas, 'c:\\imgout\\' + lines [ pos ].replace ( 'http://','') + '.png' );
+  saveCanvas ( canvas, '/home/daichi/Desktop/' + lines [ pos ].replace ( 'http://','').replace ('/','-' ) + '.png' );


   canvas.style.height = "0px";

次のようにFirefox 3.6を実行してScreenGrabber 1.0を動作させれば、自動的にブラウザが起動して対象となるサイトにアクセスしスクリーンショットを撮って~/Desktop/にPNG画像として保存するようになる。

firefox3 -app application.ini -file ~/site-list.txt

ScreenGrabber 1.0経由で取得したスクリーンショット

ScreenGrabber 1.0経由で取得したスクリーンショット

ScreenGrabber 1.0経由で取得したスクリーンショット

ScreenGrabber 1.0経由で取得したスクリーンショット

Mozilla Automated Website Screen GrabberではScreenGrabber 1.0を開発するにあたって次のような意思決定や技術選択をおこなったことを紹介している。

  • IEベースであれば自動スクリーンキャプチャ機能を実装したものがあるが、セキュリティに対する懸念からIEは採用したくない。FirefoxかChromeが好ましく、ここではXULRunner (Firefox)を採用することにした。
  • 強制ダイアログが表示されるとブラウジングがそこで入力待ちとなり自動化の妨げとなってしまう。ここではXULRunnerの採用と、SeleniumのpromptService.jsをベースに作り替えたものを採用することで強制ダイアログが表示されないようにした。
  • ウィンドウがアクティブになっていないとFlashコンテンツがレンダリングされない。これに関してはVNC Server / VNC Viewer経由で処理を実行することで問題を回避。VNC Viewer経由での接続であればコネクションを切断してもVNC Viewerによって接続が保持され、アクティブな状態で動作させることができる。
  • ページの読み込み完了を待つという操作はいつも成功するとは限らない。このため、最大待ち時間を設定し、その時間内に読み込みが完了していない場合にはスクリーンショットは撮らないようにした。

ScreenGrabber 1.0はApache 2.0ライセンスのもとで提供されている。シンプルな作りになっており、カスタマイズしてさまざまな用途に応用しやすい。こうした処理の自動化を実現するためのテンプレートプロダクトとしても参考になる。ScreenGrabber 1.0は開発段階にあり、プロダクションレベルのアプリケーションとしては公開されていない。