#!/usr/bin/perl # ##################################################################################################### # # ライブ!ウィンドウ # Live!Window Version 1.00 (c)2004 by CGI-RESCUE http://www.rescue.ne.jp/ # # ・このプログラムは雛形であり、CGIプログラムを相応に操作できる方が利用できるものです。 # ・できるだけ解説は入れていますが、解釈は各自お願いします。個別のサポートはいたしかねます。 # # [設置構成] < >はパーミッションの相当値 # # |-- .htaccess <644> (※) ... 必要に応じて設置 # |-- index.cgi <755> ... このファイル # |-- jcode.pl <644> ... 日本語コード変換ライブラリ # |-- /tmp/ <777> ... ディレクトリを作成する # # [履歴] # 2004/08/05 1.00 リリース # # [おことわり] # # ・このシステムはアクセス者のIPアドレスでアクセス者を区別しているものであり、異なる者が同一のIPアドレスを # 有する環境からアクセスしている場合は正しく利用が出来なくなります。 # ・IPアドレスを自動割当されているアクセス者は、再接続によりIPアドレスが変わる場合があります。 # ・デフォルトで、5分を経過しても更新されていないアクセスは削除されます。調整するには下記プログラムを直接 # アレンジ(改造)してください。 # ##################################################################################################### # このファイルへの仮想パス $index = './index.cgi'; # (※)解説 # .htaccess を利用することが出来るサーバにおいては、DirectoryIndex index.cgi を設定しておけば、 # $index = './'; と設定することが出来、このファイルへのアクセスでファイル名を省略できます。 # 設定しなくても既にサーバ側で index.cgi が省略できるようになっている場合もあります。 # URLが/で終わるアクセスに対して補間されるファイル名を指定するものです。 # 参考) http://httpd.apache.org/docs-2.0/ja/mod/mod_dir.html#directoryindex # 作業用ディレクトリ(最後を/で閉じないこと) $tmp_dir = './tmp'; # 自動更新させる時間(単位:秒) $time = 60; # 日本語コード変換ライブラリ require './jcode.pl'; ##################################################################################################### $ID = $ENV{'REMOTE_ADDR'}; # IPアドレスを取得 if ($ID eq "") { &error("IP Not Found"); } if (!-e $tmp_dir) { &error("$! $tmp_dir"); } ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $now = sprintf("%02d:%02d",$hour,$min); read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); if ($ENV{'QUERY_STRING'} ne '') { $buffer .= "\&$ENV{'QUERY_STRING'}"; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($key,$val) = split(/=/,$pair); $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; &jcode'convert(*value,'sjis'); $val =~ s/\t//g; $val =~ s/\n//g; $val =~ s/\r//g; $val =~ s//>/g; $in{$key} = $val; } if ($ENV{'QUERY_STRING'} eq "0") { # オンラインチェック -------------------------------------------------------------------- if (-e "$tmp_dir/$ID") { open(F,"$tmp_dir/$ID"); $HANDLE = ; # ニックネーム $MESSAGE = ; # メッセージ @denpo = ; # 電報 close(F); if (@denpo) { # 電報がある場合の処理 $onLoad = "onLoad='alert(\"通知\\n\\n"; foreach (@denpo) { s/\n//g; s/>/>/g; s/ $tmp_dir/$ID"); # 電報だけ削除する print F $HANDLE; print F $MESSAGE; close(F); } } else { @pairs = split(/;/,$ENV{'HTTP_COOKIE'}); foreach $pair (@pairs) { ($key,$val) = split(/=/,$pair,2); $key =~ s/ //g; if ($key eq "uname") { $uname = $val; } if ($key eq "comment") { $comment = $val; } } open(F,"> $tmp_dir/$ID"); # 新規作成 if ($uname ne "") { print F "$uname\t" . $$ . "\n"; } else { print F "匿名\t" . $$ . "\n"; } if ($comment ne "") { print F "$comment\n"; } else { print F "\n"; } close(F); chmod(0666,"$tmp_dir/$ID"); } opendir(DIR,$tmp_dir); # オンライン中のIPアドレスを一覧 @online_lists = readdir(DIR); @online_lists = sort grep(!/^\./,@online_lists); foreach $id (@online_lists) { $day = -M "$tmp_dir/$id"; $hi = int($day); $hour = ($day - $hi)*24; $ji = int($hour); $minute = ($hour - $ji)*60; $hun = int($minute); if ($id ne $ID && -e "$tmp_dir/$id" && $hun > 5) { # 最終更新から約5分を経過したものを削除する unlink("$tmp_dir/$id"); # 削除 } else { if (open(F,"$tmp_dir/$id")) { # 一覧の準備 $HANDLE{$id} = ; # ニックネーム $HANDLE{$id} =~ s/\n//g; ($HANDLE{$id},$ps{$id}) = split(/\t/,$HANDLE{$id},2); $MESSAGE{$id} = ; # メッセージ $MESSAGE{$id} =~ s/\n//g; if ($MESSAGE{$id} ne "") { $MESSAGE{$id} = " > $MESSAGE{$id}"; } close(F); } push(@ONLINE,$id); } } if ($in{'action'} eq "set") { # 名前、メッセージ、電報の記録処理 if ($in{'target'} eq "denpo") { $ID_bak = $ID; $ID = $in{'id'}; } if (-e "$tmp_dir/$ID") { open(F,"$tmp_dir/$ID"); $HANDLE = ; # ニックネーム $HANDLE =~ s/\n//g; ($HANDLE,$ps) = split(/\t/,$HANDLE,2); $MESSAGE = ; # メッセージ @denpo = ; # 電報 close(F); open(F,"> $tmp_dir/$ID"); if ($in{'target'} eq "nic") { print F "$in{'key'}\t$ps\n"; $HANDLE{$ID} = $in{'key'}; $ps{$ID} = $ps; $in{'key'} =~ s/://g; $in{'key'} =~ s/;//g; print "Set-Cookie: uname=$in{'key'}\n"; } else { print F "$HANDLE\t$ps\n"; } if ($in{'target'} eq "mes") { print F "$in{'key'}\n"; $MESSAGE{$ID} = " > $in{'key'}"; $in{'key'} =~ s/://g; $in{'key'} =~ s/;//g; print "Set-Cookie: comment=$in{'key'}\n"; } else { if ($HANDLE eq "") { print F "\n"; } else { print F $MESSAGE; } } print F @denpo; if ($in{'target'} eq "denpo" && $in{'key'} ne "") { print F "$HANDLE{$ID_bak}($in{'ps'}) > $in{'key'} ($now)\n"; } close(F); } elsif ($in{'target'} eq "denpo") { $onLoad = "onLoad='alert(\"相手は退出したかもしれません.\")'"; } if ($in{'target'} eq "denpo") { $ID = $ID_bak; } $ENV{'QUERY_STRING'} = "0"; } $count = @ONLINE; $count += 0; # オンライン数 #■ ↓オンライン画面 print "Content-type: text/html\n\n"; print <<"EOF"; タイトル

Live ! ($count) $now

EOF foreach $id (@ONLINE) { if ($id eq $ID) { print "$HANDLE{$id} $MESSAGE{$id} [名前設定/コメント] -No.$ps{$id}
\n"; } # 本人 else { print "$HANDLE{$id} $MESSAGE{$id} -No.$ps{$id}
\n"; } # その他 } print <<"EOF";

{更新}

EOF } elsif ($ENV{'QUERY_STRING'} eq "1") { # メイン画面 ------------------------------------------------------------------------- #■ ↓メイン画面(右フレーム)print <<"EOF"; の下から EOF の上までの間にHTMLを記述します。 print "Content-type: text/html\n\n"; print <<"EOF"; タイトル {Live!更新}

解説

  • 左画面で赤で表\示されているのはあなたです。
  • 「匿名」は名前設定で変更できます。
  • コメントを書くと表\示されます。
  • No.は固有の数字です。もし同じ名前を設定した人がいたら、この番号で区別してください。 ただし、再ログインした場合は同じ人でも番号が変わっている場合もあります。
  • 電報を出したい場合は、相手の名前をクリックします。

このページに展開されるリンク以外(要するに他サイトへ飛ばすリンク)には必ず target=_top (フレーム解除命令)を入れてください。

良い例)Yahoo!JAPAN
悪い例)Yahoo!JAPAN

※ 相手は画面の前にいるとは限りませんし、既に他サイトへ移動している場合もあります。
※ 最終アクセスから5分以内のアクセス者が表\示されているものです。 EOF } else { # フレーム処理 ------------------------------------------------------------------------------------------------------ #■ ↓この記述で画面が分割されます。デフォルトでは左右分割30%になっています。 print "Content-type: text/html\n\n"; print <<"EOF"; タイトル <body> あなたの環境ではご利用いただけません. </body> EOF } sub error { # エラールーチン ----------------------------------------------------------------------------------------------- local (@msg) = @_; local ($i); print "Content-type: text/html\n\n"; print <<"EOF"; タイトル

$_[0]

EOF print "
    \n"; foreach $i (1 .. $#msg) { print "
  • $msg[$i]\n"; } print "
\n"; print "\n"; exit; }