ひらい ぶらり Hi-Library

ぷろぐらみんぐについて。ときどきどうでもいいことについて。

携帯ゲートウェイのIPアドレス帯域の変更を監視する

タイトルのようなことがしたくて色々調べていると、Perlのモジュールに
Net::CIDR::MobileJP
ってのがあって、この中に各キャリアのIPアドレス帯域がのってるHPをスクレイピングするスクリプトが含まれている・・・ってことがこちら

http://dsas.blog.klab.org/archives/51117561.html

に書いてありました。

どうやらこの中に含まれる
net-cidr-mobilejp-scraper.pl
というファイルがスクレイピングしているようです。

Perlはまったく詳しくないので先程のサイトに載せてあったスクリプトをそのまま使おうとしたところ、
Net::CIDR::MobileJP::Scraper::*
がないよ、と怒られてしまいました。
ぱっと探したところ見当たらない。
Perlは詳しくないので(2回目)ソースを読んでもよくわからないので、スクレイピングをしているであろう処理のところだけ修正してみることにしました。

net-cidr-mobilejp-scraper.plを見ると、実際にスクレイピングをしているのは
WWW::MobileCarrierJP
というモジュールで、他にも色々なデータが取れるみたいですが、今回はCIDRのみ。
ん?ってことはNet::CIDR::MobileJPはいらないのかな?
Net::CIDR::MobileJPはどうやらスクレイパーではなく、ipアドレスを渡してそれが携帯のIPアドレスかどうかを判断してくれるモジュールだったみたいです。勘違い。
よってスクレイピングするだけならWWW:MobileCarrierJPだけで十分・・・なハズ。

気をとりなおしてWWW::MobileCarrierJPをインストール。
http://dsas.blog.klab.org/archives/51117561.html
こちらのソースをいじった部分は以下のようなな感じ、

#==================================
#   略
#==================================

use WWW::MobileCarrierJP 0.19;
use WWW::MobileCarrierJP::DoCoMo::CIDR;
use WWW::MobileCarrierJP::EZWeb::CIDR;
use WWW::MobileCarrierJP::AirHPhone::CIDR;
use WWW::MobileCarrierJP::ThirdForce::CIDR;

#==================================
#   略
#==================================

# name of WWW::MobileCarrierJP::*::CIDR
Readonly my @CARRIER => qw(DoCoMo EZWeb ThirdForce);

#==================================
#   略
#==================================

		  for my $carrier (@CARRIER) {
### start: $carrier
			  my $result;
                          my @cidrs;
			  my $class = "WWW::MobileCarrierJP::${carrier}::CIDR";
			  $result = $class->scrape;
                          # スクレイピング
                          $result = $class->scrape;
                          # スクレイピングした結果をCIDR形式の文字列にして格納
                          for (@$result) {
                              my %val = %$_;
                              my $cidr = $val{ip} . $val{subnetmask};
                              push(@cidrs, $cidr);
                          }

			  my $cidr_new = \@cidrs;
			  my $cidr_old;
			  if (-r "${STORE_DIR}/${carrier}.yaml") {
				  $cidr_old = YAML::LoadFile("${STORE_DIR}/${carrier}.yaml");
			  } else {
				  $cidr_old = ['NO DATA'];
			  }
#==================================
#   略
#==================================

softbankは第三勢力らしい。
Net::CIDR::MobileJPでやってたところを、WWW::MobileCarrierJPで行ってるだけ

追記:ちょっと雑にいじり過ぎたので後日ちゃんと修正したものをうpします。
   Array::Diffがこのままじゃ反応しない

追記(2010-11-01): ArrayDiffはちゃんと配列でないと動いてくれないので、WWW::MobileCarrierJPを使った場合は結果がハッシュで帰ってくるのでそれを文字列にして配列に格納する処理を挟みました