#!/usr/bin/perl # # hee.cgi へぇボタンCGI # # AUTHOR: Kazeburo # LICENSE: free software, licensed under the same license as Perl. # #CGIの設置 # 1. hee.cgiを置き場所をきめる # 2. $dir(作業用ディレクトリ)で指定したディレクトリを作成し、パーミションを777などCGIが読み書きできるようにする # 3. へぇボタン用画像を用意し、$heeimgでそのURLを書く # 4. hee_バージョン.txtをhee.cgiと名前を変更しアップロードして、755などのパーミションにする #CGIの使い方 # ページの中で # # とする。 # ?以降のページURLはREFERERを参照して自動で動きますが、書いておいた方が特です。 #勝手に使われるのを防ぐ # @allow_url=();に自分のサイトのURLを入れておく # @allow_url=("nomadscafe.jp");などとすると、REFERERにnomadscafe.jpがない場合、エラー時AAを出力します。 # # use strict; use IO::File; use CGI qw/header url param redirect/; use Digest::MD5 qw/md5_hex/; use vars qw($VERSION $aa $ss $hee $maxhee $maxpush $heeimg $cgipath $dir $type $charset $javascript @allow_url); $VERSION = "0.01"; #--------------------------------------------------------------------------------------- #設定 #AA $aa = "( ・∀・)つ〃∩ "; #エラー時AA $ss = "(´・ω・`)"; #へぇ〜 $hee = "ヘェー"; #へぇボタン画像パス $heeimg="http://hogehoge/img/he.gif"; #この数字以上になると、へぇ〜(数字)にかわります $maxhee=10; #一度に押すことのできる数 $maxpush=3; #CGI設置場所(いじる必要ないです $cgipath=url(); #作業用ディレクトリ(CGIで読み書き実行できるようにしておいてください $dir = "./hee"; #content-type(いじる必要はないと思います $type = "text/javascript"; #charset(漢字コードを変えるときはこのファイルの漢字コードを変えて以下を変更 $charset = "EUC-JP"; # Referer として許可する URL: 部分マッチ # 空の場合はチェックしない #宮川さんのjscache.cgiと同じです。 #http://blog.bulknews.net/mt/archives/000978.html #@allow_url = ("nomadscafe.jp"); @allow_url = (); #設定終了 #--------------------------------------------------------------------------------------- #JavaScript my $javascript = < $maxpush){ document.getElementById("p"+md5).setAttribute("title","お腹いっぱい"); return 1; } newstr=""; if(newcount > $maxhee){ newstr += "$hee$hee$hee(" + new String(newcount) + ")"; }else{ for(i=0;i$heeimg,-expires=>'now',-pragma=>'no-cache',-cache_control=>'no-cache'); exit; }else{ #ボタンとカウンターを表示 view(); } #--------------------------------------------------------------------------------------- sub set_count{ my $md5 = param('urlkey'); my $lockdir = "$dir/$md5".".dir"; my $retry=5; while(!mkdir($lockdir, 0755)){ if(--$retry <= 0){&err("busy file is locked");} sleep(1); } unless(-f "$dir/$md5"){ my $fh =IO::File->new("$dir/$md5",">"); undef $fh; } my $fh =IO::File->new("$dir/$md5","+<"); unless($fh){ rmdir($lockdir); err("permission error?"); }else{ my $count = $fh->getline; $count++; $fh->seek(0,0); $fh->print($count); $fh->truncate($fh->tell); undef $fh; } rmdir($lockdir); } sub get_count{ my($md5)=shift; my $fh =IO::File->new("$dir/$md5") or return 0; my $count = $fh->getline; undef $fh; return $count; } sub view{ my $keyurl = $ENV{'QUERY_STRING'} || $ENV{HTTP_REFERER}; err("参照URLがありません") unless $keyurl; my $md5=md5_hex($keyurl); my $ret; my $count =get_count($md5); $ret .= qq( ); $ret .= qq($aa); if($count > $maxhee){ $ret .= qq($hee$hee$hee($count)); }else{ for(my $i=0;$i<$count;$i++){ $ret .= $hee; } } if($count == 0){ $ret .= " "; } $ret .= qq(); print header(-type=>$type,-charset=>$charset); print $javascript; print jsencode($ret); exit; } sub err{ print header(-type=>$type,-charset=>$charset); print jsencode($ss,@_); exit; } sub jsencode{ my $str = join("",@_); my $ret; foreach(split(/\n/,$str)){ next unless $_; s/\x27/'/g; $ret .= "document.writeln('$_');\n"; } return $ret; }