#!/usr/bin/perl #↑一行目のパスはサーバーによって違います。サーバに合わせて変更してください。 #このperlプログラムは、perl5に対応しています。 #------------------------------------------------------------------------------- # # ◇◆◇ MyDiary_Cute Ver1.5◇◆◇ # by Mamiko.S(http://www.nmt.ne.jp/~mamiko/) # #------------------------------------------------------------------------------- # ・著作権表示は消さないで使ってください。 # ・このプログラムを用いた結果、利用者に万一何らかの損害が生じても作者は責任を負えません。 # ・スクリプトの無断再配布や、有償で他人に設置するといった行為は固く禁じます。 # # このPerlプログラムは営利を目的としない個人ホームページでの利用を前提として、 # 無料で提供しています。営利を目的としたサイトでご利用の場合は、 # 必ず mamiko@nmt.ne.jp へご連絡ください。 # # ・2002/1/1 修正 1/1日付のバグを修正。Ver1.5に変更。 # ・2001/12/2 変更 当月以外の日記も削除できるように変更。Ver1.4に変更。 # ・2001/4/26 修正 削除のバグ(同じ日の日記が一気に削除されてしまう)を修正。Ver1.3に変更。 # ・2001/4/21 修正 祭日の設定を修正。 # ・2001/3/5 修正 WinのNetscape4.0で日付変更できないJavaScriptエラーをさらに修正。 # ・2001/3/4 修正 WinのNetscape4.0で日付変更できないJavaScriptエラーを修正。 # ・2001/2/7 変更 日付の入力ができるように変更。Ver1.2に変更。 # ・2001/2/5 追加 カレンダー表示を追加。Ver1.1に変更。 # ・2000/8/26 修正 MyDiaryVer1.1をモトにMyDiary_Cuteを製作。 #------------------------------------------------------------------------------- # ◇◆◇↓環境に合わせて設定する変数 ◇◆◇ #------------------------------------------------------------------------------- #-----(jcode.plを使用) require './jcode.pl'; #-----(管理者のパスワード) $password = "sekaiseihuku"; #-----(このCGIを置くキャビネット(スペース)別サーバからの投稿を防ぐために設定するが、 # サーバやブラウザによっては投稿できなくなる場合がある、そのときは空にしておく) #$cabinet = "http://www.tokyoweathermap.com/"; #-----(戻り先のURL) $back_URL = "../index.html"; #-----(このCGIのファイル名) $script_name = "diary_c.cgi"; #-----(日記帳のタイトル) $title = "What's new?"; #-----(画像のフォルダへのパスを指定) $img_folder = "../images"; #-----(12ヶ月分の背景色。ページの色が月ごとに変化します。) $body[1] = ''; $body[2] = ''; $body[3] = ''; $body[4] = ''; $body[5] = ''; $body[6] = ''; $body[7] = ''; $body[8] = ''; $body[9] = ''; $body[10] = ''; $body[11] = ''; $body[12] = ''; #-----(日記帳のタイトル部分のタグ) $headline=< $title END #-----(日記帳データを格納するフォルダ名を指定。(名前だけ指定する)) $diary_fold = "diaries"; #-----((一応)日記帳データ1ファイルに登録するデータ件数の最大値) $sum = 50; #-----(工事中の設定フラグ、1:工事中、0:工事終了) $const_flg = 0; #-----(リンクを貼った場合のターゲット先) $target = "_blank"; #-----(日記表示部分の背景色・白に固定) $diary_bgcolor="white"; #-----(日記表示部分の見出し色) $diary_hdcolor = "purple"; #-----(タグを使うかどうか、1:使う、0:使わない) $tag = 0; #-----(アクセス禁止のホストを書く) @illegal_host = ('yellow.javanet.com','cacheflow.frontiernet.net'); #-----(日付の書式、1:Sun Jul 09 2000 10:22:26 # 2:Sun Jul 09 2000 # 3:2000年7月9日(日)10:22:26 # 4:2000年7月9日(日) # ) $date_type = 2; #-----(各月の日記へリンク表示) @mon_str = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); #-----(表示月以外の月の日記へリンク表示のデザイン---スタイルシートで指定) $style1 =< table{ FONT-SIZE: 11pt; } .table1{ /* 枠の色 */ background-color:white; } .td1{ /* 各年のセルの色 */ background-color:chocolate; } .td2{ /* 各月のセルの色 */ background-color:sandybrown; } .font1 { COLOR: MediumSlateBlue; FONT-FAMILY: "comic sans ms"; TEXT-ALIGN: justify; } END #------------------------------------------------------------------------------- # ↓ここからカレンダーの設定値 #------------------------------------------------------------------------------- #-----(12ヶ月分のカレンダーの色をセット。色が月ごとに変化します。) @backCol = ("pink","chocolate","DeepSkyBlue","#99cc00","orange","gold","#b3f47d","cyan","#99cc00","orange","#b3f47d","violet"); #-----(祭日をセット) @holiday = ([1,14],[2,11],[3,21],[4,29],[5,3],[5,4],[5,6],[7,20],[9,16],[9,23],[10,14],[11,4],[11,23],[12,23]); #-----(曜日の表示) @weekStr = ("s","m","t","w","t","f","s"); #-----(月の表示) @monthStr = ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"); #-----(休日の色) $holiCol = "red"; #-----(土曜の文字の色) $satCol = "blue"; #-----(文字のサイズ) $fontSize = 1; #------------------------------------------------------------------------------- #◇◆◇↑設定値を変更するのはここまで!◇◆◇ #=== ここ以降を変更する場合はある程度の知識が必要です ==== #------------------------------------------------------------------------------- #-----------(著作権表示 ◆◇◆変更不可◆◇◆) $footerline =< (C)2000-2001 Mamiko's Page

END #-----------(ホストの取得) $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($host eq $addr || !$host) { $host = gethostbyaddr(pack('C4',split(/\./,$addr)),2) || $addr; } #----------(ホストの禁止) foreach $ad(@illegal_host){ if($host =~ /$ad/i){ &error('エラー','ただいま工事中です。しばらく開きません。'); } } #----------(工事中) if($const_flg == 1){ &error('エラー','ただいま工事中です。しばらく開きません。'); } #----------(入力データの取得) if($ENV{'REQUEST_METHOD'} eq 'GET'){ $query_string=$ENV{'QUERY_STRING'}; }else{ if($ENV{'CONTENT_LENGTH'} > 65536){ &error('エラー','入力データが多すぎます。'); } read(STDIN, $query_string,$ENV{'CONTENT_LENGTH'}); } &qs_decode; #-----------(日付&時間の取得) ($sec,$min,$hour,$mday,$mon1,$year,$wday,$yday,$isdst) = localtime(time); if($qs{'YEAR'} ne "" && $qs{'MONTH'} ne "" && $qs{'DAY'} ne ""){ use Time::Local; if($qs{'DAY'} > 31 || $qs{'DAY'} < 1){&error('入力エラー','正しい日付を入れてください。');} if($qs{'MONTH'} > 12 || $qs{'MONTH'} < 1){&error('入力エラー','正しい日付を入れてください。');} #-----(秒、分、時が0となっていたのを現在の時間を取るように変更。) $time = timelocal($sec,$min,$hour,$qs{'DAY'},$qs{'MONTH'}-1,$qs{'YEAR'}); }else{ $time = time; } ($sec,$min,$hour,$mday,$mon1,$year,$wday,$yday,$isdst) = localtime($time); $number = sprintf("%d%02d%02d%02d%02d%02d",1900+$year,$mon1+1,$mday,$hour,$min,$sec); #-----------(日付書式の設定) if($date_type <= 2){ $wday = ('Sun','Mon','Tues','Wed','Thur','Fri','Sat')[$wday]; $mon2 = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mon1]; if($date_type==1){ $timestring = sprintf("%s %s %02d %d %02d:%02d:%02d",$wday,$mon2,$mday,1900+$year,$hour,$min,$sec); }elsif($date_type==2){ $timestring = sprintf("%s %s %02d %d",$wday,$mon2,$mday,1900+$year); } }elsif($date_type <= 4){ $wday = ('(日)','(月)','(火)','(水)','(木)','(金)','(土)')[$wday]; if($date_type == 3){ $timestring = sprintf("%d年%d月%d日%s %02d:%02d:%02d",1900+$year,$mon1+1,$mday,$wday,$hour,$min,$sec); }elsif($date_type == 4){ $timestring = sprintf("%d年%d月%d日%s",1900+$year,$mon1+1,$mday,$wday); } }else{ $wday = ('Sun','Mon','Tues','Wed','Thur','Fri','Sat')[$wday]; $mon2 = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mon1]; $timestring = sprintf("%s %s %02d %d %02d:%02d:%02d",$wday,$mon2,$mday,1900+$year,$hour,$min,$sec); } #-----(処理の振り分け、ACTION、PASSをみる) if(&certain($qs{'PASS'})){ if($qs{'ACTION'} eq "regist"){ #-----(発言登録処理) &diary_regist; &diary_list(0); } elsif($qs{'ACTION'} eq "remove"){ #-----(発言削除処理) &diary_remove; &diary_list(0); } elsif($qs{'ACTION'} eq "removelist"){ #-----(削除画面一覧) &removelist_view; } else{ &diary_list(1); } } else{ &diary_list(0); } exit 0; #-----(パスワード認証処理) sub certain($){ my $pass = shift @_; my $flg = 0; if($password eq $pass){ $flg = 1; } $flg; } #-----(FORM形式のデータを取り出す処理) sub qs_decode{ #-----(入力データのデコードとハッシュ変数への格納) for(split(/&/,$query_string)){ tr/+/ /; s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/ge; ($key,$value) = split(/=/,$_,2); #-----(一度EUCに変換して処理する) &jcode::convert(\$value,"euc"); if ($tag) { #----(日記に書き込めないタグを設定する) if ($value =~ //i) { &error('入力エラー','tableタグは使えません'); } if ($value =~ //i) { &error('入力エラー','metaタグは使えません'); } if ($value =~ //i) { &error('入力エラー','preタグは使えません'); } if ($value =~ /
タイトル
日付 存在する日付を選択してください。
お天気 晴 雲 雨 雪 雷
内容
FORMEND } #-----(日記一覧表示) sub diary_list($){ my $flg = shift @_; print "Content-type: text/html\n\n"; print ""; print "\n"; print "\n"; print "$title\n"; print "$style1\n"; print "\n"; if($qs{'FILENAME'}){ $filename = $qs{'FILENAME'}; $diary_file = $qs{'FILENAME'}.".dat"; }else{ $diary_file = sprintf("%d%02d",1900+$year,$mon1+1).".dat"; $filename = sprintf("%d%02d",1900+$year,$mon1+1); #-----(もしもファイルが無い場合、5つさかのぼって過去のファイルを探してみる) my $retry_cnt = 5; my $diary_file_dmy = $diary_file; my $filename_dmy = $filename; my $month = $mon1; my $year_ = $year; while(!-e "./$diary_fold/$diary_file"){ if($retry_cnt <= 0){ $diary_file = $diary_file_dmy; $filename = $filename_dmy; last; } if($month <= 0){ $year_--; $month = 11; }else{ $month--; } $diary_file = sprintf("%d%02d",1900+$year_,$month+1).".dat"; $filename = sprintf("%d%02d",1900+$year_,$month+1); $retry_cnt--; } } $num = substr($filename,-2,2); print "$body[$num]\n"; print "$headline\n"; print "
"; print ""; print "
\n"; &calender(substr($filename,0,4),$num); print "\n"; &diary_link; print "
\n"; print "

"; print ""; print "
"; print ""; if($date_type <= 2){ printf "%d %s",substr($diary_file,0,4),@mon_str[substr($diary_file,4,2)-1];; }elsif($date_type <= 4){ printf "%d年%d月",substr($diary_file,0,4),substr($diary_file,4,2); } print " | back"; print ""; print "
\n"; if($flg){ #-----(管理者モードのとき) &diary_form; } if(-e "./$diary_fold/$diary_file"){ open(DB,"<./$diary_fold/$diary_file")|| &error('ファイルオープンエラー1','データファイルが開きません。'); @lines = ; close(DB); @lines = reverse(@lines); foreach $line(@lines){ ($number,$time,$title,$tenki,$value,$hostname) = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($line =~ /("(?:[^"]|"")*"),/g); if($tag == 0 ){ #-----(タグを使わない設定のとき) #-----(リンクの記述があれば、リンクタグを書く) if($value =~ /http:\/\/[^][^()<>=\s]*/){ $value =~ s/(http:\/\/[^][^()<>=\s]*)/$1<\/a>/g; } } if($title eq ''){ $title = "(無題)"; } @tenkis = split(/,/,$tenki); $tenki_img = ""; foreach $ten(@tenkis){ $tenki_img = $tenki_img.""; } #-----(日記の出力) print <
$title $time $tenki_img
$value


END } } print "$footerline\n"; print "\n"; } #-----(表示月以外の月の日記へリンク表示) sub diary_link{ if(!opendir(DIR, "./$diary_fold")){ return 0;}; while($fname = readdir(DIR)){ $path = "$fname"; if($fname =~ /(.*)\.dat/) { $a = substr($fname,0,4); $b = sprintf("%d",substr($fname,4,2)); $links{$a}[$b] = $1; } } #----($bは、1から12) for $key(sort{$b <=> $a} keys %links){ print ""; print "
\n"; print ""; print "\n"; print "\n"; for($i=1; $i <= 12; $i++){ if($links{$key}[$i]){ $mon = $mon_str[$i-1]; print ""; }else{ print ""; } } print "
"; print "$key"; if($filename eq $links{$key}[$i]){ #-----(表示月ならリンクしない) print "$mon\n"; }else{ print "$mon\n"; } print ""; print "*
\n"; print "
\n"; } closedir(DIR); } #-----(日記登録処理) sub diary_regist{ #-----(別のページからこのCGIへの投稿を排除する処理) if($cabinet ne ""){ $ref = $ENV{'HTTP_REFERER'}; $ref =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/ge; if (!($ref =~ /$cabinet/i)) { &error('投稿できません','別のサーバからの投稿は受付けません。'); } } $diary_file = sprintf("%d%02d",1900+$year,$mon1+1).".dat"; if(-e "./$diary_fold/$diary_file"){ open(DB,"<./$diary_fold/$diary_file") || &error('ファイルオープンエラー2',"データ保存用ファイル$diary_fileが開きません。"); eval 'flock(DB,2);'; #--- 2000.6.26 @lines = ; close(DB); $lines = @lines; #-----(配列の要素数) if ($sum < $lines + 1) { shift(@lines); #-----(lines配列の要素から古い要素を取り出す) } }else{ open(DB,">./$diary_fold/$diary_file"); #-----(新しく開く) chmod(0644,"./$diary_fold/$diary_file"); #-----(属性を設定) } $tenkis = join(",",@tenkis); #-----(linesに新しい要素を追加する) push(@lines,"\"$number\",\"$timestring\",\"$qs{'TITLE'}\",\"$tenkis\",\"$qs{'VALUE'}\",\"$host\",\n"); open(DB,">./$diary_fold/$diary_file") || &error('ファイルオープンエラー',"データ保存用$diary_fileファイルが開きません。"); eval 'flock(DB,2);'; #--- 2000.6.26 print DB @lines; #ファイルに書き出し close(DB); } #-----(日記削除処理) sub diary_remove{ my $flg = 0; #-----(別のページからこのCGIへの投稿を排除する処理) if($cabinet ne ""){ $ref = $ENV{'HTTP_REFERER'}; $ref =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/ge; if (!($ref =~ /$cabinet/i)) { &error('投稿できません','別のサーバからの投稿は受付けません。'); } } if($qs{'FILENAME'}){ $diary_file = $qs{'FILENAME'}.".dat"; }else{ $diary_file = sprintf("%d%02d",1900+$year,$mon1+1).".dat"; } if(-e "./$diary_fold/$diary_file"){ open(DB,"<./$diary_fold/$diary_file")|| &error('ファイルオープンエラー1','データファイルが開きません。'); @lines = ; close(DB); foreach $line(@lines){ $temp = $line; ($number,$time,$title,$tenki,$value,$hostname) = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($line =~ /("(?:[^"]|"")*"),/g); #-----(引数の発言NOと一致するか) foreach $delnum(@delnumber){ if($number eq $delnum){ $flg = 1; } } if($flg == 0){ #-----(ナンバーが合わないときに$lineをNEWに出力) push(@NEW,$line); } $flg = 0; } } #-----(配列全体をコピー) @lines = @NEW; open(DB,">./$diary_fold/$diary_file") || &error('ファイルオープンエラー2','データ保存用ファイルが開きません。'); eval 'flock(DB,2);'; #--- 2000.6.26 print DB @lines; #ファイルに書き出し close(DB); } #-----(削除候補の日記一覧) sub removelist_view{ print "Content-type: text/html\n\n"; print "$title\n"; print "\n"; print "\n"; print "\n"; print "$body\n"; print "$headline\n"; print "

"; print "
\n"; print "\n"; print "\n"; print "
"; if($qs{'FILENAME'}){ $filename = $qs{'FILENAME'}; $diary_file = $qs{'FILENAME'}.".dat"; }else{ $filename = sprintf("%d%02d",1900+$year,$mon1+1); $diary_file = sprintf("%d%02d",1900+$year,$mon1+1).".dat"; } print "\n"; if(-e "./$diary_fold/$diary_file"){ open(DB,"<./$diary_fold/$diary_file")|| &error('ファイルオープンエラー1','データファイルが開きません。'); @lines = ; close(DB); @lines = reverse(@lines); print ""; foreach $line(@lines){ ($number,$time,$title,$tenki,$value,$hostname) = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($line =~ /("(?:[^"]|"")*"),/g); if (length($title) > 20) { $title = substr($title,0,18); $title = $title . '..'; } if (length($value) > 60) { $value = substr($value,0,60); } #-----(タグを無効にする) $value =~ s//>/g; print ""; } print "
\n"; print ""; print "$time $title $value\n"; print "
\n"; print "
"; print ""; print "\n"; print "\n"; print ""; print ""; print "\n"; print "\n"; print "
\n"; print ""; print "
\n"; } print "\n"; } #----------(カレンダー) sub calender{ my($ayear,$amonth) = @_; my $day_end; $day_end = daymonth($ayear,$amonth); # print "Content-type: text/html\n\n"; print "\n"; print ""; print "\n"; print ""; print ""; print "\n"; print "\n"; print "\n"; print "\n"; print ""; $wday = getwday($ayear,$amonth,1); $day = -$wday + 1; for($j=1; $j<=6; $j++){ print ""; for($k=1; $k<=7; $k++){ if( 1 <= $day && $day <= $day_end ){ if($day == $aday){ $bgcol = "yellow"; }else{ $bgcol = $backCol[$amonth-1]; } if( $wday == 0 ){ $fontcol = $holiCol; }elsif( $wday == 6 ) { $fontcol = $satCol; }else{ $fontcol = "black"; } for( $h=0; $h < @holiday; $h++ ){ if( ( $holiday[$h]->[0] == $amonth ) && ( $holiday[$h]->[1] == $day ) ){ $fontcol = $holiCol; } } print "\n"; $wday++; } else { print "\n"; } $day++; } print "\n"; $wday = 0; } print "
$ayear.$monthStr[$amonth-1]
$weekStr[0]$weekStr[1]$weekStr[2]$weekStr[3]$weekStr[4]$weekStr[5]$weekStr[6]
\n"; print "$day 
\n"; } #----------(曜日を求める) sub getwday{ my($year,$mon,$mday) = @_; if($mon == 1 or $mon == 2){ $year--; $mon += 12; } int($year + int($year/4) - int($year/100) + int($year/400) + int((13*$mon+8)/5) + $mday) %7; } #----------(閏年を判別) sub leapyear{ my $year = $_[0]; if($year%4==0 && $year%100!=0 || $year%400==0){ return 1; }else{ return 0; } } #----------(月の日数を求める) sub daymonth{ my($year,$month) = @_; my @day = (31,28,31,30,31,30,31,31,30,31,30,31); if($month==2 && leapyear($year)){return 29;} return @day[$month-1]; } #-----(エラー表示) sub error{ my($msg1,$msg2) = @_; #---(↑引数を受け取る) print "Content-type: text/html\n\n"; print "エラーメッセージ"; print "\n"; print "\n"; print "$body\n"; print ""; print "
"; print "\n"; print ""; print "
\n"; print "

$msg1

\n"; print "

$msg2

\n"; print " ブラウザの戻るボタンで戻ってください。"; print " 戻る\n"; print "
"; print "
"; print "\n\n"; exit 0; }