December 26, 2003

Jeremy 氏作 blog_close_comments.pl を MT API を使って書き直してみる

[ Movable Type , Perl ]
MT の SPAM 対策に。 古い記事のコメントは close してしまう。 たしかに SPAM がくるのは、古いエントリばっかりですからね。

blog.bulknews.net にて Jeremy Zawodny's blog におけるコメントスパム対策方法 ('Auto-closing MT Comments on Old Blog Entries')が紹介されていました。

Dan is sick of comment spam and has realized that if he closes off old comments, it'll probably reduce comment spam. He's right. I've been doing this for months now and it's very effective. So, as my Giftmas gift to the blogging world, here's my whopping 26 lines of Perl code to do the job: blog_close_comments.pl.

Jeremy Zawodny氏の blog_close_comments.pl は古いエントリのコメントをクローズするスクリプト。SQL を直接叩いていますね。これだと BerkeleyDB な場合に使えませんし、データソースが記述された Blog::DBI クラスを用意する必要があります。(ネタで作ったっぽい気もしますけど...)

これを、Movable Type の Perl ライブラリを使って書くとこんな具合 (mt_close_comments.pl) でしょうか。ついでなので、Rebuild も一緒にやってしまいます。(スクリプトの動作は無保証です。) Movable Type API を使うので、データベースの種類などには依存しないところが利点。でも、たぶん誰も使わないとみた。(笑) 暇つぶしということで...。

#!/usr/local/bin/perl
# mt_close_comments.pl <days> <blog_id>
use strict;
use warnings;
 
# MTライブラリのパスを指定
use lib qw (/path/to/mt/lib);
 
use MT;
use MT::Blog;
use MT::Entry;
use MT::Util qw (offset_time_list);
 
# mt.cfg のパスを指定
our $MT_CFG = '/path/to/mt/mt.cfg'
 
my ($days, $blog_id) = @ARGV;
die "usage: $0 <days> <blog_id>" if (not defined $blog_id);
 
eval {
    my $mt = MT->new( Config => $MT_CFG );
    my $blog = MT::Blog->load( $blog_id ) or
	die "cannot load blog (blod_id = $blog_id)?n";
    
    # MT::Entry->load の range オプションに指定する時刻を求める
    # 参考: lib/MT/Template/Context.pm
    my @ago = offset_time_list( time - 3600 * 24 * $days, $blog);
    my $ago = sprintf "%04d%02d%02d%02d%02d%02d",
    $ago[5]+1900, $ago[4]+1, @ago[3,2,1,0];
     
    # 指定日付以前のエントリをロード
    my @entries = MT::Entry->load( { allow_comments => 1, 
				     blog_id => $blog_id,
				     created_on => [ 0, $ago ],
				     status => MT::Entry::RELEASE() },
				   { range => { created_on => 1 });
    my $count_comment_closed = 0;
    
    for my $entry (@entries) {
	$entry->allow_comments(2);
	$entry->save;
	$mt->rebuild_entry( Entry => $entry );
	$count_comment_closed++;
    }
     
    $mt->rebuild_indexes( Blog => $blog )
	if ($count_comment_closed > 0);
    print "Comments have been closed on $count_comment_closed blog entries.?n";
}; if (my $err = $@) {
    die $err;
}

指定した日付以前の MT::Entry インスタンスをどう読み出すのか理解するのに小一時間かかりました。 w

Posted by naoya at December 26, 2003 02:41 AM | トラックバック (0)  b_entry.gif
トラックバック [0件]
TrackBack URL: http://mt.bloghackers.net/mt/suck-tbspams.cgi/728
コメント [0件]