#!/usr/bin/perl #↑perlのパスを自分の環境に合わせて書き直します。 #大抵は、「#!/usr/bin/perl」 か 「#!/usr/local/bin/perl」です。 #解らない場合はサーバー管理者(もしくはプロバイダー)に #確認してください。 $ver = "1.02"; #################################################################### # Yomi-Ranking Ver1.02 [アクセスランキング&解析] (Since:2000/10/15) # (C) 2000 by yomi # Eメール: yomi@pekori.to # ホームページ: http://yomi.pekori.to/ #################################################################### ####環境設定#### #----↓ここから設定↓----# #CGIファイルを置くディレクトリのURL #※ファイル名は入れないでください #[例] http://yomi.pekori.to/cgi-bin/count_yr.cgi #なら http://yomi.pekori.to/cgi-bin/ と記入 $Escript_url="http://www.chabu.com/vino/cgi-bin/ranking/"; #戻り先のページのURL $Ehome="http://www.chabu.com/vino/top.html"; #日付・カウンタファイル $Ecountlog="date_yr.cgi"; #一時保存ファイル $Etemplog="temp_yr.cgi"; #ランキングデータファイル $Eranklog="ranklog_yr.cgi"; #アクセス報告用ファイル $Eaccesslog="access_yr.cgi"; #リンク元定義ファイル $Erefini="refini_yr.cgi"; #更新処理用ライブラリ $Elib="lib_yr.cgi"; #前回のランキングファイル $Ebkrank="bk_ranking.html"; #現在のランキングファイル $Enowrank="ranking.html"; #ダミーgifファイル $dmy_gif="dummy.gif"; #カウンタ用画像ファイルが入っているディレクトリ(フォルダ)へのパス #※通常は変更不要です $Egif_dir="gif/"; #アクセスカウンタ(使用する=0/使用しない=1) $Ecounter="0"; #ログの取得方法(SSIを使用=0/SSI不使用=1) #※不使用の場合にはアクセスカウンタは使用できません #アクセスカウンタを使用しない場合には「SSI不使用」を選択したほうが良いです #選択した方法によって設置方法が異なりますので「readme.txt」を良く読んでください $Elogget="1"; #ロック方法(ディレクトリロック=0/symlinkロック=1) $Eslock="0"; #同一IPの連続アクセスを(カウントする=0/カウントしない=1) $Eip_c="0"; #ランキング集計期間 $Ekikan="7"; #ランキングの表示数 $Erank_hyouji="30"; #アクセス報告メール(送信する=0/送信しない=1) $Email_go='0'; #アクセス報告メールの送信先メールアドレス $Emailto='chabuchi@chabu.com'; #sendmailのパス(メール通知をする場合に必要です) ##分からない場合はサーバ管理者(もしくはプロバイダ)に問い合わせてください $Esendmail = "/usr/sbin/sendmail"; #アクセス数の最低報告数 #この数値未満のアクセス元URLはアクセス報告メールに表示されません $Emin_ac='3'; #アクセス元の最大報告数 #リンク元の数がこの数値を超えた場合には少ないアクセス元は省略されます $Emax_repo='200'; ##以下は必要に応じて変更してください #アクセス報告時の件名に付くアクセス数の変動マーク(文字) #[例](^o^),(x_x),(-_-)の部分をそれぞれUP,Down,Evenなどのように変更 $Econ{'up'}="(^o^)"; #上昇時 $Econ{'down'}="(x_x)"; #減少時 $Econ{'even'}="(-_-)"; #変動なし #ロックディレクトリを作成するディレクトリ $Elock_dir="lock/yr"; #外部リンク先のターゲット指定 $Etarget="_blank"; #----↑ここまで設定↑----# ####目次#### #(1)メイン処理(&index) #()ロック処理(&lock) #()ロック解除処理(&unlock) ############ &index; #(1)メイン処理(&index) sub index{ if($Elogget){$ENV{'HTTP_REFERER'}=$ENV{'QUERY_STRING'};} #ロック unless(&lock()){ require "$Ecountlog"; if($Elogget){&gif;exit;} print "Content-type: text/html\n\n"; if(!$Ecounter){print "$Eso_count";} else{print "";} exit; } ################ # 日時の取得 $ENV{'TZ'} = "JST-9"; $times = time(); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($times); $year = 1900 + $year; #$youbi = ('日','月','日','水','木','金','土') [$wday]; $mon++; $hour1=$hour; if ($mon < 10) { $mon = "0$mon"; } if ($mday < 10) { $mday = "0$mday"; } if ($hour < 10) { $hour = "0$hour"; } if ($min < 10) { $min = "0$min"; } # 日時のフォーマット $DATE_NOW = "$year/$mon/$mday"; #現在の日付 #日付・カウントファイル読み込み require "$Ecountlog"; $date_yr_flag=0; #[書式](date_yr.cgi) #書き込みフラグ=$date_yr_flag=0; #$Eso_count="712938"; #総カウント数 #$Eto_count="2938"; #今日カウント数 #$Eye_count="6576"; #昨日カウント数 #$Elast_ip="202.332.112.01"; #最終アクセスのIP #$Etoday="2000/10/18"; #今日の日付 #$Elast_make="19"; #最終更新時刻 (24時制の時間) #$Estr_date="2000/10/15"; #ランキング集計開始日 #$Eend_date="2000/10/22"; #ランキング集計終了日 #$Eend="9574892"; #ランキング集計終了日(time形式) #1; #カウントアップ if($Eip_c && $Elast_ip ne $ENV{'REMOTE_ADDR'}){$Eso_count++;$Eto_count++;$date_yr_flag=1;} elsif($Eip_c && $Elast_ip ne $ENV{'REMOTE_ADDR'}){ #カウントアップせず終了 &unlock(); if($Elogget){&gif;exit;} print "Content-type: text/html\n\n"; if(!$Ecounter){print "$Eso_count";} else{print "";} exit; } elsif(!$Eip_c){$Eso_count++;$Eto_count++;$date_yr_flag=1;} ###アクセス情報### #Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90) #DoCoMo/1.0/D502i/c10 #J-PHONE ################## if(!$ENV{'HTTP_REFERER'}){$ENV{'HTTP_REFERER'}="other";} $ref=$ENV{'HTTP_REFERER'}; $agent=$ENV{'HTTP_USER_AGENT'}; #ブラウザ整形 if(index($agent,"MSIE") >= 0){$br="MSIE";} elsif(index($agent,"Mozilla") >= 0){$br="Mozilla";} elsif(index($agent,"DoCoMo") >= 0){$br="DoCoMo";} elsif(index($agent,"J-PHONE") >= 0){$br="J-PHONE";} else{$agent="other";} #OS整形 if(index($agent,"NT") >= 0){$os="NT";} elsif(index($agent,"Win") >= 0){$os="Win";} elsif(index($agent,"Mac") >= 0){$os="Mac";} else{$os="other";} #referer整形 $tmp=""; $ref=~s///g; $ref=~s/\\//g; $ref=~s/\'/’/g; if(($tmp=index($ref,"\?"))>=0){$ref=substr($ref,0,$tmp);} #「temp_yr.cgi」に追加書き込み open(OUT,">>$Etemplog"); print OUT "$ref<>$br<>$os<>$hour<>$DATE_NOW<>\n"; close(OUT); ##時間更新時の処理↓ if("$Etoday $Elast_make" ne "$DATE_NOW $hour"){ require "$Elib"; &time_kou; ###日付更新時の処理↓ if($Etoday ne $DATE_NOW){ ####ランキング初期化時の処理↓ if($Eend<$times){ &rank_kou; $Eend = $times + ($Ekikan*86400) - ($hour1*3500); ($sec_e,$min_e,$hour_e,$mday_e,$mon_e,$year_e) = localtime($Eend); $year_e = 1900 + $year_e;$mon_e++; $Estr_date=$DATE_NOW; $Eend_date="$year_e/$mon_e/$mday_e"; } ####ランキング初期化時の処理↑ &day_kou; &make_now; #現在のランキングを作成 } ###日付更新時の処理↑ } ##時間更新時の処理↑ #日付・カウントファイル書き込み open(OUT,">$Ecountlog"); print OUT<<"EOM"; \$Eso_count="$Eso_count"; #総カウント数 \$Eto_count="$Eto_count"; #今日カウント数 \$Eye_count="$Eye_count"; #昨日カウント数 \$Elast_ip=\'$ENV{'REMOTE_ADDR'}\'; #最終アクセスのIP \$Etoday="$DATE_NOW"; #今日の日付 \$Elast_make="$Elast_make"; #最終更新時刻 (24時制の時間) \$Estr_date="$Estr_date"; #ランキング集計開始日 \$Eend_date="$Eend_date"; #ランキング集計終了日 \$Eend="$Eend"; #ランキング集計終了日(time形式) 1; EOM close(OUT); #ロック解除 &unlock(); if($Elogget){&gif;exit;} print "Content-type: text/html\n\n"; if(!$Ecounter){print "$Eso_count";} else{print "";} exit; } #()ロック処理(&lock) #失敗時=0/成功時=1 sub lock{ if(!$Eslock){ #ディレクトリロック ($PRE_TIME) = (stat($Elock_dir))[9]; $TIME_FLAG = time() - $PRE_TIME; $i=1; while(1){ if (mkdir("$Elock_dir", 0755)) { return 1; } #ロック成功 if ($i==1) {if($TIME_FLAG > 360){rmdir($LOCK_DIR);}} #ロックの強制解除 elsif ($i < 6) { sleep(1); } else { return 0; } #ロック失敗 $i++; } } else{ #symlinkロック $lockfile="lock_ys.loc"; local($retry) = 5; while (!symlink(".",$lockfile)) { if (--$retry <= 0) { return 0; #ロック失敗 } sleep(1); } return 1; } } #()ロック解除処理(&unlock) sub unlock{ if(!$Eslock){rmdir($Elock_dir);} else{unlink($lockfile);} } #GIF表示 sub gif{ if($Ecounter){ print "Content-type: image/gif\n"; print "Pragma: no-cache\n\n"; open(IN,"$dmy_gif"); binmode(IN); binmode(STDOUT); print ; close(IN); } else{ foreach $line(split(//,$Eso_count)){ push(@count,"$Egif_dir$line\.gif"); } require "gifcat.pl"; print "Content-type: image/gif\n"; print "Pragma: no-cache\n\n"; binmode(STDOUT); print &gifcat'gifcat(@count); } }