• 締切済み

ページ訪問時の個別カウントについて

こんばんは,いつもお世話になっております. 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に保存することは可能でしょうか? もちろん個人情報なので出力については考慮したいと思っております. 何か不明な点がございましたら随時対応しますので,よろしくお願い致します.

  • Perl
  • 回答数2
  • ありがとう数3

みんなの回答

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.2

>この数値を個人のIPなど,無二の値を用いて識別し,count.datに保存することは可能でしょうか?  どうしても、個人情報を捕捉したければ、  Cookieに、最初の訪問時刻などでユニークな値を作って、それを保存すればよい。  でもね、サーチエンジンやら何やらで肥大化して・・、そうまでしてゴミを溜め込まなくても良いのではないかと。

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.1

普通は、cookieを使います。 有効期限は1年程度でよいかな 普通はこんな書き方しない。qを使えば print q~Content-type: text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head><title></title></head> <body> ~; print "$count\n"; print q~</body> </html> ~; qqを使えば print qq~Content-type: text/html\n <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html>\n<head><title></title></head>\n<body>\n$count </body>\n</html>\n~; cookieを使ってカウントするなら、 ★下記ソースは、タブ(\t)を全角スペース2個に置換してある。 ★元に戻してテスト ★reload対策はしていない #!/usr/local/bin/perl $DEF = 365; if($ENV{'HTTP_COOKIE'})   {   $cookies = $ENV{'HTTP_COOKIE'};   @cookie = split(/;/,$cookies);   foreach $cook (@cookie) {     if ($cook =~ /Visited=(\d+)/){       $NewCount = $count = $1;       $NewCount++;     }   } } else{ $NewCount = 1;} &setCookie; print qq~Content-type: text/html $COOK \n <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html>\n<head><title></title></head>\n<body> <p>あなたは$count回訪問されました</p> </body>\n</html>\n~; sub setCookie{   my ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + $DEF*24*60*60);   @week = (Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);   @monthg = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);   $expires = sprintf("%s\, %02d\-%s\-%04d %02d:%02d:%02d GMT",$week[$wdayg],$mdayg,$monthg[$mong],$yearg +1900,$hourg,$ming,$secg);   $COOK = "Set-Cookie: Visited=$NewCount,expires=$expires";   }

関連するQ&A

  • アクセスカウンタについて

    #!/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
  • カウンタの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
  • Apacheでcgiができないんです。

    以下のホームページと同じように、設定したのですが。。。 http://www.futomi.com/lecture/apache/config.html 下のcgiは実行できます。 #!/usr/local/bin/perl print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD>\n"; print "<TITLE>Apache</TITLE>\n"; print "</HEAD>\n"; print "<BODY>\n"; print "<H2>Welcome to my computer, Apache Server!</H2>\n"; print "</BODY>\n"; print "</HTML>\n"; しかし、下のcgiは実行できません。htmlファイル、cgiファイル共に、あるホームページからコピペしたので、間違いないと思います。ここではhtmlファイルは書きませんが、以下のURLです。 http://www2j.biglobe.ne.jp/~apollo/server/apacuse.html #!/usr/local/bin/perl $countfile= "count.dat"; open(IN, "< $countfile"); $count = <IN>; close(IN); $count++; open(OUT,"> $countfile"); print OUT $count; close(OUT); print "Content-type: text/plain\n\n"; print $count;

    • ベストアンサー
    • CGI
  • 昨日と今日のカウンタについて ご指摘下さい

    昨日と今日のカウンタについて カウンターが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
  • 初歩的なアクセスカウンタ作成で

    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でリンクさせたページを同一のページ内の iframe に表示させるには

    CGIでリンクさせたページを同一のページ内の iframe に表示させるにはどうしたらいいでしょうか? ちなみにCGIは -------------------- #!/usr/bin/perl $querybuffer = $ENV{'QUERY_STRING'}; @pairs = split(/&/,$querybuffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); if( $name eq "jumpto" ) { $jumpto = $value; # 移動先 } } if( $jumpto ne "-" ) { print "Location: $jumpto\n\n"; } else { print "Content-type: text/html\n\n"; print qq|<HTML>\n<HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html ; charset=Shift_JIS">\n<TITLE>移動先が未指定です</TITLE></HEAD>\n|; print qq|<BODY><H1>移動先が選択されていません。</H1><P>移動先を選択してからボタンをクリックして下さい。</P></BODY>\n|; } exit; ------------------ です。 iframe部分は以下のようにしています。 <iframe src="index.html" height=200 width=460> この部分は iframe 対応のブラウザで見てください。 </iframe>

    • ベストアンサー
    • CGI
  • Perlで書いたページが表示されない

    以下の内容の「index.cgi」「test.cgi」という名前は異なるが 内容は同じファイルをIISを用いて表示させようとしています。 -------------------------------------------------------------- #!/usr/local/bin/perl print "Content-type: text/html\n\n"; print <<"htmss"; <HTML> <HEAD> <TITLE>CGI</TITLE> </HEAD> <BODY>今日からCGIを頑張って習得してきましょう。</BODY> </HTML> htmss -------------------------------------------------------------- この場合に、index.cgiは表示されるのですが、 test.cgiは表示されません。(サーバーが見つかりません、の表示) また、他の内容のcgiファイルも表示することができません。  ※最初は表示されていたが急に表示されなくなったり表示されたりを繰り返した結果、   見えない状態が続いています index.cgiもたまに表示することができない場合もあります。 これはIISのせいなのか、環境が不安定なせいなのか、困っています。 どなたか回答していただけると幸いです。

  • ボタン押したときだけカウント

    http://www.sic.shibaura-it.ac.jp/~p00050/ でホームページを作っています。 左下のほうにあるリンクをクリックしたときだけ、カウントが上がるようにしたいんです。 でも表示更新したときにもカウントが上がってしまいます。 左下の部分のフレームはcount.cgiで、ソースは次のとおり。 #!/usr/local/bin/perl $data = 'data.dat'; open(F, "$data"); $count = <F>; close(F); $count++; open(F, ">$data"); print F "$count"; close(F); print "content-type:text/html\n\n"; print "<body bgcolor=black topmargin=0 leftmargin=0 bottommargin=0 rightmargin=0>\n"; print "<font color=lightgrey size=2><p align=center>ポイント <b>$count</b><br>\n"; print "このページに共感した人は、<br>好きなだけ<a href=count.cgi target=count>ここ</a>を押してください。"; print "</p></font></body>\n";

    • 締切済み
    • CGI
  • 1つのhtmlページにたくさんのCGIを表示したい

    1つのhtmlページにたくさんのCGIを表示したいのですができますか? "Content-type: text1/html\n\n" /* ** CGI版のhello.c(HTML仕様) */ #include <stdio.h> main(){ printf("Content-type:1/html\n\n"); /* ここから HTML でお馴染みのタグ */ <HTML> <HEAD> <TITLE></TITLE> </HEAD> <BODY> /* あいうえお */ "Hello C World!<BR>\n" "</BODY>" "</HTML>" } みたいなCGIを入れたいのですが。

    • 締切済み
    • CGI
  • エラー表示の意味を解説してください

    CGI初心者です。自分の端末でサーバ設定し、テスト中の段階です。htmlファイルはブラウザからきちんと表示されました。が、CGIファイルを表示させようとすると、 CGI エラー - Content-Type ヘッダが正しくありません。 CGI 出力メッセージ: Can't open perl script "C:\www\hiro\ISO": No such file or directory とエラーがでます。ちなみに、スクリプトには #!/usr/bin/perl print"Content-type: text/html\n\n"; print"<HTML>\n"; print"<HEAD>\n"; print"<TITLE>CGI No1</TITLE>\n"; print"</HEAD>"; print"<BODY>\n"; print"CGIプログラム No.1,テスト成功!\n"; print"</BODY>\n"; print"</HEAD>\n"; と記述しました。なにがいけないのか教えてください。

    • ベストアンサー
    • CGI

専門家に質問してみよう