#!/usr/local/bin/perl require 'jcode.pl'; #======================================================== # keiji.cgi # 日本語検索機能付き掲示板プログラム # email: kakihana@seikeigeka.or.jp # URL: http://www.kakihana.com/ # # 1997/08/19 Ver. 1.0 (C)Takeshi KAKIHANA # 1997/12/07 Ver. 1.1 Minor change #======================================================== #======================================================== #----------------- ファイルを設置する ----------------- #-------------------------------------------------------- # # Webページのホームディレクトリ(~/public_htmlなど)に # 次の3つのファイルを設置し、パーミッションを()内の # 数値に設定する。 # # keiji.cgi(755) ・・・このプログラムファイル # jcode.pl (755) ・・・漢字コード変換用プログラムファイル # keiji.new(666) ・・・最初は空のファイル、メッセージが追加される # keiji.old(666) ・・・最初は空のファイル、keiji.newから古いメッセージを移動する # #======================================================== #======================================================== #---------------- パラメータを設定する ---------------- #-------------------------------------------------------- #このプログラムの最初の行にはperlの置き場所を書く(telnetして'$which perl'で調べる) $tail ="/bin/tail"; # tailの置き場所(telnetして'$which tail'で調べる) $title ="カメレオン掲示板"; # タイトル文字 $wallpaper ="no"; # 背景に壁紙使用(yes/no) $bg_paper ="image/back.gif"; # 壁紙のファイル名 $c_bg ="#ffffee"; # 色コード:背景 $c_text ="#000000"; # 色コード:文字 $c_title ="#e20072"; # 色コード:タイトル文字 $c_name ="#007700"; # 色コード:名前 $c_email ="#000088"; # 色コード:emailアドレス $c_time ="#884400"; # 色コード:日付け・時刻 $c_ip ="#000000"; # 色コード:IPアドレス $c_namebg ="#b9ffdc"; # 色コード:メッセージ名前部分の背景 $c_msgbg ="#f2fff8"; # 色コード:メッセージ本体の背景 $c_msg ="#000000"; # 色コード:メッセージ本体の文字 $c_key ="#ff0000"; # 色コード:検索キーワード $c_warnbg ="#ffffdd"; # 色コード:入力ミス背景 $c_warntxt ="#ff0000"; # 色コード:入力ミス文字 # 背景色のデータ=(赤,緑,水,黄,紫,橙,桃) @c_namebg =("#ffc3c3","#b9ffdc","#a8eeff","#fffb9f","#c6c6ff","#ffd9ab","#ffc6f6"); @c_msgbg =("#fff0f0","#f2fff8","#e1f9ff","#fffef5","#ebebff","#fff9f2","#fff8fd"); $max =30; # 標準表示メッセージ数 $new_date ="1997/08/27"; # 新メッセージファイル開始日 $tablewidth=600; # メッセージ表示欄の横幅(ドット数) $keijicgi ="keiji.cgi"; # このプログラムのファイル名 $keijinew ="keiji.new"; # 新メッセージファイル名 $keijiold ="keiji.old"; # 旧メッセージファイル名 $url ="http://www.kakihana.com/$keijicgi"; # このプログラムのURL #-------------------------------------------------------- #---------------------- ここまで ---------------------- #======================================================== #========== 現在時間(JST)を取得 ========== @youbi_j=("Sun","Mon","Tue","Wed","Thu","Fri","Sat"); $ENV{'TZ'} = "JST-9"; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time); $mon++; $jst=sprintf("%02d/%02d/%02d(%s) %02d:%02d:%02d JST",$year,$mon,$mday,$youbi_j[$wday],$hour,$min,$sec); #========== パラメータの解析 ========== if ($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $str, $ENV{'CONTENT_LENGTH'}); } else { $str = $ENV{'QUERY_STRING'}; } @pairs=split('&', $str); $i=0; foreach $pair (@pairs){ ($item, $value)=split('=', $pair); # 半角スペースの復元とデコード $value=~ tr/+/ /; $value=~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; # 改行コードの統一 $value=~ s/\r\n/\n/g; $value=~ s/\r/\n/g; # 末尾の改行コードの除去 $value=~ s/\n$//; # 半角カナの変換と漢字コードの統一 &jcode'h2z_sjis(*value); &jcode'convert(*value, 'sjis'); # 特殊文字の変換 $value=~ s/&/&/g; $value=~ s//>/g; $item[$i]=$value; $i++; } $command=$item[0]; # コマンド $name =$item[1]; # 名前 $email =$item[2]; # emailアドレス $message=$item[3]; # メッセージ # messageのみ、途中の改行コードを
に変換 $message=~ s/\n/
/g; #================================== #========== 掲示板の表示 ========== #================================== if(($command eq "") || ($command eq "all") || ($command eq "old") || ($command eq "search")){ #----- HTMLファイル出力開始 ----- print "Content-type: text/html\n\n"; #----- 検索時のキーワード入力もれ ----- if(($command eq "search") && ($message eq "")){ print < 入力ミスです!

入力ミスです!


キーワードが入力されていません。

[←戻る]ボタンで戻ってください。


EOF exit; } #----- 掲示板表示開始 ----- print < $title EOF if($wallpaper eq "yes"){ print ""; }else{ print ""; } print <
$title


最新の$maxメッセージを表\示  $new_date以降のすべてを表\示  $new_dateより前のすべてを表\示

過去のメッセージに対する検索ができます。 キーワードを入力してボタンを押してください。

$new_date以降のメッセージから   $new_dateより前のメッセージから

キーワード:


あなたもメッセージを送ってください。

背景の色: ランダム  赤  緑  青  黄  紫  橙 

お名前:   email:


EOF #----- 通常/all/old/search処理 ----- if($command eq "all"){ $openfile=$keijinew; $line_max=99999; print "$new_date以降のすべてのメッセージが表\示されています。"; }elsif($command eq "old"){ $openfile=$keijiold; $line_max=99999; print "$new_dateより前のすべてのメッセージが表\示されています。"; }elsif($command eq "search"){ if($name eq "new"){$openfile=$keijinew;}else{$openfile=$keijiold;} $line_max=99999; if($name eq "new"){ print "$new_date以降"; }else{ print "$new_dateより前"; } print "のすべてのメッセージに対するキーワード《$message》の検索結果が表\示されています。"; }else{ $openfile=$keijinew; $line_max=$max; print "最新の$line_maxメッセージが表\示されています。"; } print "新しいメッセージが上です。

\n"; #----- ファイルからline_max行だけ逆順に読み出し ----- unless(open(DATA, "$tail -r $openfile |")){print"Can't open $openfile for input.\n"; exit(1);} $line_no=0; while(($one_line=) && ($line_no<$line_max)){ if($command eq "search"){ #----- 検索結果表示 ----- $from=0; while(($match=index($one_line, $message, $from))>=0){ $new_line1=substr($one_line, 0, $match); $new_line2="" . $message . ""; $new_line3=substr($one_line, $match+length($message)); $from=$match+length($new_line2); $one_line=$new_line1 . $new_line2 . $new_line3; } if($from>0){print "$one_line";} }else{ #----- 単純表示 ----- print "$one_line"; } $line_no++; } close(DATA); print < EOF exit; } #====================================== #========== メッセージ送信 ========== #====================================== if(index($command,"send")>=0){ #----- 名前・メッセージの入力もれ ----- if(($name eq "") || ($message eq "")){ print "Content-type: text/html\n\n"; print < 入力ミスです!

入力ミスです!


お名前とメッセージは必ず入力してください。

[←戻る]ボタンで戻ってください。


EOF exit; } #----- 正しい入力の場合ファイルに追加 ----- $command=~ s/send_//g; if($command eq "r"){ srand; $col=rand(7); }else{ $col=$command; } unless(open(DATA, ">>$keijinew")){print"Can't open $keijinew for append."; exit(1);} print DATA "
"; print DATA ""; print DATA "
$name/"; print DATA "$email$jst/"; print DATA "[$ENV{'REMOTE_ADDR'}]
$message

\n"; close(DATA); #----- 掲示板のreload ----- print "Location: $url" . '?' . "\n\n"; exit; }