イタズラ防止というか、任意のキーワードに引っ掛かったかどうかをチェックして
それが一定のレベル繰り返された場合に自動的に外(任意のURL)に蹴り出す
方法です。
言葉に反応してパラメーターを溜めて、それに依って機能を発動させようという
予定の試作第一号なのでまだパラメーターもひとつしかありません。
まだCGI勉強途中でよくわかってないので、だれか興味ある人がいたら余分な
所とかヘボヘボな所をなおして機能的なモジュールにしてほしいです (^^;
(0)先ず、別途 emo.dat という名のファイルを(ここでは)用意します。
ファイルの中身には半角で" 0 "とだけ書いてください。(改行)
次にdic_hit.datとdic_nul.datという辞書ファイル()を用意します。
dic_hit.datには キー:返答 という通常の書式で、キーに、放り出しに
したい言葉を設定し他モノを用意します。返答では、あまりこのキーに
引っ掛かってると放り出すぞ!ってな内容を用意しておきましょう。
dicnul.datはこのチェックを素通りさせる為のダミーです。空で構いません。
以下、bot.cgiへの記入です。
(1)初期設定の部分に以下の一行を追加します。
##########初期設定##################################
$emotion = './emo.dat'; #このファイル名のファイルを用意
(2)"sub dic { "の一番あたま(最初の辞書読み込みの前)に
以下を追加。
#----------------ここから-----------------------------
$rand_limit = 100 ;
srand(time | $$) ; # 乱数の初期化
$x = int(rand(1) * $rand_limit) + 1 ;
#蹴り出しルーチン
#常に引っかけたい時はチェック用語辞書を100%に設定する。
#この部分には以前にMLにアップしたランダムで複数の辞書を
#管理する方法をそのままつかってます。
if(($x >= 1) && ($x < 51)){$dic_number = _hit ;} #チェック辞書
if($x >= 51){$dic_number = _nul ;} #dic9.datは空のダミー辞書
$selected_file = "./dic$dic_number.dat" ;
if (!open(handle_dicx,$selected_file)) {
$chat_tanu = "Dictionary file $selected_file cannot open.";
} else {
@dic1=<handle_dicx>;
close(handle_dicx);
foreach (@dic1) {
chop;
($in,$out)=split(/:/);
if ($chat =~ /$in/) {
push(@NEW1,$_);
}
}
if (@NEW1) {
&get_emotion;
#パラメーターの最高値を10に設定。
if(($c_anger >= 0) && ($c_anger < 10)){&plus_anger; &set_emotion;}
if ($c_anger >= 10) {
($in,$out) = split(/:/,splice(@NEW1, rand @NEW1, 1));
$out =~ s/c_name/$name/g;
$chat_tanu = "$out";
open(DB,"$chat_file") || die "Open error!\n";
@ines = <DB>;
close(DB);
print <<"EOF";
#------------この部分に出力するHTMLを書く----------------
<HTML>
<HRAD>
<title>放り出されました!</title>
<META HTTP-EQUIV="Refresh" CONTENT="0;URL=http://飛ばしたい先の URL ">
</HEAD>
<BODY>
怒って放り出されました!
</BODY>
</HTML>
#------------------HTML部分ここまで----------------------
EOF
&zero_anger;
exit(0);
}
} else {&min_anger;
#---------------ここまで--------------------------------------
(3)で、"sub dic{ "のルーチンの最後に"}"を二つ追加して閉じます。
場所は↓これ参照。
}}} <-ここに2つ追加
#書き込み処理
sub write {
(4)以下を最後の行「exit(0);」の上に追加。
#-------------ここから---------------------------------------
sub get_emotion {
if(!open(GET, "$emotion")) { &open_error; }
@data = <GET>;
close(GET);
$c_anger = $data[0]; $c_anger =~ s/\n//g; $c_anger =~ s/\r//g;
}
sub set_emotion {
open(IN,">$emotion");
print IN "$c_anger\n";
close(IN);
}
sub plus_anger{
&get_emotion;
if ($c_anger < 10){$c_anger += 3; #引っ掛かったらパラメーター+3
}else{
$c_anger = 10; #最大10まで
}
&set_emotion;
}
sub min_anger{
&get_emotion;
if ($c_anger > 0){$c_anger -= 1; #引っ掛からなかったらパラメーター-1
}else{
$c_anger = 0; #最低0まで
}
&set_emotion;
}
sub zero_anger{
&get_emotion;
$c_anger = 0; #爆発させたらパラメーターも0に戻る
&set_emotion;
}
#------------------ここまで------------------------------
放り出しの判定のバランス調節は、放り出しキーワードの入った辞書の選択率と、
キーワードに引っ掛かった場合にどれだけの割でパラメーターを増やし、
外れた場合にどれだけの割合で減らすか、およびパラメーターの最大値
を幾つにするかのバランスで調節してください。
ランダムジャンプのCGIとかを組み込めば予め登録した場所にランダムで
飛ばすのも出来ますよね。
#間違いその他苦情はワタシに御願いします。でも、勉強不足で
余り力になれない可能性大ですが(^^;
.