#!/usr/bin/perl
#┌─────────────────────────────────
#│ Lime Counter v1.8 (2003/6/14)
#│ Copyright (c) KentWeb 2003
#│ webmaster@kent-web.com
#│ http://www.kent-web.com/
#└─────────────────────────────────
$ver = 'LIME COUNTER v1.8';
#┌─────────────────────────────────
#│ [注意事項]
#│ 1. このスクリプトはフリーソフトです。このスクリプトを使用した
#│ いかなる損害に対して作者は一切の責任を負いません。
#│ 2. 設置に関する質問はサポート掲示板にお願いいたします。
#│ 直接メールによる質問は一切お受けいたしておりません。
#└─────────────────────────────────
#
# [ 1. ページカウンタの使い方 ] : 1-2.の使い方を推奨
#
# 1-1. タグの記述例 (1) ページのURLは自動で取得する場合
#
#
# 1-2. タグの記述例 (2) ページのURLを手動で指定する場合
#
# (注:タグは実際には改行しないで下さい)
#
# 注:・1-2. のタグ記述例は見やすくするためにわざと2行にして書いて
# いますが、実際には改行せずに「1行で」記述してください。
# ・「PAGENAME」の部分は半角英数字(日本語不可)で記述。
# ・ page=1 の 1 の数値はページ毎に必ず変えてください。
#
# 1-3. アクセス一覧集計の閲覧例
# http://www.xxx.xxx/~user/cgi-bin/limemgr.cgi
#
#---------------------------------------------------------------------
#
# [ 2. ダウンロードカウンタの使い方 ] : 2-2.の使い方を推奨
#
# 2-1. タグの記述例 (1) ページのURLは自動で取得する場合
#
# DATA.LZH
#
# 2-2. タグの記述例 (2) ページのURLを手動で指定する場合
# DATA.LZH
# (注:タグは実際には改行しないで下さい)
#
# 注:・タグ記述例は見やすくするためにわざと2行に書いていますが、
# 実際に記述する場合には改行せずに「1行で」記述してください。
# ・「FILENAME」の部分は半角英数字(日本語不可)で記述。
#
# 2-3. アクセス一覧集計の閲覧例
# http://www.xxx.xxx/~user/cgi-bin/limemgr.cgi
#
#---------------------------------------------------------------------
#
# [ 3. チェックモードの使い方 ]
#
# 3-1. http://www.xxx.xxx/~user/cgi-bin/lime.cgi?mode=check
# mode=checkという引数を付けてブラウザから指定する
#
#---------------------------------------------------------------------
#
# [ 4. 設置例 ]
#
# public_html / index.html
# |
# |
# +-- cgi-bin / lime.cgi [755]
# | lime.log [666]
# | limemgr.cgi [755]
# | jcode.pl [644]
# |
# +-- lock [777] /
#
#---------------------------------------------------------------------
#============#
# 設定項目 #
#============#
# ログファイル名
$logfile = './lime.log';
# ファイルロック機構
# 0 : しない
# 1 : する (symlink関数式)
# 2 : する (mkdir関数式)
$lockkey = 0;
# ロックファイル
$lockfile = './lock/lime.lock';
# IPチェックによる重複カウント防止 (0=no 1=yes)
$ip_chk = 0;
# ダウンロード形式(ダウンロードカウンタとして使用する場合のみ)
# → Locaionヘッダの使えないサーバは「2」とする
# 1 : Locationヘッダ
# 2 : METAタグ
$get_file = 1;
# METAタグジャンプの待ち秒数(ダウンロードカウンタとして使用する場合のみ)
# → 上記設定で「2」とした場合のみ
$wait = 1;
#============#
# 設定完了 #
#============#
$buf = $ENV{'QUERY_STRING'};
foreach (split(/&/, $buf)) {
($key, $val) = split(/=/);
$val =~ tr/+/ /;
$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$val =~ s/&/&/g;
$val =~ s/"/"/g;
$val =~ s/>/g;
$val =~ s/>/</g;
$val =~ s/\0//g;
$in{$key} = $val;
}
$page = $in{'page'};
$name = $in{'name'};
$mode = $in{'mode'};
$hp = $in{'hp'};
$down = $in{'down'};
$down =~ s/^http\:\/\/?//;
# チェックモード
if (!$buf || $mode eq "check") { ✓ }
# URLの引数がない場合はリンク元情報を取得する
if ($hp eq "") {
$hp = $ENV{'HTTP_REFERER'};
$hp =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$hp =~ s/<([^>]|\n)*>//g;
}
$hp =~ s/^http\:\/\/?//;
if ($hp eq "") { $hp = "unknown"; }
# IPアドレスを取得
$addr = $ENV{'REMOTE_ADDR'};
# ロック開始
&lock if ($lockkey);
# ログを開く
if ($down) { $page = $down; }
open(IN,"$logfile") || &error("$logfile");
@lines = ;
close(IN);
# マッチング/カウントアップ処理
$flag=0;
@new=();
foreach $line (@lines) {
($no,$hpg,$count,$title,$ip) = split(/<>/, $line);
if ($page eq $no) {
# IPアドレスが同じ場合はカウントアップしない
if ($ip_chk && $addr eq $ip) { $flag=2; last; }
# $hpg, $title がない場合
if ($hpg eq "") { $hpg = $hp; }
if ($title eq "") {
$title = $name;
}
$flag=1;
$count++;
$line = "$no<>$hpg<>$count<>$title<>$addr<>\n";
}
push(@new,$line);
}
# 既存ログ更新
if ($flag == 1) {
open(OUT,">$logfile") || &error("$logfile");
print OUT @new;
close(OUT);
}
# 新規ページ追加更新
elsif ($flag == 0 && $hp ne "") {
open(OUT,">>$logfile") || &error("$logfile");
print OUT "$page<>$hp<>1<>$name<>$addr<>\n";
close(OUT);
}
# ロック解除
&unlock if ($lockkey);
# ダウンロードカウンタの場合
if ($down) {
# METAタグ方式
if ($get_file == 2) {
print "Content-type: text/html\n\n";
print <
しばらくお待ちください
しばらく待ってもダウンロードできない場合は
ここ をクリックしてください。