手动为 WordPress 添加 reCAPTCHA v3 支持

最近博客经常有垃圾评论,所以我想到了用 reCAPTCHA 来过滤掉这些垃圾评论爬虫。

由于 reCAPTCHA v2 已经有很多在线打码平台能破解了,因此我用的是无交互版本的 reCAPTCHA v3,v3 和 v2 的区别就在于 v3 不需要点击,而是靠分数来判断是否是机器人。

首先打开 https://www.google.com/recaptcha/admin/ (需要科学上网)

登录后点右上角 + 添加一个网站,标签随意,域名填你的博客域名,类型选 reCAPTCHA 第 3 版

添加完成后你会获得一个网站密钥和一个通信密钥,保存好,后面还要用到。

接着只需要修改几个文件:

/wp-content/themes/主题名/comments.php

<?php if ( post_password_required() ) { return; } ?>
<!-- 在合适的部分加上下面这段代码即可 -->
<script src="https://www.recaptcha.net/recaptcha/api.js" defer></script>
<script type="text/javascript">
window.onload = function() {
    grecaptcha.ready(function() {
        grecaptcha.execute('你的 reCAPTCHA 前端密钥', {action:'validate_captcha'}).then(function(token) {
            recaptcha_data.value = token;
        });
    });
}
</script>

/wp-includes/comment-template.php

// 大约在 2400 行左右,可以搜索 submit_button
// 在 <input name="%1$s" 前面加上 <input type="hidden" id="recaptcha_data" name="recaptcha_data" />
        'label_submit'         => __( 'Post Comment' ),
        'submit_button'        => '<input type="hidden" id="recaptcha_data" name="recaptcha_data" /><input name="%1$s" type="submit" id="%2$s" class="%3$s" value="%4$s" />',
        'submit_field'         => '<p class="form-submit">%1$s %2$s</p>',
        'format'               => 'xhtml',

/wp-comments-post.php

require( dirname( __FILE__ ) . '/wp-load.php' );

nocache_headers();

// 切记在 wp-load.php 后面添加此代码,否则会出错

function recaptcha_verify($userdata) {
    if(empty($userdata)) {
        return false;
    }
    $data = http_build_query(Array(
        'secret' => '你的 reCAPTCHA 后端密钥',
        'response' => $userdata
    ));
    $options = Array(
        'http' => Array(
            'method' => 'POST',
            'header' => 'Content-type:application/x-www-form-urlencoded',
            'content' => $data,
            'timeout' => 15 * 60
        )
    );
    $context = stream_context_create($options);
    $result = file_get_contents('https://recaptcha.net/recaptcha/api/siteverify', false, $context);
    $json = json_decode($result, true);
    return $json ? $json['success'] : false;
}

if ( !isset( $_POST['recaptcha_data'] ) || empty( $_POST['recaptcha_data'] ) ) {
    wp_die(
        '<h1 style="margin-top: -15px;">验证 reCAPTCHA 失败</h1><p>您的浏览器没有通过 reCAPTCHA 人机认证,请刷新后重试。</p>',
        'reCAPTCHA verify failed',
        array(
            'response'  => 'reCAPTCHA verify failed',
            'back_link' => true,
        )
    );
} else {
    if ( ! recaptcha_verify( $_POST['recaptcha_data'] ) ) {
        wp_die(
            '<h1 style="margin-top: -15px;">验证 reCAPTCHA 失败</h1><p>您的浏览器没有通过 reCAPTCHA 人机认证,请刷新后重试。</p>',
            'reCAPTCHA verify failed',
            array(
                'response'  => 'reCAPTCHA verify failed',
                'back_link' => true,
            )
        );
    }
}

大功告成,现在评论必须要通过 reCAPTCHA 验证后才能提交,可以比较有效地过滤掉垃圾评论了。

推荐阅读文章

9 条评论

  1. KasuganoSora说道:

    测试评论内容

  2. KasuganoSora说道:

    刚刚更新了 WordPress,好像速度变快了不少

  3. 测试一下v3的验证方式

  4. 验证呢?怎么连验证都没有就发了

  5. zhaoto说道:

    testing

  6. ric说道:

    好像还是报错了

  7. mixpixel说道:

    测试一下

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注