今天打开wordpress,我晕,留言数已经有10多万。 老外们工作还真积极,这几天垃圾评论是越来越厉害了。 我想起前几天还说要自己写一个能分页管理评论的hack呢。不过现在实在没空。 于是想到,管他垃圾不垃圾,我现在暂时先全删除了再说。 于是打phpmyadmin,把ID>350的记录全删除了。 这下再打开,不过发现马上就又有了几十条记录了。看来垃圾生产机器工作真够负责的啊,简直是日夜不停了。 想起有一个什么反垃圾评论的插件,google一下,叫akismet,装上一看,倒,还要我去申请一个API key才能用。 本来特懒,不过现在垃圾评论这么狂,只好去注册。 结果,打了好几次地址,wordpress.com/api-keys都打不开,没办法。我想,那我做一个hack,把用api key认证的这一步去掉不行吗? 打开akismet.php,哈哈,原来如此简单,修改过程如下: 找到function akismet_verify_key( $key ) { ,直接在后面加上: return ture; 就行了。 上传了一下,然后再来到要求输入API key的页面:/wp-admin/plugins.php?page=akismet/akismet.php,随便输入一个,我输的是123456,然后update,就成功了。 返回管理页面一个,哈哈,下面就列着一个大大的菜单: **Akismet反垃圾(0)**。棒极了! 点进去一看: 抓到的垃圾: 队列中没有垃圾评论,今天可能是您的幸运日!: 真不错。看来akismet的作者也是深受垃圾侵扰之苦,所以要这么写。 附上akismet的全部代码. 如果您还没有安装akismet,您可以下载下来,保存成akismet.php,放到您的wordpress的wp-content/plugins/akismet.php位置,再到插件菜单下去激活,安装一下就可以了: WordPress.com API key to use this service. You can review the spam it catches under “Manage” and it automatically deletes old spam after 15 days. Hat tip: Michael Hampton and Chris J. Davis for help with the plugin. Author: Matt Mullenweg Version: 1.14 Author URI: http://photomatt.net/ */ add_action(‘admin_menu’, ‘ksd_config_page’); function ksd_config_page() { global $wpdb; if ( function_exists(‘add_submenu_page’) ) add_submenu_page(‘plugins.php’, __(‘Akismet Configuration’), __(‘Akismet Configuration’), 1, __FILE__, ‘akismet_conf’); } function akismet_conf() { if ( isset($_POST[‘submit’]) ) { check_admin_referer(); $key = preg_replace(‘/[^a-h0-9]/i’, ‘’, $_POST[‘key’]); if ( akismet_verify_key( $key ) ) update_option(‘wordpress_api_key’, $key); else $invalid_key = true; } if ( !akismet_verify_key( get_option(‘wordpress_api_key’) ) ) $invalid_key = true; ?>

Akismet will greatly reduce or even completely eliminate the comment and trackback spam you get on your site. If one does happen to get through, simply mark it as “spam” on the moderation screen and Akismet will learn from the mistakes. If you don’t have a WordPress.com account yet, you can get one at WordPress.com.’), ‘http://akismet.com/', ‘http://wordpress.com/api-keys/'); ?>

(What is this?’); ?>)

“.__(‘Akismet is not active.’).” “.sprintf(__(‘You must enter your WordPress.com API key for it to work.’), “plugins.php?page=$path”).”

#adminmenu { margin-bottom: 5em; } #akismet-warning { position: absolute; top: 7em; } “; } add_action(‘admin_footer’, ‘akismet_warning’); return; } $ksd_api_host = get_option(‘wordpress_api_key’) . ‘.rest.akismet.com’; $ksd_api_port = 80; $ksd_user_agent = “WordPress/$wp_version | Akismet/1.14”; // Returns array with headers in $response[0] and entity in $response[1] function ksd_http_post($request, $host, $path, $port = 80) { global $ksd_user_agent; $http_request = “POST $path HTTP/1.0rn”; $http_request .= “Host: $hostrn”; $http_request .= “Content-Type: application/x-www-form-urlencoded; charset=” . get_settings(‘blog_charset’) . “rn”; $http_request .= “Content-Length: “ . strlen($request) . “rn”; $http_request .= “User-Agent: $ksd_user_agentrn”; $http_request .= “rn”; $http_request .= $request; $response = ‘’; if( false !== ( $fs = @fsockopen($host, $port, $errno, $errstr, 3) ) ) { fwrite($fs, $http_request); while ( !feof($fs) ) $response .= fgets($fs, 1160); // One TCP-IP packet fclose($fs); $response = explode(“rnrn”, $response, 2); } return $response; } function ksd_auto_check_comment( $comment ) { global $auto_comment_approved, $ksd_api_host, $ksd_api_port; $comment[‘user_ip’] = $_SERVER[‘REMOTE_ADDR’]; $comment[‘user_agent’] = $_SERVER[‘HTTP_USER_AGENT’]; $comment[‘referrer’] = $_SERVER[‘HTTP_REFERER’]; $comment[‘blog’] = get_option(‘home’); $ignore = array( ‘HTTP_COOKIE’ ); foreach ( $_SERVER as $key => $value ) if ( !in_array( $key, $ignore ) ) $comment[“$key”] = $value; $query_string = ‘’; foreach ( $comment as $key => $data ) $query_string .= $key . ‘=’ . urlencode( stripslashes($data) ) . ‘&’; $response = ksd_http_post($query_string, $ksd_api_host, ‘/1.1/comment-check’, $ksd_api_port); if ( ‘true’ == $response[1] ) { $auto_comment_approved = ‘spam’; update_option( ‘akismet_spam_count’, get_option(‘akismet_spam_count’) + 1 ); } akismet_delete_old(); return $comment; } function akismet_delete_old() { global $wpdb; $now_gmt = current_time(‘mysql’, 1); $wpdb->query(“DELETE FROM $wpdb->comments WHERE DATE_SUB(‘$now_gmt’, INTERVAL 15 DAY) > comment_date_gmt AND comment_approved = ‘spam’”); $n = mt_rand(1, 5); if ( $n % 5 ) $wpdb->query(“OPTIMIZE TABLE $wpdb->comments”); } function ksd_auto_approved( $approved ) { global $auto_comment_approved; if ( ‘spam’ == $auto_comment_approved ) $approved = $auto_comment_approved; return $approved; } function ksd_submit_nonspam_comment ( $comment_id ) { global $wpdb, $ksd_api_host, $ksd_api_port; $comment = $wpdb->get_row(“SELECT * FROM $wpdb->comments WHERE comment_ID = ‘$comment_id’”); if ( !$comment ) // it was deleted return; $comment->blog = get_option(‘home’); $query_string = ‘’; foreach ( $comment as $key => $data ) $query_string .= $key . ‘=’ . urlencode( stripslashes($data) ) . ‘&’; $response = ksd_http_post($query_string, $ksd_api_host, “/1.1/submit-ham”, $ksd_api_port); } function ksd_submit_spam_comment ( $comment_id ) { global $wpdb, $ksd_api_host, $ksd_api_port; $comment = $wpdb->get_row(“SELECT * FROM $wpdb->comments WHERE comment_ID = ‘$comment_id’”); if ( !$comment ) // it was deleted return; if ( ‘spam’ != $comment->comment_approved ) return; $comment->blog = get_option(‘home’); $query_string = ‘’; foreach ( $comment as $key => $data ) $query_string .= $key . ‘=’ . urlencode( stripslashes($data) ) . ‘&’; $response = ksd_http_post($query_string, $ksd_api_host, “/1.1/submit-spam”, $ksd_api_port); } add_action(‘wp_set_comment_status’, ‘ksd_submit_spam_comment’); add_action(‘edit_comment’, ‘ksd_submit_spam_comment’); add_action(‘preprocess_comment’, ‘ksd_auto_check_comment’, 1); add_filter(‘pre_comment_approved’, ‘ksd_auto_approved’); function ksd_spam_count() { global $wpdb, $comments; $count = $wpdb->get_var(“SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = ‘spam’”); return $count; } function ksd_manage_page() { global $wpdb; $count = sprintf(__(‘Akismet Spam (%s)’), ksd_spam_count()); if ( function_exists(‘add_management_page’) ) add_management_page(__(‘Akismet Spam’), $count, 1, __FILE__, ‘ksd_caught’); } function ksd_caught() { global $wpdb, $comment; if (isset($_POST[‘submit’]) && ‘recover’ == $_POST[‘action’] && ! empty($_POST[‘not_spam’])) { $i = 0; foreach ($_POST[‘not_spam’] as $comment): $comment = (int) $comment; if ( function_exists(‘wp_set_comment_status’) ) wp_set_comment_status($comment, ‘approve’); else $wpdb->query(“UPDATE $wpdb->comments SET comment_approved = ‘1’ WHERE comment_ID = ‘$comment’”); ksd_submit_nonspam_comment($comment); ++$i; endforeach; echo ‘

‘ . sprintf(__(‘%1$s comments recovered.’), $i) . “

“; } if (‘delete’ == $_POST[‘action’]) { $delete_time = addslashes( $_POST[‘display_time’] ); $nuked = $wpdb->query( “DELETE FROM $wpdb->comments WHERE comment_approved = ‘spam’ AND ‘$delete_time’ > comment_date_gmt” ); if (isset($nuked)) { echo ‘

‘; if ($nuked) { _e(‘All spam deleted.’); } echo “

“; } } ?>

%1$s spam for you since you installed it.’), number_format($count) ); ?>

‘.__(‘You have no spam currently in the queue. Must be your lucky day. :)’).’

‘; echo ‘

‘; } else { echo ‘

‘.__(‘You can delete all of the spam from your database with a single click. This operation cannot be undone, so you may wish to check to ensure that no legitimate comments got through first. Spam is automatically deleted after 15 days, so don’t sweat it.’).’

‘; ?>

   

‘.__(‘These are the latest comments identified as spam by Akismet. If you see any mistakes, simply mark the comment as “not spam” and Akismet will learn from the submission. If you wish to recover a comment from spam, simply select the comment, and click Not Spam. After 15 days we clean out the junk for you.’).’

‘; ?> get_results(“SELECT * FROM $wpdb->comments WHERE comment_approved = ‘spam’ ORDER BY comment_date DESC LIMIT 150”); if ($comments) { ?>

comment_date); $post = get_post($comment->comment_post_ID); $post_title = $post->post_title; if ($i % 2) $class = ‘class=”alternate”‘; else $class = ‘’; echo “nt1. “; ?>

comment\_author\_email) { ?>| comment\_author\_url && 'http://' != $comment->comment\_author\_url) { ?> | | [](http://ws.arin.net/cgi-bin/whois.pl?queryinput=<?php comment_author_IP() ?>)|

  

‘.__(‘Spam’).’’; echo ‘

‘.sprintf(__(‘Akismet has protected your site from %3$s spam comments.’), ‘http://akismet.com/', “edit.php?page=$path”, number_format($count) ).’

‘; } add_action(‘activity_box_end’, ‘akismet_stats’); ?>