印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
MovableType リンクのないトラックバックを拒否するハック

迷惑トラックバックが増えてきたので,このサイトへのリンクがないトラックバックは受け付けないようにした。Movable Type 2.661 なのでハックで対応する。

■ ■ ■

迷惑トラックバックが止まらない。増える一方である。海外からのものが多いので,迷惑コメントの場合(nlog(n): 日本語限定コメントスパム対策)と同様の対策をしていた。

ところが,最近は日本語のブログからも来るようになってしまった。「儲ける」とか「情報商材」とかそんなのばかり。こちらの記事には全く関係がない。迷惑トラックバックをしてくるサイトでは,恐らく記事を読んでいない。nlog(n): 私がギャンブルで儲けようと思わない理由 にギャンブルで儲ける方法のトラックバックを送って来るのだからひどいものだ。つまり,Trackback Auto Discovery を使って自動的に送って来ているのだ。したがって,対策として一番簡単なのは Trackback Auto Discovery を削除してしまうことなのだが(nlog(n): 迷惑トラックバックを減らす方法),ブログとして正しくないそうなのでやめた。

とはいえ,毎日の作業が迷惑トラックバックの削除というのは実に虚しいので,何らかの対策をしたい。そこで,こちらの記事へのリンクがない場合は,トラックバックを受け付けないことにした。リンクのないトラックバックが全て悪いわけではないが(nlog(n): リンクなしトラックバックと時系列問題),量的には圧倒的に少ないので,無視させてもらうことにした。

最新の Movable Type 3.33-ja であれば,プラグインを入れるだけでOK。プラグインは MT 3.121 以降に対応していて,MT 3.2 以降ならさらに便利なプラグインもあるとのこと(naoyaのはてなダイアリー - Movable Type で言及リンクのない TrackBack ping を弾くプラグイン)。

しかし,このサイトは MT 2.661 なので,プラグインは使えない。その上,情報はとても少ない。できる方々は MT 3 や WordPress に移行してしまったからだ。寂しくなったもんだよ MT 2.x 界隈。ヒョォ〜って風が吹くよ。仕方ないので,泣きながらハックすることにした。これぞ四苦ハックなんちてププ。naoyaのはてなダイアリー - Movable Type で言及リンクのない TrackBack ping を弾くプラグイン をベースにしている。

Perl モジュールとしては,LWP::UserAgent と HTTP::Request が必要。 lib/MT/App/Trackback.pm を編集し,200行目付近に強調部分を挿入する。

    my $ping = MT::TBPing->new;
    $ping->blog_id($tb->blog_id);
    $ping->tb_id($tb_id);
    $ping->source_url($url);
    $ping->ip($app->remote_ip || '');

    ## Check if the pings do not have a link to this site
    ## by nlogn(n) http://nlogn.ath.cx/archives/000828.html
    ## based on BanNoReferTb plugin (http://d.hatena.ne.jp/naoya/20050901/1125553379)
    require LWP::UserAgent;
    my $ua = LWP::UserAgent->new;
    $ua->agent(__PACKAGE__ . "/0.01");
    $ua->timeout(10);
    my $res = $ua->request(HTTP::Request->new(GET => $ping->source_url));
    return $app->_response(Error =>
        $app->translate($res->status_line))
        unless ($res->is_success);
    my $myurl = MT::Blog->load($ping->blog_id)->site_url;
    return $app->_response(Error =>
        $app->translate("You must include a link to this site."))
        unless ($res->content =~ m/\Q$myurl\E/i);


    if ($excerpt) {

動作は次の通り。トラックバックが来ると,トラックバックしてきたサイトに HTTP でアクセスする。エージェントは「MT::App::Trackback/0.01」という名前になる。アクセスできなければ相手にエラーを返す。アクセスできたら中身を見て,こちらへのリンクがなければ,これもエラーを返す。リンクがあればそのまま通す。エラーメッセージは translate() で言語パックを通しているが,言語パックは用意していないため,そのまま英語で出力される。

返したエラーメッセージは,相手が Movable Type であれば管理画面のログに記録される。例えば次のようなものになる。

Ping 'http://nlogn.ath.cx/opentype/mt-tb.cgi/827' failed: You must include a link to this site.

参考にしたオリジナルのプラグインでは,エラーがあった場合,自分のブログのログにエラーを残すようになっているが,迷惑トラックバックでログが増えていくのもまた迷惑な話。なのでエラーは相手に返すだけでログには残さないようにしている。

各記事には,トラックバックの際の注意点として「トラックバックする記事には,この記事へのリンクを含めてください」を追加した。その代わり,日本語限定トラックバック対策は解除とした。

Posted by n at 2007-01-17 23:19 | Edit | Comments (0) | Trackback(0)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
Comments
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?