#!/usr/local/bin/perl # # nph-minichat.txt は nph-minichat.cgi に名前変更してください。 ;# 簡易チャット3(iMODE・Web双方向対応/NPH仕様) version 6.2i ;# ;# This is Freesoft. ;# Copyright(c)2000-2006 by CGI-RESCUE # [基本構成] ( )内はパーミッション値 # # /public_html/(ホームページディレクトリ) # | # |-- /cgi-bin/(任意のディレクトリ) # | # |-- jcode.pl (644) ... version2.0以降のものを使用のこと! # |-- nph-minichat.cgi (755) # |-- minichat.dat (666) # [履歴] # # v1.0 26/FEB/96 初版 # v4.0 09/JUN/98 # ----------------ここを境にデータ互換はありません----- # v5.0 30/NOV/98 JavaScript組み込み、データ構造の変更 # v5.1 01/DEC/98 JavaScriptエラー修正 # v5.2 16/JAN/99 JavaScriptの採用の有無設定可能に # ----------------ここを境にデータ互換はありません----- # v6.0n 16/MAR/00 NPH仕様化 # v6.0i 15/JUL/00 iMODE側からも利用可能に改良 # v6.1i 12/NOV/04 レスポンスヘッダの記述ミスを修正 # v6.2i 29/DEC/06 レスポンスヘッダの記述ミスを修正 #----------------# # 初期設定 # #----------------# #◆名称 $title = '簡易チャット3'; #◆名称(iMODE用) 14文字以内推奨(半角カナOK) $title_imode = 'アイミニチャット'; #◆設定 $body = ''; #◆チャット表示行 $max = 20; #◆チャット表示行(iMODE用) .. 少なくしないと転送量オーバーで表示できなくなる可能性が高くなります $imax = 5; #◆終了リンク先のURL $modoru = 'http://www.rescue.ne.jp/cgis/minichat3/'; #◆iMODE用の終了リンク先のURL $modoru_imode = 'http://www.rescue.ne.jp/i/'; #◆終了リンク名 $modoru_name = '終了'; #◆minichat.datのパス設定 $chat_file = './minichat.dat'; #◆日本語コード変換ライブラリ(version2.0以降のものを使用のこと) require './jcode.pl'; #◆ホスト名をソースに表示 (1:する 0:しない) .. iMODEには表示されません $view_host = 1; #---------------------------------------------------------------------------- #--時間処理 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $date_now = sprintf("%d:%02d",$hour,$min); #ホスト取得 $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($host eq '') { $host = $addr; } if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; } #iMODEチェック if ($ENV{'HTTP_USER_AGENT'} =~ /DoCoMo/) { $iMODE = 1; } else { $iMODE = 0; } #--フォーム入力と解析 (項1=値1&項2=値2&項3=値3&…) read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); $buffer .= $ENV{'QUERY_STRING'}; @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'h2z_sjis(*value); # 半角カナ→全角カナ変換 &jcode'convert(*value,'sjis'); # SJIS変換 $value =~ s//>/g; $value =~ s/\t//g; $in{$name} = $value; } #--ログ取得 if (!open(DB,$chat_file)) { &error('システムエラー','チャットファイルが開けません.'); } @lines = ; close(DB); ($TIME,$DATE,$UNAME,$VALUE,$HOST) = split(/\t/,$lines[0],5); if ($in{'action'} eq "" || $in{'action'} == 2) { $time = time; &list(1); exit; } # 強制リロード if ($in{'uname'} eq "" && -s $chat_file == 0) { if ($iMODE) { &i204; } else { print "HTTP/1.0 204 No Content\r\n"; } exit; } if ($in{'uname'} eq "") { $in{'Value'} = ""; } if ($in{'uname'} eq "" && $in{'Value'} eq "") { if ($TIME eq "" || $in{'reload'} >= $TIME) { # 更新なし→ドキュメントを送信しない if ($iMODE) { &i204; } else { print "HTTP/1.0 204 No Content\r\n"; } exit; } else { $time = $TIME; &list(4); exit; } # 更新検知リロード } if ($in{'reload'} eq "" || $in{'uname'} eq "") { # 参加 if ($TIME eq "") { $TIME = time; } if ($in{'Value'} ne "") { $in{'uname'} = $in{'uname'}; ®ist; $time = time; } else { $time = $TIME; } &list(2); exit; } if ($in{'Value'} ne "" && $in{'uname'} ne "") { $time = time; ®ist; &list(3); exit; } if ($TIME eq "" || $in{'reload'} >= $TIME) { # 更新なし→ドキュメントを送信しない if ($iMODE) { &i204; } else { print "HTTP/1.0 204 No Content\r\n"; } exit; } else { $time = $TIME; &list(4); exit; } # 更新検知リロード sub list { if ($iMODE) { &list_imode; return; } print "HTTP/1.0 200 OK\r\n"; if ($in{'uname'} eq "") { $body =~ s/ $title $body

$title

EOF if ($in{'action'} eq "" || $in{'uname'} eq "") { print "名前 > "; } elsif ($in{'action'} == 2) { print "\n"; print "$in{'uname'} > "; } else { print "\n"; print "$in{'uname'} > "; } print " "; print "
\n"; foreach $line (@lines) { $line =~ s/\n//g; ($TIME,$DATE,$UNAME,$VALUE,$HOST) = split(/\t/,$line,5); $VALUE =~ s/&#\d+;//g; if ($view_host) { $host = " "; } else { $host = ""; } #--URL自動リンク $VALUE =~ s/"/"/g; $VALUE =~ s/>/>/g; $VALUE =~ s/(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/$1\:$2<\/a>/ig; #--Eメール自動リンク $VALUE =~ s/\b([-\w.]+@[-\w.]+\.[-\w.]+)\b/$1<\/a>/g; print "
\n"; print "$UNAME > $VALUE ($DATE)$host\n"; } print "
\n"; print "[
$modoru_name] [リセット]

\n"; #--このスクリプトの著作権表示(かならず表示してください) print "

<MiniCHAT-3>

\n"; print "\n"; exit; } sub list_imode { print "HTTP/1.0 200 OK\r\n"; print "Content-type: text/html\r\n\r\n"; print <<"EOF"; $title_imode $body
EOF if ($in{'action'} eq "" || $in{'uname'} eq "") { print "掠$title_imode
名前

"; } else { print ""; print "名前 $in{'uname'}
"; } print "内容

"; print "\n"; print "
\n"; if ($in{'line'} ne "") { $imax = $in{'line'}; } foreach $line (@lines) { $i++; if ($i > $imax) { last; } $line =~ s/\n//g; &jcode'z2h_sjis(*line); # 全角カナ→半角カナ変換 ($TIME,$DATE,$UNAME,$VALUE,$HOST) = split(/\t/,$line,5); #--URL自動リンク $VALUE =~ s/"/"/g; $VALUE =~ s/>/>/g; $VALUE =~ s/(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/$1\:$2<\/a>/ig; #--Eメール自動リンク $VALUE =~ s/\b([-\w.]+@[-\w.]+\.[-\w.]+)\b/$1<\/a>/g; #--携帯番号自動リンク $VALUE =~ s/(0\d0)(.)([-\d.]+)/$1$2$3<\/a>/g; print "
\n"; print "$UNAME>$VALUE($DATE)\n"; } print "
\n"; print "
$modoru_name リセット

\n"; #--このスクリプトの著作権表示(かならず表示してください) print "
略ミニチャット
\n"; print "\n"; exit; } sub regist { if ($max <= $#lines +1) { pop(@lines); } if ($in{'emoji'} ne "") { $in{'emoji'} = "&#$in{'emoji'};"; } unshift(@lines,"$time\t$date_now\t$in{'uname'}\t$in{'Value'}$in{'emoji'}\t$host\n"); if (!open(DB,"> $chat_file")) { &error('エラー','チャットファイルへ記録できません.'); } print DB @lines; close(DB); } sub i204 { local (@msg) = @_; local ($i); print "HTTP/1.0 200 OK\r\n"; print "Content-type: text/html\r\n\r\n"; print <<"EOF"; $title_imode $body  新しい会話はありません.
会話表\示せず戻る
会話表\示して戻る EOF } sub error { local (@msg) = @_; local ($i); print "HTTP/1.0 200 OK\r\n"; print "Content-type: text/html\r\n\r\n"; if ($iMODE) { print <<"EOF"; $title_imode $body

$_[0]

EOF print "
\n"; print <<"EOF"; 前に戻って下さい EOF } else { print <<"EOF"; $title $body $_[0]
EOF foreach $i (1 .. $#msg) { print "○$msg[$i] "; } print <<"EOF";
掲示板へ戻る EOF } exit; } __END__ 136,F991,63889,黒ハート 137,F992,63890,揺れるハート 138,F993,63891,失恋 139,F994,63892,ハートたち 140,F995,63893,わーい 141,F996,63894,怒った顔 142,F997,63895,落胆した顔 143,F998,63896,悲しい顔 144,F999,63897,ふらふら 146,F99B,63899,るんるん 147,F99C,63900,温泉 148,F99D,63901,かわいい 149,F99E,63902,キスマーク 150,F99F,63903,ぴかぴか 151,F9A0,63904,ひらめき 152,F9A1,63905,怒り 153,F9A2,63906,パンチ 154,F9A3,63907,爆弾 158,F9A7,63911,! 159,F9A8,63912,!? 160,F9A9,63913,!! 157,F9A6,63910,眠い 161,F9AA,63914,衝撃 162,F9AB,63915,飛び散る汗 163,F9AC,63916,汗 108,F975,63861,iモード 109,F976,63862,枠付iモード 110,F977,63863,メール 120,F982,63874,NEW 1,F89F,63647,晴れ 2,F8A0,63648,曇り 3,F8A1,63649,雨 4,F8A2,63650,雪 5,F8A3,63651,雷 9,F8A7,63655,牡羊座 10,F8A8,63656,牡牛座 11,F8A9,63657,双子座 12,F8AA,63658,蟹座 13,F8AB,63659,獅子座 14,F8AC,63660,乙女座 15,F8AD,63661,天秤座 16,F8AE,63662,蠍座 17,F8AF,63663,射手座 18,F8B0,63664,山羊座 19,F8B1,63665,水瓶座 20,F8B2,63666,魚座 86,F8F4,63732,グー 87,F8F5,63733,チョキ 88,F8F6,63734,パー 100,F945,63813,犬 101,F946,63814,猫