hideden.hatenablog.com

はてなぶろぐー。URLなげー。

PerlでWindows操作。(OLEオートメーション編)

Perlを使い出すと結構なんでもPerlでやりたくなる。ま、楽だし。でも結構、Windows上でスクリプトのテストや簡単な計算以外で使ってる人ってあんまり見ない気がする。って事で、何気に結構CPAN上にいっぱいあるWin32モジュール群の一部を紹介でもしてみようかなと。とりあえず、まずはOLE*1を使ってIEの自動操作でもやってみよう。


IE操作は、WSH*2などを利用しているのはたまに見かけるが、Perlに慣れたからにはPerlでやってみたい。使うモジュールはWin32::OLE。まぁ、Win32::IE::Mechanizeなんてのもあって、こっちを使う方が圧倒的に楽なんだけど、とりあえずは標準でActivePerlに入ってるWin32::OLEを使ってやってみることにする。

use Win32::OLE;

my $ie = Win32::OLE->new('InternetExplorer.Application');

っとすることで、IEのOLEオートメーションObjectが$ieに入り、新しくIEの窓が開く。今後のIEに対する操作はすべてこれを介して行う。とりあえず、はてなのTOPページでも開いてみる。

$ie->Navigate( { URL=> 'http://www.hatena.ne.jp/' } );

とすれば、先ほど開いた窓にはてなのTOPページが表示される。

めでたしめでたし。



・・・ってさすがに手抜きすぎな気がするので、もうちょっと詳しく。$ieは、どうやらIWebBrowser2インターフェースが持っているメソッドを持ってる。(多分)なので、IWebBrowser2のメソッドについてMSDNで調べてみると、IWebBrowser2はこのようになっている。これを見るとわかるように、結構なんでも出来る。引数はハッシュのリファレンスを渡す。

メソッド名 動作 引数
Navigate URLを表示する。 URL => url, Headers => ヘッダ文字列
PostData => POSTデータ, TargetFrameName => ターゲット
Stop 読み込みを中止する。 なし
GoForward 進む なし
GoBack 戻る なし
Refresh リロード なし
Document Documentオブジェクトを取得 なし

などが使える。詳しくはMSDNで。

Documentオブジェクトは、JavaScriptのDocumentとほぼ同じ。

my $doc = $ie->Document;
for ( my $i=0; $i < $doc->all->length; $i++ ){
    my $obj = $doc->all($i);
    if ( $obj->tagName eq 'A' ){
         print "url : " . $obj->src . "\n";
         print "text: " . $obj->innerHTML . "\n";
    }
}

のような事が出来る。この辺の詳細はJavaScriptの解説サイトなどを参考にするといいと思う。OLEオートメーションは、Excelなどでも可能なので、(使い道があるのかどうかは謎だが)バッチ処理を書きたいときには便利かもしれない。




   

*1:Object Linking and Embedding. Windows上のアプリケーション間でデータを転送・共有するための仕組み。

*2:Windows Script Host. JScriptVBScriptなどでバッチ処理をしたりできる。***.vbsって形でWindowsカスタマイズサイトなんかでスクリプトが配布されてるのを見かけたりもする。WSHPerlを使ったりする事も出来るらしい。