2005.04.27

コメントスパムが来た・・・(Movabletype)

私のページなど、見にくる人も少なくComment Spamなど関係無いとタカを括っていたら、ついにやってきた。
私のBlogより、私のところのサーバで運営して活発な書き込みを行っておられる方がおられるが、聞いてみたらいっぱい来るのを一生懸命削除していたとのこと。
気が付かず、申し訳ないことをした。
ということで、対策をほどこした。 と、言っても既に色々な手法がネットで述べられているので、そのまま使わせていただいただけだ。 有名サイトではもっと手の込んだ方法も必要なのだろうが、当サーバでは代表的な方法で一応止まったようだ。
防備録として、以下に書いておくが、考え方は自動でcomment.cgiにアクセスして投稿をするだけでは無効でちゃんとコメントの入力欄に書き込むことが必要(当然のこと)とするものである。

1.個別エントリーに追加

個別エントリーを開いて以下の赤字部分を追加する。
なお、nameとvalueの”YAMETEYO”は各自好きな語句を入れればよい。

<input type="radio" id="remember" onclick="rememberMe(this.form)"
name="bakecookie" /><label for="remember">はい</label>
<input type="radio"
id="forget" name="bakecookie" onclick="forgetMe(this.form)"
value="Forget Info" style="margin-left: 15px;" />
<label for="forget">いいえ</label>
<input type="hidden" name="YAMETEYO" value="YAMETEYO" >
<br style="clear: both;" />

2.その他の編集対象ファイル

以下の4つのファイルが編集対象

lib/MT/default-templates.pl
php/lib/function.MTCommentFields.php
lib/MT/Template/Context.pm
lib/MT/App/Comments.pm

(1) lib/MT/default-templates.pl の2カ所 (1140行付近, 編集後の1214行付近)

以下のように赤字部分を挿入

<input type="radio" id="remember"
name="bakecookie" onclick="rememberMe(this.form)" />
<label for="remember"><MT_TRANS phrase="Yes"></label>
<input type="radio" id="forget" name="bakecookie"
onclick="forgetMe(this.form)"
value="Forget Info" style="margin-left: 15px;" />
<label for="forget"><MT_TRANS phrase="No"></label>
<input type="hidden" name="YAMETEYO" value="YAMETEYO" >
<br style="clear: both;" />

同様に
lib/MT/Template/Context.pm の2カ所 (1244行付近、編集後の1332行付近)
php/lib/function.MTCommentFields.php の2カ所 (96行付近、編集後の165行付近)
も修正。

3.lib/MT/App/Comments.pm の編集

lib/MT/App/Comments.pm の 243行付近(編集後)に赤字部分を追加。
最初の赤字の部分は日本語を含まないコメントを排除するために付け加えたもので、2つ目がcomment.cgiのみを使った投稿防止です。

 if (!$q->param('text')) {
return $app->handle_error($app->translate("Comment text is required."));
}
if($q->param('text') !~ m/[x80-xff]/){
return $app->handle_error($app->translate("Can not accept
your comment."));
}
if (!$q->param('YAMETEYO')) {
return $app->handle_error("Please send comment via comment form.");
}
my ($comment, $commenter) = _make_comment($app, $entry);

これでブログを再構築して完了。


2005.03.11

MTのリンク支援(決定版)・・・(Movabletype)

先にMTPerlScriptというプラグインを使ってリンクを容易にする方法を書いた。

しかし、どうもスマートさに欠けるし、ホームページのhtmlも知らないし覚える気もなく、それでホームページを作るのを諦めていたが、Blogならhtmlを覚える必要も無いと聞いたのでやってみようという気になった人達には抵抗感を払拭できないものであった。

編集画面を開いて記事を書き込むのさえ抵抗感があり、投稿はほとんどメール送信によって行って編集画面での編集はあくまでも補助的にと思っている人達もいる。
こういう人達にも受け入れられるツールという意識で作成に乗り出した。

1. 操作のインターフェイス

違和感を感じさせないために、まず(図-1)のように編集画面のサイドメニューの「ファイルのアップロード」の下に「リンクの編集」のメニューを追加した。

menu.jpg
(図-1 サイドメニュー)

サイドメニューの表示のテンプレートは/MT/cms/tmpl/header.tmplです。
このheader.tmplのなかで、ファイルのアップロードの記述の次にこれをコピーして修正を加え「リンクの編集」への入り口を作る。

<TMPL_IF NAME=CAN_UPLOAD>

<li><a<TMPL_IF NAME=NAV_UPLOAD> class="here"</TMPL_IF> 
id="nav-upload" title="<MT_TRANS phrase="Upload File">" 
href="#" onclick="window.open('<TMPL_VAR NAME=
SCRIPT_URL>?__mode=
start_upload&
blog_id=<TMPL_VAR NAME=BLOG_ID>', 'upload', 'width=400,
height=450,resizable=yes')"><MT_TRANS phrase=
"Upload File"></a></li>

</TMPL_IF>

<TMPL_IF NAME=CAN_UPLOAD>
<li><a<TMPL_IF NAME=NAV_UPLOAD> class="here" </TMPL_IF>
 id="nav-link" title="リンクの編集" href="#" onclick=
"window.open('<TMPL_VAR NAME=STATIC_URI>link.cgi?blog_id=
<TMPL_VAR NAME=BLOG_ID>',
 'link', 'width=450,height=500,resizable=yes')">

リンクの編集</a></li></TMPL_IF>

変更の要点は

(1) id=”nav-link”とし、リンクの小アイコンを表示させる準備をする。

(2) titleはtitle=”リンクの編集”とし、メニューへの表示語句も「リンクの編集」とした。

(3) window.openしての呼び出し先を/MT_DIR/link.cgiにし引数として該当ブログのディレクトリーパスを渡すためwindow.open以降の”(“内を

 ('<TMPL_VAR NAME=STATIC_URI>link.cgi?blog_id=<TMPL_VAR NAME=
BLOG_ID>'

とする。

(4) メニューの「リンクの編集」の文字だけでは寂しいので他のメニューと同じように小アイコンを付けるために、エントリーの入力ウインドウの時に表示される「リンクアイコン」の影の薄いブルーを消した画像を作りnav-link.gifの名前で/MT/images/ディレクトリーに入れる。
  次に/MT/ディレクトリのstyles.cssを以下の赤字の部分を追加する。

.sub a#nav-upload 
{ background-image: url(images/nav-upload.gif); }
.sub a#nav-link 
{ background-image: url(images/nav-link.gif); }
.sub a#nav-comments 
{ background-image: url(images/nav-comments.gif); }

  これまでの修正で(図-1)のように「リンクの修正」が現れる。

2. ローカル・サイト・パス

ローカル・サイト・パスを<TMPL_VAR NAME=LOCAL_SITE_PATH>で取得しようとばかり考えていて/MT_DIR/lib/MT/App/内のmenuサブルーチンを修正したりしたが、どうも思わしくなく、結局MT::Blogライブラリーを使用して<TMPL_VAR NAME=BLOG_ID>でBlog_IDより得ることとした。
最初からMTライブライーを使うべきだったが、簡単に行くと思って深みにはまった。

3. link.cgiの作成

作成方針としては

・mt.cgiや/MT_DIR/lib/MT/App/CMS.pmとは完全に切り離して作成し、現モジュールを改造することに伴う無用な混乱を極力避ける。

・Main_indexはCategory_Archiveなどにもサイドパネルを付けた場合でも簡単に読み込めるようにlink.cgiでJavaScript形式の以下のようなファイルをlink.jsのファイル名で各ブログディレクトリーに吐き出す。

function getLinks(){

var link = new Array(); var data = new Array();

/* begin_data  */
link[0] = "ABCさん,http://uls.fam.cx/abc/";
link[1] = "DEFのページ,http://uls.fam.cx/def/";
link[2] = "GHIJさんのページ,http://uls.fam.cx/ghi/";
/* end_data  */


var html = "<h2>リンク</h2><ul>";
var num = link.length;

for(i = 0; i < num; i++){
    data = link[i].split(",");
    html += "<li><a href='"+data[1]+"'>"+data[0]+"</a></li>";
  }
  html += "</ul>";
return html;
}

そうして、link.cgiを作成して/MT_DIR/に入れたが全くの素人で数ヶ月前に定年を迎えた身にはテクニックも知識も不足していて、ここに見える形で公開できるような代物ではない。カットアンドトライのぼてぼてで恥ずかしい限りだが、一応最後にダウンロードできるように入れておく。

出来たlink.cgiをサイドメニューから起動するとlink.jsが無い場合は新たにlink.jsを作り、既に存在する場合はリンク先を一覧にして表示する。
使い方は簡単で追加したければ表示させる語句とURLを入れて「追加」ボタンを押す。
削除したければリストの削除したいところにチェックマーク(複数選択可能)を入れ削除ボタンを押すだけだ。(図-2)

window.jpg
(図-2 操作Window)

但し、削除と追加を同時にはできません。

結果は直ちにブログに反映させるため、Main_indexテンプレートの適当な場所(私は</head>の前に入れている)に以下を追加。

<script language="javascript" type="text/javascript"
 src="<$MTBlogURL$>link.js"></script>

そしてリンクを表示したい場所に

<script language="javascript" type="text/javascript">
<!--
document.write(getLinks());
//-->
</script>

全く快適だ。

link.cgi download file
header.tmpl download file
nav-link.gif


2005.02.23

MTのエントリーの編集画面・・・(Movabletype)

Movabletypeのエントリーの編集でエントリーの一覧を表示すると、タイトル表示が短くて分かり難いことがある。
全て日本語のタイトルであれば、ほどほどだが「Movabletypeの改良」、「Movabletypeの軽量化」などと入れると、どちらも”Movabletype”までで切れて、どちらがどちらかよく分からない。
調べると、lib/MT/App/CMS.pmで表示文字長を決めているが、文字コードをmt.cfgで”ja”としていると長さは11文字で日本語の2バイト文字もアルファベットなどの1バイト文字も一字は”1″と数えている。
“Movabletype”はそれだけで11文字だから、”Movabletype”だけで切れるのも当然だ。
“ja”でなければ22文字表示となっているが、英文混じりのタイトルを表示すると如何にも短すぎる。
perlの通常の文字列関数は1バイト文字長を1とすると、2バイト文字は2と数えるが、日本語の文字も1字は1と数える関数を作り気を利かせた積りであろうが、かえって不都合だ。

実際に表示される文字の幅の概ね2バイト文字は1バイト文字の2倍だから、標準関数で文字列の長さを指定した方が理にかなっていると思われる。
そこで、CMS.pmの2519行目の”ja”を”jja”として日本語使用の条件を成立しないようにし、2623行目の文字長を22から26とした。
下記に修正した部分を赤字で示す。

 } else {
if ($app->{cfg}->DefaultLanguage eq 'jja') {
$row->{title_short} = MT::I18N::substr_text($row->{title_short},
if $row->{title_short} && MT::I18N::length_text($row->{title
} else {
$row->{title_short} = substr($row->{title_short}, 0, 26) . '...'
if $row->{title_short} && $row->{title_short} =~ m(S{25,});
}
}

2005.02.22

みたびText-Formatter・・・(Movabletype)

text-formatterのpreの処理のまずさを修正し、http:で始まるURLはオートリンクの処置をほどこしたが、preの中味の”<“や”>”を&lt;や&gt:(便宜上”&”は全幅の文字で書いている)にエディター等を使って置換しなければならず、やっかいである。

そこで、性懲りもなく3たびUtil.pmを修正してエスケープ処理を自動で行わせるようにした。
しかし、Movabletypeのtext-formatter部は空行で分けたパラグラフ単位で処理しているので、1行づつの処理のように細かいことはできない。
結局、preの領域内で単純に&lt → &gt:   &lt → &lt:の処理を行ったが、これではpreの先頭指定の<pre> や終端の</pre>もエスケープ処理されてしまう。
また、赤字指定の&lt;font color=#ff0000&gt;と&lt;/font&gt;も変換され赤字指定が無効になる。
これらは、置き換え処理の最後に再度元に戻すという強引な方法で対処した。

だんだん、汚くなってきた。 いつか、行単位の処理で細かな処理を行うよう、全面的に書き換えた方が良いかも知れない。
しかし、細かい処理を重ねると、実行速度が低下する副作用も気になる。
ともかく、下記に追加個所を赤字にしてtext-formatter部分を修正したものを示す。
&、<ならびに>は便宜上全幅の文字で示している部分があるので要注意。

sub html_text_transform {
my $str = shift;
$str ||= '';
my @paras = split /r?nr?n/, $str;
my $preflag = 0;     # add var
for my $p (@paras) {
if($p =~ m@<pre@){   $preflag = 1;  } # add pre check.
if (!$preflag and $p !~ m@^</?(?:h1|h2|h3|h4|h5|h6|table|
ol|dl|ul|menu|dir|p|pre|center|form|fieldset|
select|blockquote|address|div|hr)@) {
if (!$preflag and $p =~ m@http@ and
$p !~ m@(href|jpg|JPG|jpeg|gif)@){
$p =~ s!(http:([^x00-x20()<>x7F-xFF])*)!
&make_link($1)!gex;
}
$p =~ s!r?n!<br />n!g;
$p = "<p>$p</p>";
}
        if($preflag){
$_ = $p; s!<!&lt;!g;   s!>!&gt;!g;
s!&lt;pre&gt;!<pre>!g;  s!&lt;/pre&gt;!</pre>!g;
s!&lt;font color=#ff0000&gt;!<font color =#ff0000>!g;
s!&lt;/font&gt;!</font>!g; $p = $_;
}
if($p =~ m@</pre@){  $preflag = 0;  }
}
join "nn", @paras;
}

2005.02.20

Movabletypeでリンクを容易に・・・(Movabletype)

Movabletypeで知り合いなどのリンクをサイドパネルに入れるのには通常メインインデックスに直接書き込むが、大したことは無いと言いながらネットに不慣れな人はhtmlの知識も十分でないから抵抗があると思う。

そこで、mtperlscriptというテンプレート内にperlで記述できるpluginが見つかったので、これを用いて簡単にリンクを付けられるようにした。
mtperlscritの圧縮ファイルを解凍して説明にしたがって、mt.cgiのあるディレクトリー内のextlibに移ってbradchoateというディレクトリーを作り、ここにperlscript.pmを入れる。

#mkdir bradchoate
#cd bradchoate
# cp (perlscript.pmのあるディレクトリー)/perlscript.pm .

次にperlscript.plをmt.cgiのディレクトリー内のpliginsにコピーする。
さて、リンクの記述だが、テンプレートの一覧のページで「新しいインデックス・テンプレートを作る」をクリックして「テンプレートの名前」にリンクリストとでも入れ、「出力ファイル名」をlink.txtと入れる。
そして、リンクしたい人の名前とリンク先URLを1つ以上のスペース(全角はダメ)を入れて下記のように記入する。

○○○さんへのリンク    http://www.abc.com/tarou/
△△△さんへのリンク  http://www.xyz.co.jp/
      ・
      ・

記入したら保存し再構築する。 これでlink.txtが出来上がる。
次にメインインデックスを開いて、リンクを表示したい場所に次のperl実行文を入れる。

<MTPerlScript>
print "<h2>リンク</h2>n";
print "<div class="sidebar">n";
print "<ul>n";
open(IN , "<$MTBlogSitePath$>link.txt");
@buff = <IN>;
close(IN);
foreach(@buff){
chomp;
if (/(http:([^x00-x20()<>x7F-xFF])*)/){
$link = $1;
s/$link//;s/ //g;
$data = $_;
$link = "'$link'";
}
if($data){
print "<li><a href=$link>$data</a></li>n";
}
}
print "</ul></div>n";
</MTPerlScript>

これで、保存して再構築すれば、リンクが貼られる。
以降はlink.txtに追加していけば良い。らくチンでしょう!!


« Previous | Next »