WWW::MechanizeモジュールによるWebアクセスの自動化UNIX処方箋

最新のハードウェアやソフトウェアにかんするニュースもいいけれど、「事件は枯れたシステムが稼働する現場で起こってるんだ」と現場ですぐに役立つ知識を欲するあなたへ贈る珠玉のTips集。今回は、Perlスクリプトを用いたWebアクセスの自動化だ。

» 2007年09月25日 00時00分 公開
[ITmedia]

郵便番号検索などが行えるWebサイトをよく利用します。ただ、毎回Webブラウザで項目を入力して検索するのは面倒なので、スクリプトなどを利用したいと考えています。どのように実現したらよいでしょうか?


 一般的なCGIに対しては、Perlスクリプトなどを用いると簡単に検索できます。ここでは、「MACアドレスのベンダーコード検索」サービス用のスクリプトとして、WWW::Mechanizeモジュールを利用したoui-search.plを紹介します(リスト1)

 なおシステムには、PerlおよびWWW::Mechanizeモジュールを事前にインストールしてください。WWW::Mechanizeモジュールは依存するものが複数あるので、CPANモジュールを利用すると簡単に導入できます。


# perl -MCPAN -e shell
cpan> install WWW:Mechanize


 1 #!/usr/bin/perl -w
 2
 3 use strict;  4 use WWW::Mechanize;  5
 6 unless($ARGV[0] =~ m/^[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}$/i)  7 {  8         print("ERROR: Invalid argument.\n");  9         print(" ex\) $0 08-00-20\n"); 10         exit(1); 11 } 12
13 my $url = 'http://standards.ieee.org/regauth/oui/index.shtml'; 14 my $agent = WWW::Mechanize -> new(); 15 $agent -> get($url); 16 $agent -> field("x", $ARGV[0]); 17 $agent -> submit_form(form_number => "1"); 18
19 print("IEEE OUI Company_id\n"); 20 print("-------- -----------------------\n"); 21 if($agent -> content =~ m/(?:[0-9A-F]{6})\s+\(base 16\)\s+(.+)/) 22 { 23         print("$ARGV[0] $1\n"); 24 } 25 else 26 { 27         print("$ARGV[0] NOT FOUND\n"); 28 } 29
30 exit(0);
リスト1 oui-search.pl

oui-search.plの実行と内容

 oui-search.plを実行する際は、引数としてMACアドレスのベンダーコードを指定します。例えば、「08-00-20」を指定すると、


% ./oui-search.pl 08-00-20
IEEE OUI  Company_id
--------  -----------------------
08-00-20  SUN MICROSYSTEMS INC.

のように表示されます。ここで、存在しないコードを指定した場合は、


% ./oui-search.pl 08-00-dd
IEEE OUI  Company_id
--------  -----------------------
08-00-dd  NOT FOUND

と「NOT FOUND」が表示されるので注意してください。

 oui-search.plの内容を見てみると、まず6行目で引数の型チェックを行っています。14行目でインスタンスを生成し、15行目で指定URLへアクセスします。16行目では、「x」というテキストフィールドに対して、引数で与えられたベンダーコードを入力しています。最後に17行目で[Submit]ボタンを押し、検索を実行します。そして21行目では、検索結果表示ページの内容からベンダー名を抜き出し、23行目で標準出力へ表示させています。

プロキシサーバーを利用した応用

 このように、WWW::Mechanizeモジュールを利用すれば、Web経由での管理インタフェースしか持たないネットワーク機器などのメンテナンスが容易になります。例えば、「cronで定期的にスクリプトを実行し、ステータス表示画面からデータを抜き出して管理者にメールする」という操作も実現できるわけです。

 スクリプトを作成するうえで面倒なのが、HTMLソースコードからフォームの名称や値の入力方法を調べる部分だと思います。これについては、HTTP::Recorderモジュールを用いることで、スクリプト主要部分のひな形を生成させることが可能です。例えば、HTTP::ProxyモジュールとHTTP::Recorderモジュールを利用して簡易プロキシサーバーrecord-http.plを作成し(リスト2)、Webブラウザでのアクセスを経由注5させることで、HTTP通信の内容(Webブラウザから送信された内容の主要部分)を取得できます(実行例1)


#!/usr/bin/perl -w

use strict; use HTTP::Proxy; use HTTP::Recorder;
my $proxy = HTTP::Proxy -> new(); my $agent = HTTP::Recorder -> new (         file            => "/tmp/myagent",         showwindow      => 0 ); $proxy -> agent($agent); $proxy -> start();
1;
リスト2 record-http.pl

# ./record-http.pl & ←Webブラウザでベンダーコード検索を実行
# cat /tmp/myagent
$agent->get("http://standards.ieee.org/regauth/oui/
index.shtml");
$agent->field("x", "08-00-20");
$agent->submit_form(form_number => "1");

実行例1 record-http.plによるHTTP通信内容の取得

 JavaScriptを利用している場合など、一部のWebページでは正常に記録されないことがありますが、この内容をカスタマイズすることで、HTMLソースコードを参照することなしに、WWW::Mechanizeモジュールを利用したスクリプトの作成が可能になります。

関連キーワード

Perl | CGI


Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ