かんたん作成【HTML CSS JavaScript PHP CGI Perl Ruby Python .htaccess】

アクセスログ集計

#! /usr/local/bin/perl

$CHARSET    = 'Shift_JIS';
$LOGFILE    = './dat/log.dat';        # ログ保存ファイル名

loadForm();                # フォームデータ取り込み
print qq(Content-type: text/html; charset=$CHARSET\n\n);
print <<END;
    <html>
    <head>
    <title>アクセスログ集計</title>
    </head>
    <body>
    <table width="100%" style="font-size:12px">
    <tr>
        <th><a href="$ENV{'SCRIPT_NAME'}">アクセス数</a></th>
        <th><a href="$ENV{'SCRIPT_NAME'}?mode=hour">時間別</a></th>
        <th><a href="$ENV{'SCRIPT_NAME'}?mode=wday">曜日別</a></th>
        <th><a href="$ENV{'SCRIPT_NAME'}?mode=cookiecount">訪問回数別</a></th>
        <th><a href="$ENV{'SCRIPT_NAME'}?mode=agent">ユーザーエージェント別</a></th>
        <th><a href="$ENV{'SCRIPT_NAME'}?mode=addr">IPアドレス別</a></th>
        <th><a href="$ENV{'SCRIPT_NAME'}?mode=referer">リンク元別</a></th>
        <th><a href="$ENV{'SCRIPT_NAME'}?mode=log">アクセスログ</a></th>
    </tr>
    </table>
    <hr>
END
printLog();                # アクセスログ集計・表示
print <<END;
    </body>
    </html>
END

exit;

#================================================ アクセスログ集計
sub    printLog
{
    my    ($i, $key);
    my    @wday = ('日', '月', '火', '水', '木', '金', '土');
    open(FILE, "<$LOGFILE");                    # ログファイル読み込み
    eval{ flock(FILE, 1) };
    @LOG = <FILE>;
    close FILE;
    print qq(<table style="font-size:12px">\n);
    if($FORM{'mode'} eq "log") {                    # アクセスログ表示
        print qq(<tr>\n);
        print qq(<th nowrap>カウンター</th>\n);
        print qq(<th nowrap>日時</th>\n);
        print qq(<th nowrap>訪問回数</th>\n);
        print qq(<th nowrap>ユーザーエージェント</th>\n);
        print qq(<th nowrap>IPアドレス</th>\n);
        print qq(<th nowrap>リンク元</th>\n);
        print qq(</tr>\n);
        for($i = 0 ; $i < @LOG ; ++$i) {
            my    ($count, $tm, $agent, $addr, $referer, $cookiecount) = split(/\t/, $LOG[$i]);
            my    ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime $tm;
            $tm = sprintf("%04d/%02d/%02d($wday[$wday]) %02d:%02d",
                    $year+=1900, ++$mon, $mday, $hour, $min);
            $addr =~ tr/[13579]/*/;
            print qq(<tr>\n);
            print qq(<td nowrap>$count</td>\n);
            print qq(<td nowrap>$tm</td>\n);
            print qq(<td nowrap align="center">$cookiecount</td>\n);
            print qq(<td>$agent</td>\n);
            print qq(<td nowrap>$addr</td>\n);
            print qq(<td>$referer</td>\n);
            print qq(</tr>\n);
        }
    }
    else {                                # アクセスログ集計
        for($i = 0 ; $i < @LOG ; ++$i) {
            my    ($count, $tm, $agent, $addr, $referer, $cookiecount) = split(/\t/, $LOG[$i]);
            my    ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime $tm;
            if($FORM{'mode'} eq "") {            # アクセス数集計
                $tm = sprintf("%04d/%02d/%02d($wday[$wday])", $year+=1900, ++$mon, $mday);
                ++$freg{$tm};
            }
            elsif($FORM{'mode'} eq "hour") {        # 時間別集計
                $hour = sprintf("%2d時", $hour);
                ++$freg{$hour};
            }
            elsif($FORM{'mode'} eq "wday") {        # 曜日別集計
                ++$freg{$wday};
            }
            elsif($FORM{'mode'} eq "agent") {        # ユーザーエージェント別集計
                ++$freg{$agent};
            }
            elsif($FORM{'mode'} eq "addr") {        # IPアドレス別集計
                $addr =~ tr/[13579]/*/;
                ++$freg{$addr};
            }
            elsif($FORM{'mode'} eq "referer") {        # リンク元別集計
                ++$freg{$referer};
            }
            elsif($FORM{'mode'} eq "cookiecount") {        # 訪問回数別集計
                $cookiecount = sprintf("%5d回目", $cookiecount);
                ++$freg{$cookiecount};
            }
        }
        if($FORM{'mode'} eq "") {                # 集計結果表示(アクセス数)
            my    ($count) = split(/\t/, $LOG[0]);
            print qq(<tr><td nowrap>総アクセス数</td><td>$count</td><td></td></tr>\n);
            foreach $key (sort {$b cmp $a} keys %freg) {
                print qq(<tr>);
                print qq(<td nowrap>$key</td>);
                print qq(<td align="right" nowrap>$freg{$key}件</td>);
                print qq(<td>);
                print qq(<hr size="10" color="#ff6633" align="left" width="$freg{$key}"></td>);
                print qq(</tr>\n);
            }
        }
        else {                            # 集計結果表示(昇順)
            foreach $key (sort keys %freg) {
                print qq(<tr>);
                if($FORM{'mode'} eq "wday") {
                    print qq(<td nowrap>$wday[$key]曜日</td>);
                }
                elsif($key) {
                    print qq(<td nowrap>$key</td>);
                }
                else {
                    print qq(<td>?</td>);
                }
                print qq(<td align="right" nowrap>$freg{$key}件</td>);
                if($FORM{'mode'} eq "agent" or $FORM{'mode'} eq "referer") {
                    print qq(</tr><tr><td colspan="2">);
                }
                else {
                    print qq(<td>);
                }
                print qq(<hr size="10" color="#ff6633" align="left" width="$freg{$key}"></td>);
                print qq(</tr>\n);
            }
        }
    }
    print qq(</table>\n);
}

#================================================ フォームデータ取り込み
sub    loadForm
{
    my    ($query, $pair);
    if($ENV{'REQUEST_METHOD'} eq 'POST') {
        read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
    }
    else {
        $query = $ENV{'QUERY_STRING'};
    }
    foreach $pair (split(/&/, $query)) {
        my    ($key, $value) = split(/=/, $pair);
        $FORM{$key} = $value;
    }
}
CGI(Perl)
Hello world ! ユーザーエージェント取得・表示($ENV{'HTTP_USER_AGENT'})
IPアドレス取得・表示($ENV{'REMOTE_ADDR'}) リンク元取得・表示($ENV{'HTTP_REFERER'})
URL取得・表示($ENV{'HTTP_HOST'}, $ENV{'REQUEST_URI'}) 環境変数を全て表示(%ENV)
ホスト名取得・表示(gethostbyaddr) 訪問者のプロバイダーを表示
訪問者の都道府県を取得・表示 日付を表示(localtime time)
日付を画像表示(localtime time, substr) アクセス日時を表示(localtime time)
指定の日までの日数を表示 曜日によって背景色を変える
日によって背景色を変える 月によって背景色を変える
見るたびに背景色を変える 見るたびに背景画像を変える
おみくじ(rand, int) カラーチャート
Shift_JIS文字コード表 UTF-8文字コード表
グラフ(横棒グラフ) アクセスカウンター
アクセスカウンター(画像) アクセスカウンター(今日・昨日)
訪問回数(クッキー, $ENV{'HTTP_COOKIE'}, Set-Cookie) アクセスログ保存
アクセスログ集計 パスワード認証
クッションページ($ENV{'QUERY_STRING'}) クッションページ($ENV{'PATH_INFO'})
フォーム入力内容をクッキーに保存 1つのCGIでフレームページを表示
IPアドレスからホスト名を取得(gethostbyaddr) ホスト名からIPアドレスを取得(gethostbyname)
IPアドレスからプロバイダーを取得 IPアドレスから都道府県を取得
文章中の文字列を別の文字列に一括変換 カレンダー
カレンダー(前月・次月へのリンク付) カレンダー(今年1月〜12月)
掲示板 掲示板(URL自動変換/連続改行・スペース削除)
掲示板(年齢・性別・都道府県選択) 画像アップロード掲示板
チャット Web日記
サイトマップ(ディレクトリ内のファイルを調べる) Webデータ取得(HTTPヘッダー, HTMLソース, use Socket)
Webデータ取得(HTTPヘッダー, HTMLソース, use HTTP::Request::Common) トラックバック受信
トラックバック送信 メール送信(メールフォーム, sendmail)
リバーシ(ボードゲーム) .htaccessユーザー認証用ユーザーファイル作成
リダイレクト 条件指定リダイレクト
言語振り分けリダイレクト 条件指定アクセス拒否(ステータスコードを返す)
HTMLファイル読み込み・表示 HTMLファイル読み込み・パスワード認証
HTMLファイル読み込み・条件指定アクセス拒否 HTMLファイル読み込み・条件指定リダイレクト
外部CGIファイル読み込み(require) 画像ファイル読み込み・表示
画像縮小・拡大・サイズ変更(Image::Magick, Resize) 画像切り出し(Image::Magick, Crop)
画像文字埋め込み(Image::Magick, Annotate) 画像合成(Image::Magick, Composite)
画像生成・保存(Image::Magick->new) 画像合成アクセスカウンター
かんたん作成【HTML CSS JavaScript PHP CGI Perl Ruby Python .htaccess】