1)block.cgiを設置
block.lzhをダウンロード
解凍するとblock.cgiが出てきます。
block.cgiの1行目のPerlのパスを自分の環境に合わせて、nicky.cgiと同階層に設置してください。
パーミッションは705で動くはず。
2)nicky.cgiの末尾(#end of scriptの直前あたり)にでも、下記のサブルーチンを追加します。
sub spam_check {
my $name = $_[0];
my $uri = $_[1];
my $comment = $_[2];
my $spamdata = 'spamlist.cgi';
# NGリストにある文字列を弾く
open (DATA, $spamdata);
my @data = <DATA>;
close (DATA);
foreach (@data) {
chomp;
my ($ID, $type, $text) = split ("\t", $_);
if (($type eq 'Name') and ($name =~ /$text/)) {
return 0;
}
if (($type eq 'URI') and ($uri =~ /$text/)) {
return 0;
}
if (($type eq 'Comment') and ($comment =~ /$text/)) {
return 0;
}
}
return 1;
}
3)サブルーチン「NickyInputComment」の中の、コメントを書き込む部分を下記のように書き換えます。
if( ($CommentMsg =~ /\x01/) || ($CommentName =~ /\x01/) ){
$ille = 1;
}else{
$ille = 0;
open (WDC, ">>$NickyComment");
binmode (WDC);
print WDC "$CommentName\x02$CommentURI\x01";
print WDC "$CommentMsg\x01";
print WDC "$cdate\n";
close (WDC);
}
を
my $spamcheck = 0;
if( ($CommentMsg =~ /\x01/) || ($CommentName =~ /\x01/) ){
$ille = 1;
}else{
# NGワードチェック
$spamcheck = &spam_check ($CommentName, $CommentURI, $CommentMsg);
if ($spamcheck) {
$ille = 0;
open (WDC, ">>$NickyComment");
binmode (WDC);
print WDC "$CommentName\x02$CommentURI\x01";
print WDC "$CommentMsg\x01";
print WDC "$cdate\n";
close (WDC);
}
}
なお、すでにnicky! スパム対策とコメント通知のカスタマイズを実装済みの場合は、
my $spamcheck = 0;
if( ($CommentMsg =~ /\x01/) || ($CommentName =~ /\x01/) ){
$ille = 1;
}else{
# ASCIIチェック
$spamcheck = &ascii_check ($CommentMsg);
# NGワードチェック
if ($spamcheck) {
$spamcheck = &spam_check ($CommentName, $CommentURI, $CommentMsg);
}
if ($spamcheck) {
$ille = 0;
open (WDC, ">>$NickyComment");
binmode (WDC);
print WDC "$CommentName\x02$CommentURI\x01";
print WDC "$CommentMsg\x01";
print WDC "$cdate\n";
close (WDC);
}
}
みたいな感じで。
4)block.cgiにアクセスして、NGワードを登録
「名前」「URI」「コメント」のそれぞれに対して排除文字列が登録できるようになっています。
登録したリストは「spamlist.cgi」に記録されていて、nicky!にコメントが来たとき、このリストを読み込んでチェックをかけるという仕組み。
※改造は自己責任でどうぞ。一応、自分で設置したnicky! で試してはいますが、この改造を行った結果について責任は負えませんのであしからず。
また、改造方法について個別の質問もご遠慮くださいませ。
サブルーチンspam_checkについてなのですが,0009行目の
my @data = ;
は,おそらく
my @data = <DATA>;
の誤植ではないでしょうか.
ちょっと気になったので,投稿してみました.
my @data = <DATA>;ですね,失礼しました.
(誤植というより,ブラウザの解釈の問題でした.早計な書き込み,申し訳ありません.
ご指摘ありがとうございます。返信が大変遅くなってしまって申し訳ありません。
「<」をそのまま書いてしまったので、ブラウザに中身が表示されていませんでした。失礼いたしました。
上記サブルーチン「NickyInputComment」の書き換えの部分で、0006行目の
$spamcheck = &spam_check ($CommentName, $CommentURI, if ($spamcheck) {
は、明らかに文字列が中途で欠落していますね。
ちなみにこちらの予測で、0006,0007行目を、
$spamcheck = &spam_check ($CommentName, $CommentURI, $CommentMsg);
if ($spamcheck){
としてみたら、とりあえずうまく動いたようです。
この辺で少々戸惑いはしましたが、この機能自体には大変感謝しています。大事な追加機能を開発頂きまして、ありがとうございました。
前のレスがおかしくなっていたことに今気づきました。すみません。
エントリを書いた際に、「<」の半角をそのまま書いてしまったので、タグの開始記号と認識されて表示されなくなってしまっていました。現在は修正済みです。
>eguyanさま
おっしゃるとおりのミスです。さっそく修正いたしました。
ご指摘ありがとうございました!
nicky自体古いですが、気に入ってるので今でも使ってます(^^
が、しかしコメントスパムが多くなってきたので、
活用させていただきました!
ありがとうございます!!(^^b