最近博客经常有垃圾评论,所以我想到了用 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 验证后才能提交,可以比较有效地过滤掉垃圾评论了。
测试评论内容
刚刚更新了 WordPress,好像速度变快了不少
woc
测试一下v3的验证方式
验证呢?怎么连验证都没有就发了
测试评论
testing
好像还是报错了
测试一下