Hatena::ブログ(Diary)

技術日記@kiwanami

2011-03-04

Linux上のChromeで動くCacooエディターにスクリーンキャプチャを貼り付ける

手元のUbuntuマシンでは、Cacooの画面キャプチャ機能が使えません(SunのJava環境でも不可)。画面キャプチャは大変便利なので何とかしようと思い、Chrome拡張のChromeReplを使ってローカルの画像をCacooFlashアプリに送り込むという回避策を考えました。

導入

手元の環境は Ubuntu 10.10 x86_64, Chrome 9.0.597.84 beta, Ruby 1.8.7 です。ChromeRubyapt-getで入る普通のものです。あと、画像キャプチャに ImageMagick(import, identify) も必要です。

この環境に対して ChromeRepl を入れます。以下のサイトを参考にして入れてください。これはサーバーになるChrome拡張と、それと通信するクライアントRuby拡張から成ります。

次に、キャプチャしてCacooに転送するスクリプトを以下からダウンロードして適当なディレクトリに配置します。

使い方

問題なければ、上のスクリプトを適当なキーに割り当てておけば便利に使えます。

問題が起きるとすれば、何か足りないコマンドがあるとか、Chromeのポートにアクセスできないとか、そういう感じだと思います。Rubyを実行したときに出るエラーメッセージを確認してみてください。

動作解説

スクリプトは非常にシンプルなので、何をしているかはすぐに分かると思います。

  • importで画面をキャプチャしてPNGで保存
  • 画像のサイズをidentifyで取得
  • base64で画像ファイルを文字列に変換
  • ChromeReplで現在のタブのグローバル関数にアクセス
  • Flashのcapture関数に画像のデータを渡す

適当に改造することで、ローカルの画像を連続してアップロードするなどに使えるのではないかと思います。

調査

キャプチャアプリFlashがどう通信しているかを調べた(JSのコード眺めたり、jarを逆コンパイルするなど)ところ、PNGを塩無しでBASE64テキストに変換してFlashに渡しているということが分かったので、あとはそれを実現する方法を素直に持ってきました。

JSは難読化されてない限り読むといろいろ分かっておもしろいです。また、Javaについても逆コンパイルしてコードを読むのは知っておくと役に立つことが多いと思います。(もちろんEULAの関係もありますが)

ちなみに、今回の要件はたまたま素直に出来ましたが、JavaFlashの通信の仕方によっては難しくなっていたと思います。

ローカルとWebの接続

ChromeReplによってローカルアプリとWebアプリをつなぐことが出来ます。ブラウザの操作だけでなく、表示されているコンテンツの取得や操作が可能です。ChromeReplはChrome拡張の中でEvalしているだけのような感じなので、Chrome拡張の豊富なドキュメントを読むと良いと思います。

似たものに MozRepl などもありますので、Firefoxでも似たようなことは出来ると思います。

あと、セキュリティについては気をつける必要があると思います。細かいところをつっこむといろいろあると思いますので、今回のスクリプトではCacooで図を貼りたいときだけChromeReplを有効にするような使い方にすると話が早いと思います。

無保証

この方法の公開についてCacoo中の人には了解は取ってありますが、サポートされていない使い方ですので、動作や損害については無保証です。あしからず。

コロネコロネ 2011/03/27 12:52 いつもブログを見るのを楽しみにしています^-^ 更新されるのが楽しみです(^^♪

kiwanamikiwanami 2011/03/27 13:10 ありがとうございます! また、ちょっと長い記事を書いています。。。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/kiwanami/20110304/1299261511
Connection: close