アクセス規制情報取得CGI「またかよ」
投稿:2010-04-22
2ちゃんねるの「まだかな」は全プロバイダの規制情報を表示するため、ベクたん(vectant.ne.jp)の情報を探すのが一苦労です。
ベクたんは、他のプロバイダに回線を貸しているので、規制の頻度が多く、自分のプロバイダ以外でベクたんの規制情報を把握したい場合に
個数が2桁になることもあるので手間がかかります。
その辺の事情はVectantのホスト名をご覧ください。
ベクたんズ(Vectantから回線を借りたプロバイダの会員)がアクセス規制を容易に参照できるCGI「またかよ」を作成しました。
上のリンクに規制情報の一覧を入れていますけれど、実はそれが「またかよ」です。
CGIのソースはこちら。
CGIのソースはこちら。
#!/usr/bin/perl -w use LWP::UserAgent; $| = 1; $htmlcache = '/home/olfa/www/matakayo.html'; my $SEM_UNDO = 0x1000; my $IPC_KEY = 1234; my $id = semget($IPC_KEY, 0, 0); my $semop = pack("sss", 0, -1, $SEM_UNDO); semop($id, $semop); my @outhtml = get_html(); foreach $item (@outhtml) { print "$item\n"; } $semop = pack("sss", 0, 1, $SEM_UNDO); semop($id, $semop); sub get_html { my @outhtml = (); if ((stat($htmlcache))[9] + 60 < time()) { @outhtml = create_html(); if (open(OUTHTML, '>' . $htmlcache)) { foreach $item (@outhtml) { print OUTHTML "$item\n"; } close(OUTHTML); } } elsif (open(OUTHTML, '<' . $htmlcache)) { @outhtml = <OUTHTML>; close(OUTHTML); chomp(@outhtml); } else { sleep(10); @outhtml = create_html(); } return @outhtml; } sub create_html { my @outhtml = out_head(); my @kisei_list = get_kisei_list(); my %vectant_list = filter_vectant(@kisei_list); my @sorted_rex = sorted_key(\%vectant_list); foreach $item (@sorted_rex) { my $date_stamp = $vectant_list{$item}{'date'}; push(@outhtml, "<TR><TD>$date_stamp</TD><TD>$item</TD></TR>"); } push(@outhtml, out_tail()); return @outhtml; } sub out_head { my($second, $minute, $hour, $day, $month, $year) = localtime(); $month++; $year += 1900; $month = sprintf("%02d", $month); $day = sprintf("%02d", $day); $hour = sprintf("%02d", $hour); $minute = sprintf("%02d", $minute); $second = sprintf("%02d", $second); my @outhtml = <<"EOL"; Content-type: text/html <HTML> <BODY> <TABLE BORDER="1"> <CAPTION>matakayo.cgi for Vectant at $year/$month/$day $hour:$minute:$second</CAPTION> <TR><TH>Date</TH><TH>Rex Pattern</TH></TR> EOL chomp(@outhtml); return @outhtml; } sub out_tail { my @outhtml = <<'EOL'; </TABLE> </BODY> </HTML> EOL chomp(@outhtml); return @outhtml; } sub get_kisei_list { my $ua = LWP::UserAgent->new; my $req = HTTP::Request->new(GET => 'http://qb6.2ch.net/_403/madakana.cgi'); $req->header('Accept' => 'text/html'); my $res = $ua->request($req); my @kisei_list = (); if ($res->is_success) { @kisei_list = split(/\n/, $res->content); } return @kisei_list; } sub filter_vectant { my %vectant = (); my $kisei_start = 0; my $date_stamp = ''; foreach $linebuff (@_) { if ($linebuff =~ /#########/) { $kisei_start = 1; } elsif (!$kisei_start) { } elsif ($linebuff =~ m#(\d+)/(\d+).*http://#) { $date_stamp = sprintf("%02d/%02d", $1, $2); } elsif ($linebuff =~ /^#/) { } elsif ($linebuff =~ /vectant/) { $linebuff =~ s/<[^>]*>//g; $vectant{$linebuff}{'date'} = $date_stamp; } } return %vectant; } sub sorted_key { my $kisei = shift(@_); my @rex_pattern = sort {$kisei->{$b}{'date'} cmp $kisei->{$a}{'date'}} keys(%$kisei); return @rex_pattern; }