カウンタのcgiについて教えてください

このQ&Aのポイント
  • カウンタのcgiについて教えてください。カウンタのcgiを作りました。IPもしくはコンピュータ名からの連続更新はカウントしないようにする方法と、昨日のカウント数や今月のカウント数などで集計する方法について教えてください。
  • カウンタのcgiを作成しましたが、IPやコンピュータ名からの連続更新をカウントしないようにする方法がわかりません。また、カウント数を集計する方法も教えてください。
  • カウンタのcgiを作成しましたが、IPやコンピュータ名からの連続更新はカウントしないようにする方法と、カウント数を集計する方法について教えてください。
回答を見る
  • ベストアンサー

カウンタのcgiについて教えてください。

カウンタのcgiについて教えてください。 open(File,"+<count.dat")or die("エラー"); eval{flock(File,2);}; $count=<File>; seek(File,0,0); print File++$count; close(File); print<<END; Content-type:text/html <html> <head> <title>タイトル</title></head> <body>$count人目の訪問者です </body> </html> みたいな感じでカウンタのcgiを作りました。 (Perl・Apache) (携帯からなので、見にくい感じはご容赦ください) これを別htmlファイルにiframeで組み込みました。 今は、単純にファイルが開かれたら+1なので、F5などで更新してもカウントされます。 これを同一IPもしくはコンピュータ名からの連続更新はカウントしないようにするのはどのように書き加えればいいのでしょうか? また、総カウント数だけでなく、昨日のカウント数、今日のカウント数、今月、先月などで集計するためにはどのようにすればよいのでしょうか? わかりにくいかと思いますが、お願いいたします。 m(__)m

  • CGI
  • 回答数1
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • kuzumiHK
  • ベストアンサー率72% (132/183)
回答No.1

取得したIPを照合用にどこかに吐き出したり、 日付別にログファイルを書き出したり、 ログファイルを参照するモードを追加したり、 いろいろな説明が必要そうなので、 既存のフリーCGIカウンターを参考にしたほうが早そうです。 バグも少ないですし。。 KENT WEBのDay Counter-EXあたりが近いのではないでしょうか。 参考URL http://www.kent-web.com/count/ init.cgiに、IPアドレスの二重カウントチェックのON/OFF機能も確認できました。

ajisaika
質問者

お礼

ありがとうございました。 何とか出来ましたf^_^;

関連するQ&A

  • 昨日と今日のカウンタについて ご指摘下さい

    昨日と今日のカウンタについて カウンターが1こずつではなく、4つとか5つとかずつ増えてしまいます。ですが、html内の <p>本日の数は<img src="./count.cgi?today">です</p> <p>昨日の数は<img src="./count.cgi?yeaday">です</p> を削除すると、ちゃんと1つずつカウントしていきます。(count.datの本日のカウント数もちゃんと1こずつ増えるのを確認しました。) プログラムの何処が間違っているのでしょうか?アドバイスをお願い申し上げます。 <<count.cgi>> #!C:\Perl\bin\perl # 昨日と今日のカウントの取得 $ENV{'TZ'} = "JST-9"; $mday = (localtime(time))[3]; open (FILE, "<logday.dat") || die "File Open Err!-logday.dat\n"; $logday = <FILE>; close(FILE); ($day, $yesday) = split(/:/, $logday); #それぞれ、今日の日付、昨日のカウント数に分ける open(FILE,"<count.dat") || die "File Open Error!-count.dat\n"; $count = <FILE>; #変数countにデータを収納 close(FILE); ($count, $today) = split(/:/, $count); #それぞれ、トータルカウント数、今日の日付のカウント数に分ける # 数をカウント if($day == $mday){ #同日だったなら、トータルと本日のカウントだけ取る。 &totalcount(); }else{ #違っていたら、本日のカウント数を昨日へ、本日のカウントを0に、日にちを修正 $yesday = $today; $today = 0; open (FILE, ">count.dat") || die "File Open Err!-logday.dat\n"; flock(FILE,2); print FILE "$count\:$today"; flock(FILE,8); close(FILE); open (FILE, ">logday.dat") || die "File Open Err!-logday.dat\n"; flock(FILE,2); print FILE "$mday\:$yesday"; flock(FILE,8); close(FILE); &totalcount(); #その後カウントをとる } # 引数受取 $mode = $ENV{'QUERY_STRING'}; $mode =~ s/\W//g; require "./gifcat.pl"; #画像表示のif文================ if($mode eq "total"){ &total(); }elsif($mode eq "today"){ &today(); }else{ &yestaday();} exit; # ログの更新================================ sub totalcount{ open(FILE, "+<count.dat") || die "File Open Error!\n"; flock(FILE,2); $count++; #トータルカウント数にプラス1 $today++; #同じく本日のカウント数にもプラス1 seek(FILE, 0, 0); print FILE "$count\:$today"; flock(FILE,8); close(FILE); } # カウンタの数字に画像を付ける sub total{ #トータルカウンタ============= @countdata = split(//, $count); foreach $cou(@countdata){ push(@view, "./img-t/$cou.gif"); } #画像の出力=============== print "Content-type:image/gif\n\n"; binmode(STDOUT); print &gifcat::gifcat(@view); } sub today{ #今日のカウンタ============= @countdatadt = split(//, $today); foreach $coudt(@countdatadt){ push(@viewdt, "./img-d/$coudt.gif"); } #画像の出力=============== print "Content-type:image/gif\n\n"; binmode(STDOUT); print &gifcat::gifcat(@viewdt); } sub yestaday{ #今日のカウンタ============= @countdatady = split(//, $yesday); foreach $coudy(@countdatady){ push(@viewdy, "./img-d/$coudy.gif"); } #画像の出力=============== print "Content-type:image/gif\n\n"; binmode(STDOUT); print &gifcat::gifcat(@viewdy); } <<count.html>> <html> <head> <title>カウンタ</title> </head> <body> <p>トータルカウント数は<img src="./count.cgi?total">です</p> <p>本日の数は<img src="./count.cgi?today">です</p> <p>昨日の数は<img src="./count.cgi?yeaday">です</p> </body> </html> <<count.dat>> トータル数:本日のカウント数 <<logday.dat>> 今日の日:昨日のカウント数

    • ベストアンサー
    • Perl
  • テキストカウンターができない詳しい人教えて!

    #!/usr/bin/perl # 読み書きモードでファイルオープン # オープンできないときは強制終了 open(COUNT, "+<countdata") || die "File 'countdata' Open Error."; # ファイルをロックする #flock(COUNT,2); # ファイルから一行読みこむ $counter = <COUNT>; # カウントアップ $counter_new = $counter + 1; # ファイルポインタを先頭に戻す seek(COUNT, 0, 0); # ファイルに出力=書き込み print COUNT "$counter_new?n"; # ファイルクローズ close(COUNT); # ファイルロックを解除する #flock(COUNT,8); # ------- 出力はここから ------- # print "Content-type: text/html?n?n"; print << "END_OF_HTML"; <HTML> <BODY> <CENTER> <FONT size="6"><B> ようこそ<BR> あなたは<FONT color="red"> $counter_new </FONT>人目のお客様です </B></FONT> </CENTER> </BODY> </HTML> END_OF_HTML をcounter.cgiに保存してcountdataに0と打ち込んでwebサーバーにアップしましたが500エラーで見れません CGIの本通りに行いましたができませんサポートページもなく困っています ソースミスなどここが違うなどあったら教えて下さい あとパーミッションなども御願いします

    • ベストアンサー
    • CGI
  • カウンタCGIについて

    今、カウンタを自作しています。 カウンタの種類はテキストカウンタです。 ですがカウンタを設置しているページからその他のページへ移動し、ブラウザの「戻る」ボタンで戻ってきたときにカウントがされないんです。 カウンタをテキストで表示したい、SSIを使いたくないと言う理由でHTMLページではJavaScriptを用いてCGIの内容を取得するようにしています。 どうしたら解決できるでしょうか?よろしくお願いします。 <index.htm> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>カウンタ</title> </head> <body> <p> <SCRIPT language="JavaScript" src="count.cgi"></SCRIPT> <noscript>JavaScriptをONにしないとカウンタは動きません。</noscript> </p> <p> <a href="http://www.yahoo.co.jp/">Yahoo!Japan</a> </p> </body> </html>

    • ベストアンサー
    • CGI
  • ページ訪問時の個別カウントについて

    こんばんは,いつもお世話になっております. Webサイトへのアクセスカウンターを作ってみました. 人がページへ訪問→+1してcount.datに加算→同ページに数値を表示というプロセスです. count.cgi ----------------------------------------- #! usr/bin/perl use CGI::Carp qw(fatalsToBrowser); open(FILE, "+<./count.dat") or die("ERROR"); eval{ flock(FILE, 2); }; $count = <FILE>; #カウントファイルの書き込み seek(FILE, 0, 0); print FILE ++$count; close(FILE); #サーバー出力 print qq[Content-type: text/html\n\n]; print qq[<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">]; print qq[<html>]; print qq[<head><title></title></head>]; print qq[<body>]; print qq[$count]; print qq[</body>]; print qq[</html>]; ----------------------------------------- 非常に簡易的なものなのですが,この数値を個人のIPなど,無二の値を用いて識別し,count.datに保存することは可能でしょうか? もちろん個人情報なので出力については考慮したいと思っております. 何か不明な点がございましたら随時対応しますので,よろしくお願い致します.

  • テキストカウンターのエラー 詳しい方教えて!!

    ttp://up.kabubu.net/cgi/img2/15270.zip これがソースですフレーム分割してテキストカウンターを表示させるやつです 一週間でマスターするCGI for Macintoshについてきたものです 本通りにやってもできません ローカルのアパッチでも試しましたが webサーバーだと500エラーがでました 本にはサポートページもありませんでした 一応ソースのせます #!/usr/bin/perl open(COUNT, "+<countdata") || die "File 'countdata' Open Error."; flock(COUNT,2); $counter = <COUNT>; $counter_new = $counter + 1; seek(COUNT, 0, 0); print COUNT "$counter_new?n"; close(COUNT); flock(COUNT,8); print "Content-type: text/html?n?n"; print << "END_OF_HTML"; <HTML> <BODY> <CENTER> <FONT size="6"><B> ようこそ<BR> あなたは<FONT color="red"> $counter_new </FONT>人目のお客様です </B></FONT> </CENTER> </BODY> </HTML> END_OF_HTML ソースミスを指摘してもらいましたが 自分でやるとエラーがでるので どなたかエラーがでないようにソースを直して下さい あとパーミッションも御願いします 本にのってた通りのパーミッションでは ファイル countdataは606 counter.cgiは705 main.htmlは404 index.htmlは404 briage.gifは404 となっております ディレクトリの名前はcounterです パーミッションは755 ソースエラーを指摘されましたが難しいのでどなたか動作確認できてから書き直して載せて下さい御願いします

    • ベストアンサー
    • CGI
  • SSIの実行

    アクセスカウンタ作成についての質問です。 あるプロバイダが提供している領域を使い、 public_htmlフォルダ直下に count.cgi、count.shtmlというファイルを置き、 count.shtmlからcount.cgiを呼び出して、 自前のアクセスカウンタを実行しようとしましたが、 アクセス数の部分が表示されず困っています。 ("カウント数は"の後が空白で何も表示されません。 エラー表示等はありません) チェック方法項目等ありましたらお教え頂けません でしょうか。 よろしくお願い致します。 ※public_htmlフォルダ及び、対象2ファイルには  それぞれ755のパーミッションを設定しています。 以下、html文です。 ------------------------------ <html> <head><title>アクセスカウンタ</title></head> <body> カウント数は <!--#exec cgi="./count.cgi"--> </body> </html> 以下、CGIプログラムです。 ------------------------------ #! /usr/local/bin/perl $filename = "count.txt"; if (!open ( FP, "$filename")) { $no = 0; } else { $no = <FP>; close(FP); } $no++; print "$no" if (!open ( FP, ">$filename")) { print "ファイル $filename がオープンできませんでした ($!)\n"; } else { print FP $no; close(FP); }

    • 締切済み
    • CGI
  • カウンターで重複カウントの防止について

    勉強がてら以下のようなカウンターをつくりたいと思っています。 1 画像つきのカウンタである 2 重複カウンタを防止したい 3 昨日と今日のカウンターも表示させたい で、2でけつまずきました。 何がいけないのでしょうか? 以下のプログラムだと更新毎にカウンターが回ってしまいます。 ご指摘下さい。よろしくお願い申し上げます。 #!C:\Perl\bin\perl $flg = 0; #IPアドレスの取得と重複カウントの防止============ $ipadd = $ENV{'REMOTE_ADDR'}; #IPアドレスの取得 open (FILE, "<logcount.dat") || die "File Open Err!-logcount.dat\n"; #データをすべて配列logdataに読み込む @logdata = <FILE>; close(FILE); #取得したIPアドレスと履歴のIPアドレスを比較====== for($i=0; $i<=$#logdata; $i++){ if($ipadd eq $logdata[$i]){ #新規のIPデータと過去ログのIPデータが等しかったら $flg = 1; #合致するのは1つのアドレスのみ } } #==================================================================== # $flg = 0 だったら、数をカウント #==================================================================== open(FILE,"<count.dat") || die "File Open Error!-count.dat\n"; #カウントデータの読み込み $count = <FILE>; #変数countにデータを収納 close(FILE); if($flg == 1){ $data = $count; }else{ $data = ++$count; #プラス1をカウント # ログの更新================================== open(FILE, "+<count.dat") || die "File Open Error!\n"; flock(FILE,2); seek(FILE, 0, 0); #.datに上書き保存する為にデータの記位置を調整 print FILE $data; #カウントを記録 flock(FILE,8); close(FILE); # IPアドレスを更新============================= open (FILE, ">>logcount.dat") || die "File Open Err!-logcount.dat\n"; print FILE $ipadd,"\n"; close(FILE); } print $data; #==================================================================== # カウンタの数字に画像を付ける #==================================================================== @count = split(//, $data); foreach $cou(@count){ push(@view, "./img/$cou.gif"); } require "./gifcat.pl"; print "Content-type:image/gif\n\n"; binmode(STDOUT); print &gifcat::gifcat(@view);

    • ベストアンサー
    • Perl
  • アクセスカウンタについて

    #!/usr/local/bin/perl # カウントファイルの読み込み open(IN, "<./count.dat"); $count = <IN>; close(IN); ++$count; # カウントファイルへの書き込み open(OUT, ">./count.dat"); print OUT $count; close(OUT); # サーバ出力 print <<END; Content-type: text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head><title>Perlあくせすかうんたー</title></head> <body> <p>あなたは……$count番目の訪問者です。</p> </body> </html> END 以上のように書きcount.datを作成して同じディレクトリ内においたのですが、カウントが1から増えません。サーバがいけないのか、スプリクトがわるいのかよくわかりません;; ちなみにサーバはlinuxで構築しています。

    • ベストアンサー
    • Perl
  • 初歩的なアクセスカウンタ作成で

    perlを学びはじめて間もない初心者です。よろしくお願いします。 書籍を参考にしながらperlを学んでいます。書籍の中のアクセスカウンタを作ってみるという部分で、下記のスクリプトを書き試してみたのですが、アクセスカウンタが加算されません。1のままとなっています。 何が問題であるのか全く見当がつかないのですが、まず何からチェックして行けばよいのでしょうか? アドバイスやご教授をいただけたらと思います。 よろしくお願いします。 それから環境は、http://www.futomi.com/lecture/macosx/index.html​ を元にMacOS X での Apache サーバーでのローカルでテスト環境 で試し低ます。 # カウントファイルの読み込み open(IN, "<./count.dat"); $count = <IN>; close(IN); ++$count; # カウントファイルの書き込み open(OUT, ">./count.dat"); print OUT $count; close(OUT); # サーバー出力 print <<END; Content-type: text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head><title>あくせすかうんたー</title></head> <body> <p>あなたは……$count番目の訪問者です。</p> </body> </html> END

    • ベストアンサー
    • CGI
  • 次のカウンターのCGIプログラムで間違っているところはどこでしょうか?

    参考書を手にしながら次のようにCGIを作成しましたが、上手く動きません。 個人別カウンター(アクセスしてきた個人ごとにカウンターが変わる)CGIです。 いろいろ調べたのですが、どこが間違っているのか分からなくなりました。 どうぞお願いいたします。 ======= #!/usr/local/bin/perl $cookie = $ENV{'HTTP_COOKIE'}; @array = split(/; /, $cookie); foreach $tmp (@array){ ($key, $value) = split(/=/, $tmp); if($key eq 'count'){ $count = $value; } } if( $key == ""){ $count = 0; } $count++; ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime(time + 60*60*24*30); @day = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "sat"); @month = ("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Set", "Oct", "Nov", "Dec"); $expireDate = sprintf("%s\, %02d\-%s\-%04d %02d:%02d:%02d GMT", $day[$wday], $mday, $month[$mon], $year+1900, $hour, $min, $sec); print "Content-Type: text/html\n"; print "Set-cookie: count=$count; expires=$expireDate \n\n"; Print "<html>\n"; Print "<title>counter4</title>\n"; print "<body>\n"; print "<h1>個人別カウンター</h1>\n<hr />"; print "あなたは$count回目のご訪問です。\n"; print "</body>\n"; print "</html>"; exit;

    • ベストアンサー
    • CGI