Image: Wandering around the world

[WP] Akismet de-spam View Hack, WP2.2対応版

スパムのちスパム、ところによりスパムということで相変わらずスパム多いですね。こんなに多いといちいちAkismetの画面なんて見てられません。

Akismet de-spam View HackというのはAkismetが食べたスパム一覧画面に表示されるスパムをマルチバイトを含むもの限定にするハックです。日本語ブログにつくコメントは日本語が多いでしょうから、スパムと誤判定された日本語コメントを救い出すのがとても簡単になります。

これはひろまささんが生み(本人はシャレのつもりだったみたいですが…)、ぼのさんが育てたすばらしいハックなのですが、あいにくと二人ともWP 2.0系のままorz お二人の解説もAkismet 1.xを対象に書かれたもので、そのままではWP 2.1系以降に同梱されているAkismet 2.0には適用できません。

ということで、WP 2.1(Akismet 2.0)対応版にしてみました……と書こうと思っていたらWP2.2RC2WP 2.2がリリースされたので、WP2.2(Akismet 2.0.1Akismet 2.0.2)対応版になりました。もちろんWP 2.1でも使えます。

Akismet管理画面に表示されるコメント/TBをマルチバイトを含むものに限定する

ハック前のAkismet

まずはかる~く肩慣らしでひろまささんのハック。akismet.phpをエディタで開いて、「$end = $start + 50;」を検索します。この行に続いて、以下のように修正してやればOKです。


if ( $page < 2 )
	$page = 1;

$start = ( $page - 1 ) * 50;
$end = $start + 50;
//
//$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_date DESC LIMIT $start, $end");
//$total = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = 'spam'" );
//
//Akismet de-spam View Hack respect for Hiromasa
$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' AND LENGTH(comment_content) <> CHAR_LENGTH(comment_content) ORDER BY comment_date DESC LIMIT $start, $end");
$total = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = 'spam'  AND LENGTH(comment_content) <> CHAR_LENGTH(comment_content) " );
//end
}

捕捉した全てのスパムとマルチバイトを含むものとを切り替えられるようにする

上のハックだと管理画面にはマルチバイトを含むものしか表示されなくなってしまいます。たまーに英語コメントをもらうグローバルなあなたには切り替え機能が必要…ということで、それがこちらのぼのさんハック。緑の文字を検索して、該当箇所を書き換えちゃってください。


if ( $page < 2 )
	$page = 1;

$start = ( $page - 1 ) * 50;
$end = $start + 50;
//
//$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_date DESC LIMIT $start, $end");
//$total = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = 'spam'" );
//
//Akismet de-spam View Hack respect for bono
switch ($_GET['akismet_spam_list'])
{
    case 'mb':
        $comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' AND LENGTH(comment_content) <> CHAR_LENGTH(comment_content) ORDER BY comment_date DESC LIMIT $start, $end");
        break;
    default:
        $comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_date DESC LIMIT $start, $end");
}
$total = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = 'spam'  AND LENGTH(comment_content) <> CHAR_LENGTH(comment_content) " );
//end
}

function akismet_stats() {
//$count = get_option('akismet_spam_count');
$count = akismet_spam_count();
//Akismet de-spam View Hack respect for bono
$mbs_count = mb_spam_count();
//end
if ( !$count )
	return;
$path = plugin_basename(__FILE__);
echo '<h3>'.__('Spam').'</h3>';
global $submenu;
if ( isset( $submenu['edit-comments.php'] ) )
	$link = 'edit-comments.php';
else
	$link = 'edit.php';
//Akismet de-spam View Hack respect for bono
//echo '<p>'.sprintf(__('<a href="%1$s">Akismet</a> has protected your site from <a href="%2$s">%3$s spam comments</a>.'), 'http://akismet.com/', clean_url("$link?page=akismet-admin"), number_format($count) ).'</p>';
echo '<ul><li>'.sprintf(__('<a href="%1$s">Akismet</a> has protected your site from <a href="%2$s">%3$s spam comments</a>.'), 'http://akismet.com/', clean_url("$link?page=akismet-admin"), number_format($count) ).'</li>';
if ( $mbs_count ) {
        echo '<li><strong><a href="edit-comments.php?page=akismet-admin&akismet_spam_list=mb">要チェック</a></strong>: スパムじゃないかもしれないものを '.$mbs_count.' 件捕獲中です。</li>';
} else {
        echo '<li>この中に日本語を含むものはありません。</li>';
}
echo '</ul>';
//end
}

add_action('activity_box_end', 'akismet_stats');

//Akismet de-spam View Hack respect for bono
function mb_spam_count() { // マルチバイトスパムの件数
  global $wpdb, $comments;
    $count = $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = 'spam' AND LENGTH(comment_content) <> CHAR_LENGTH(comment_content)");
    return $count;
}
//end

これによりダッシュボードのサイドバーに表示されるAkismetの表示がこのようになります。

スパムじゃないかもしれない表示

マルチバイトを含むものがないとこんな感じ。

スパムじゃないかもしれないものがないと…

注意!

ぼのさんのハックをそのまま採用したので、これによりAkismetが日本語を含むようになりました。文字コードをUTF-8Nにして保存して下さいね。でないと文字化けしちゃいます。あと実はマルチバイトで判定してるので、韓国語や中国語のスパムも日本語と同じように表示しちゃいます(´Д⊂。

また、Akismetのプラグインを直接書き換えていますので、WordPressのバージョンアップやAkismetのプラグインを個別にバージョンアップする場合に上書きアップロードしてしまうと、ハックがさっぱり消えてしまいます。

アナログな対処ですが、akismet.phpをコピーしてakismet.php.copyという名前にでもして複製しておくと、万が一上書きしてしまった場合に対応できると思います。

参考

3個のコメント

  1. Qray
    2007/5/16 水曜日 2:25:44 に投稿 | パーマリンク

    うーん、よくわからんけどトラックバックのスパムMesとかメールでのスパムなら・・・全自動メール砲をどっかにこしらえてしまうのは・・・駄目だよね(´・ω・`)

  2. Qray556
    2007/5/16 水曜日 2:30:09 に投稿 | パーマリンク

    う~んと・・・とりあえず。コメントスパムした椰子のサイトを特定して、ふ~いず掛けて、責任者のメアド探して・・・適当名前で海外のfreeサイトを借りて、アクセスすると自動的に10件くらいのメール送信するページ作って、そこにエロ画像なんか貼り付けて、適当な掲示板にURL貼り付けてなんてしちゃいけないぞ!約束だぞ(´・ω・`)

  3. 2007/5/17 木曜日 0:52:52 に投稿 | パーマリンク

    くれさんごめーん。スパムと判定されてAkismetが食べちゃってたよーw
    その方法昔のメールウィルスみたいなら効果あるんだけど、
    今はスパム乱射してきてるのがゾンビPCになってきてるから、意味無いんだよね。
    ゾンビになったらIXで通信を止めてくれるとかならいいのに(ぉ

3個のトラックバック

  1. satou30.info さんからのコメント 2007/8/1 水曜日, 5:18:08

    aksimetハック…

    yoshid50がたびたびspam扱いされるのが不憫だったので、akismetでググってみたら、よさげな対処法がみつかった。
    [WP] Akismet de-spam View Hack, WP2.2対応版
    Akismet de-spam View HackというのはAkis…

  2. 岩家ぶろぐ さんからのコメント 2007/9/12 水曜日, 0:17:48

    Akismet de-spam View Hack - 非スパム探しの悩みを解決してくれる hack…

    はじめに
    1日数百件...世界のどこかから当ぶろぐへやってくるトラックバックスパムの数です.
    以前に導入したプラグイン akismet がそれらを食べてくれるため,一見問題がないよう….

  3. satou30.info - akismetハック さんからのコメント 2008/1/12 土曜日, 22:15:09

    [...] [WP] Akismet de-spam View Hack, WP2.2対応版 Akismet de-spam View [...]

コメントを書く

Your email is never shared. * 印の項目は必須項目です。

*
*