Linux上のChromeで動くCacooエディターにスクリーンキャプチャを貼り付ける
手元のUbuntuマシンでは、Cacooの画面キャプチャ機能が使えません(SunのJava環境でも不可)。画面キャプチャは大変便利なので何とかしようと思い、Chrome拡張のChromeReplを使ってローカルの画像をCacooのFlashアプリに送り込むという回避策を考えました。
導入
手元の環境は Ubuntu 10.10 x86_64, Chrome 9.0.597.84 beta, Ruby 1.8.7 です。ChromeもRubyもapt-getで入る普通のものです。あと、画像キャプチャに ImageMagick(import, identify) も必要です。
この環境に対して ChromeRepl を入れます。以下のサイトを参考にして入れてください。これはサーバーになるChrome拡張と、それと通信するクライアントのRuby拡張から成ります。
次に、キャプチャしてCacooに転送するスクリプトを以下からダウンロードして適当なディレクトリに配置します。
- https://gist.github.com/835946 / chrome-cacoo-local-capture.rb
使い方
- ChromeをChromeRepl付きで起動します。
- Cacooにログインして新規図のエディターを起動します。
- 「画面キャプチャ」のアイコンをクリックしてキャプチャ用のアプレットを一度起動してすぐ閉じます。
- この操作は、エディターを立ち上げたときに1回だけ必要です。(将来無くなると便利ですね)
- 先ほどダウンロードしたスクリプトを実行して、適当なウインドウをクリックします。
- うまくいけばCacooのエディターにクリックしたウインドウの絵が貼り付きます。
問題なければ、上のスクリプトを適当なキーに割り当てておけば便利に使えます。
問題が起きるとすれば、何か足りないコマンドがあるとか、Chromeのポートにアクセスできないとか、そういう感じだと思います。Rubyを実行したときに出るエラーメッセージを確認してみてください。
動作解説
スクリプトは非常にシンプルなので、何をしているかはすぐに分かると思います。
- importで画面をキャプチャしてPNGで保存
- 画像のサイズをidentifyで取得
- base64で画像ファイルを文字列に変換
- ChromeReplで現在のタブのグローバル関数にアクセス
- Flashのcapture関数に画像のデータを渡す
適当に改造することで、ローカルの画像を連続してアップロードするなどに使えるのではないかと思います。
調査
キャプチャアプリとFlashがどう通信しているかを調べた(JSのコード眺めたり、jarを逆コンパイルするなど)ところ、PNGを塩無しでBASE64テキストに変換してFlashに渡しているということが分かったので、あとはそれを実現する方法を素直に持ってきました。
JSは難読化されてない限り読むといろいろ分かっておもしろいです。また、Javaについても逆コンパイルしてコードを読むのは知っておくと役に立つことが多いと思います。(もちろんEULAの関係もありますが)
ちなみに、今回の要件はたまたま素直に出来ましたが、JavaとFlashの通信の仕方によっては難しくなっていたと思います。
ローカルとWebの接続
ChromeReplによってローカルアプリとWebアプリをつなぐことが出来ます。ブラウザの操作だけでなく、表示されているコンテンツの取得や操作が可能です。ChromeReplはChrome拡張の中でEvalしているだけのような感じなので、Chrome拡張の豊富なドキュメントを読むと良いと思います。
似たものに MozRepl などもありますので、Firefoxでも似たようなことは出来ると思います。
あと、セキュリティについては気をつける必要があると思います。細かいところをつっこむといろいろあると思いますので、今回のスクリプトではCacooで図を貼りたいときだけChromeReplを有効にするような使い方にすると話が早いと思います。
無保証
この方法の公開についてCacooの中の人には了解は取ってありますが、サポートされていない使い方ですので、動作や損害については無保証です。あしからず。