[僕] HTML に書かれたメルアドをエンティティ化する。

僕ト云フ事

たろマークはてなブックマーク

2005年02月22日

[perl][script] HTML に書かれたメルアドをエンティティ化する。

ちょっと、必要になって書いたスクリプトをまた無駄に公開。
HTMLに書かれたメルアドの
@ を @ に
. を . に変換するスクリプト。

MT みたいに、ツール側がやってくれてれば必要ありません。
#というか、メルアド収集ロボットってこのくらいで欺けるもんかな^^;

#!/usr/bin/perl

#-----------------------------------------------------------#
# 指定したディレクトリにある HTML ファイル内に記述された
# メールアドレスを HTML エンティティ化する。
# $Id: entities.pl,v1.0 2005/02/28 19:46:09 taro Exp $
#-----------------------------------------------------------#
use strict;
use warnings;

use File::Find;
use Storable;

my $cache = 'cache.db';
my @reject = qw(threads thrd maillist mail);


my $path = shift or die "usage: $0 <DIR PATH>";
if ( $path !~ m#/$# ) { $path .= '/'; }
unless ( -d $path ) { die "$path is not directry"; }

my @list;
find sub {
	if ( -f && /(.*)\.html$/ ) {
		push(@list,$File::Find::name);
	}
}, $path;

my $list = read_cache( $cache, \@list );

my $num = @$list;

my ( $i, $success, $err ) = (0, 0, 0);
while ( $i < $num ) {
	my $file = $list->[$i];
	
	if ( my $err_msg = entities($file) ) {
		print $file . " ... err($err_msg)\n";
		$err++;
	} else {
		print $file . " ... ok\n";
		$success++;
	}
	
	$i++;
}

write_cache($cache, $list, \@reject);

print <<EOF;
+-----------------------------------+
| * $path
|   - total   $num files
|   - success $success files
|   - error   $err files
+-----------------------------------+
EOF

#-----------------------------------------------------------#
# エンティティ化する。
#-----------------------------------------------------------#
sub entities {
	my $file = shift;
	my $data;
	if ( open ( HTML, "+< $file" ) ) {
		flock(HTML, 2);
		
		my $data;
		while( <HTML> ) {
			my $line = $_;
			$line =~ s/\@/@/g;
			$line =~ s/\././g;
			$data .= $line;
		}
		
		seek(HTML, 0, 0);
		print HTML "$data\n";
		truncate(HTML, tell(HTML));
		close(HTML);
		return undef;
	} else {
		return $!;
	}
}

#-----------------------------------------------------------#
# キャッシュ読み取り
#-----------------------------------------------------------#
sub read_cache {
	my ($cache, $list) = @_;
	if ( -f $cache ) {
		my $list_cache = retrieve($cache);
		
		my $new = reject_arrey($list, $list_cache);
		
		return $new;
	} else {
		return $list;
	}
}

#-----------------------------------------------------------#
# キャッシュ書き込み
#-----------------------------------------------------------#
sub write_cache {
	my ($cache, $list, $reject) = @_;
	
	my $new = reject_arrey($list, $reject);
	
	if ( -f $cache ) {
		my $list_cache = retrieve($cache);
		
		push ( @$list_cache, @$new );
		store $list_cache, $cache;
	} else {
		store $new, $cache;
	}
}

#-----------------------------------------------------------#
# 配列から、指定した要素を取り除く
#-----------------------------------------------------------#
sub reject_arrey {
	my ($arrey, $reject) = @_;
	my $num_reject = @$reject;
	my $num = @$arrey;
	
	my ($i, $j, $flag) = (0, 0, 0);
	my @new;
	
	if ( !$num_reject ) { return $arrey; }
	
	while ( $i < $num ) {
		while ( $j < $num_reject ) {
			if ( $arrey->[$i] =~ /$reject->[$j]/g ) {
				$flag = 1;
				last;
			}
			$j++;
		}
		$j = 0;
		
		push(@new, $arrey->[$i]) if !$flag;
		
		$flag = 0;
		$i++;
	}
	return \@new;
}

んで、entities.pl とか名前付けて保存して、

$ ./entities.pl /path/to

って起動すると自動的に指定したディレクトリ以下にある、HTML ファイルを探して一気に変換してくれる。
一度変換したファイル名をキャッシュしてるので、もう一度走らせても、一度変換処理した HTML は無視します。

機能追加修正 2005/02/28
一度しか変換されないと困るファイルがあったので、 15行目の配列にキャッシングしたくないファイル名のキーワードを入れとくとキャッシングしないようにした。(正規表現でマッチ)

トラックバック

このエントリーのトラックバックURL:
http://vkgtaro.jp/cgi-bin/mt/mt-tb.cgi/370

コメント

# Kaney (2005年02月24日 21:30)

>#というか、メルアド収集ロボットってこのくらいで欺けるもんかな^^;

確かに見破ってちゃんと収集するものもありますが、そこそこの収集防止効果はありますよ。

# 海賊たろ [TypeKey Profile Page] (2005年02月25日 01:53)

コメント、どもです(o'∇')
なるほどなるほど~。
ヤッパリ、見破れますよね^^;
まぁ、やらないよりはやっておけ~って感じですね~。

コメントを投稿