アクセス規制情報取得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;
}
