Добрый день
У меня на сайте появилось очень большая посещаемость, по логам видно что это робот или бот. Задался я вопросом, можно ли использовать капу гугла как альтернативу cloudflare для защиты. Кажется возможно, вот такой есть рабочий код. Он не выводит капчу для роботов Яндекса и Гугла, а для остальных просит пройти капчу. Конечно посещаемость сильно упала, но заходят точно люди. Проверка ответа сервера и кода поискового робота яндекса показывает что все норм на веб мастере.
Но я решил задать вопрос, можно ли так делать не в ущерб сайту?
Есть кто то опытный в этом вопросе?
// Функция проверки роботов Яндекса и Google
function is_yandex_or_google_bot() {
$user_agent = $_SERVER['HTTP_USER_AGENT'];
$ip_address = $_SERVER['REMOTE_ADDR'];
// Проверка User-Agent для Googlebot (включая домены googlebot.com, google.com, googleusercontent.com)
if (stripos($user_agent, 'Googlebot') !== false) {
$google_domains = ['googlebot.com', 'google.com', 'googleusercontent.com'];
foreach ($google_domains as $domain) {
if (substr($user_agent, -strlen($domain)) === $domain) {
return true;
}
}
}
// Проверка User-Agent для Яндекса (включая все роботы, заканчивающиеся на yandex.ru, yandex.net, yandex.com)
if (stripos($user_agent, 'Yandex') !== false) {
$yandex_domains = ['yandex.ru', 'yandex.net', 'yandex.com'];
foreach ($yandex_domains as $domain) {
if (substr($user_agent, -strlen($domain)) === $domain) {
return true;
}
}
}
// Проверка IP-адресов
$yandex_ips = ['77.88.55.50', '77.88.55.51', '77.88.55.55'];
$google_ips = ['66.249.64.0/19', '66.102.0.0/20', '74.125.0.0/16'];
foreach ($yandex_ips as $ip) {
if ($ip_address === $ip) {
return true;
}
}
foreach ($google_ips as $ip_range) {
if (ip_in_range($ip_address, $ip_range)) {
return true;
}
}
return false;
}
// Функция для проверки, является ли IP-адрес IPv6
function is_ipv6($ip) {
return filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6);
}
function ip_in_range($ip, $range) {
list($range, $netmask) = explode('/', $range, 2);
$range_decimal = ip2long($range);
$ip_decimal = ip2long($ip);
$wildcard_decimal = pow(2, (32 - $netmask)) - 1;
$netmask_decimal = ~$wildcard_decimal;
return (($ip_decimal & $netmask_decimal) == ($range_decimal & $netmask_decimal));
}
// Блокировка до прохождения капчи
function captcha_protection_init() {
if (is_admin() || wp_doing_ajax()) {
return;
}
// Проверка, является ли пользователь ботом Яндекса или Google
if (is_yandex_or_google_bot()) {
return;
}
// Получаем IP-адрес пользователя
$ip_address = $_SERVER['REMOTE_ADDR'];
// Если IP-адрес IPv6, показываем капчу сразу
if (is_ipv6($ip_address) && !isset($_COOKIE['captcha_passed'])) {
require_once('captcha-page.php');
exit;
}
//капча только для новых пользователей с IPv6 проверка на наличие куки
if (is_ipv6($ip_address) && !isset($_COOKIE['captcha_passed'])) {
require_once('captcha-page.php');
exit;
}
// Инициализация счетчика посещений
$visit_count = isset($_COOKIE['visit_count']) ? intval($_COOKIE['visit_count']) : 0;
// Увеличение счетчика посещений
$visit_count++;
// Установка cookie с новым значением счетчика
setcookie('visit_count', $visit_count, time() + 86400, '/'); // Cookie на 24 часа
// Проверка, превышено ли количество посещений
if ($visit_count > 5 && !isset($_COOKIE['captcha_passed'])) {
require_once('captcha-page.php');
exit;
}
}
add_action('init', 'captcha_protection_init');
// Обработчик проверки капчи
function verify_recaptcha() {
$secret_key = 'секретный ключ';
$response = $_POST['g-recaptcha-response'];
$verify = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret={$secret_key}&response={$response}");
$captcha_result = json_decode($verify);
if ($captcha_result->success) {
// Устанавливаем cookie, что капча пройдена
setcookie('captcha_passed', 'true', time() + 86400, '/');
// Сбрасываем счетчик посещений
setcookie('visit_count', 0, time() + 86400, '/');
wp_send_json_success('Капча пройдена');
} else {
status_header(403);
wp_send_json_error('Капча не пройдена');
}
exit;
}
add_action('wp_ajax_verify_recaptcha', 'verify_recaptcha');
add_action('wp_ajax_nopriv_verify_recaptcha', 'verify_recaptcha');
И второй файл страницы проверки
<!DOCTYPE html>
<html>
<head>
<title>Проверка безопасности</title>
<script src="https://www.google.com/recaptcha/api.js"></script>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
font-family: Arial;
}
.captcha-container {
text-align: center;
padding: 20px;
border: 1px solid #ccc;
}
</style>
</head>
<body>
<div class="captcha-container">
<h2>Подтвердите, что вы не робот</h2>
<form id="captcha-form">
<div class="g-recaptcha"
data-sitekey="ключ сайта"
data-callback="onSubmit">
</div>
</form>
</div>
<script>
function onSubmit(token) {
var form = new FormData();
form.append('action', 'verify_recaptcha');
form.append('g-recaptcha-response', token);
fetch('<?php echo admin_url('admin-ajax.php'); ?>', {
method: 'POST',
body: form
})
.then(response => response.json())
.then(data => {
if (data.success) {
window.location.reload();
} else {
alert('Капча не пройдена');
}
});
}
</script>
</body>
</html>