Резкий всплеск прямых заходов. Как бороться?

Ростислав Шацкий
На сайте с 20.10.2022
Offline
13
#401
Допилил возможность проверить данные ip кликнув по нему🔥 Для проверки ip зацепил халявный api от ipapi.co

// Отслеживание
// Создаем функцию для записи данных посетителей
function log_visitor_info() {
    $log_file = ABSPATH . 'visitor_log.txt'; // Путь к файлу лога

    $current_date_time = date('Y-m-d H:i:s'); // Текущая дата и время
    $visitor_ip = $_SERVER['REMOTE_ADDR']; // IP-адрес посетителя
    $current_page = $_SERVER['REQUEST_URI']; // Текущая посещенная страница

    // Запись в лог
    $log_entry = "$current_date_time - IP: $visitor_ip, Page: $current_page\n";

    // Открываем файл в режиме добавления
    $file_handle = fopen($log_file, 'a');
    
    if ($file_handle) {
        fwrite($file_handle, $log_entry);
        fclose($file_handle);
    }
}
// Добавляем хук, чтобы записывать данные при каждом запросе
add_action('wp', 'log_visitor_info');

// Создаем страницу в меню "Инструменты"
function custom_logs_page() {
    add_submenu_page(
        'tools.php',
        'Лог посещений',
        'Лог посещений',
        'manage_options',
        'visitor-log',
        'render_visitor_log_page'
    );
}
add_action('admin_menu', 'custom_logs_page');

// Функция для подсчета уникальных IP и их повторений
function count_unique_ips($log_entries) {
    $ip_counts = [];

    foreach ($log_entries as $entry) {
        if (!empty($entry)) {
            preg_match('/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) - IP: (.+), Page: (.+)/', $entry, $matches);
            if (count($matches) === 4) {
                $ip = $matches[2];
                if (isset($ip_counts[$ip])) {
                    $ip_counts[$ip]++;
                } else {
                    $ip_counts[$ip] = 1;
                }
            }
        }
    }

    return $ip_counts;
}

// Функция для вывода таблицы лога на странице
function render_visitor_log_page() {
    // Получаем данные из файла лога
    $log_file = ABSPATH . 'visitor_log.txt';
    $log_content = file_get_contents($log_file);
    
    // Разбиваем записи по строкам
    $log_entries = explode("\n", $log_content);

    // Выводим страницу админки
    echo '<div class="wrap">';
    echo '<h2>Лог посещений</h2>';
    
    // Загружаем стили WordPress для таблиц
    wp_enqueue_style('wp-admin');
    
    // Выводим таблицу с данными
    echo '<table class="widefat">';
    echo '<thead><tr><th>Дата и время</th><th>IP-адрес</th><th>Посещенная страница</th></tr></thead>';
    echo '<tbody>';
    foreach ($log_entries as $entry) {
        if (!empty($entry)) {
            preg_match('/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) - IP: (.+), Page: (.+)/', $entry, $matches);
            if (count($matches) === 4) {
                list(, $date_time, $ip, $page) = $matches;
                echo "<tr><td>$date_time</td><td><a href='#' class='ip-link' data-ip='$ip'>$ip</a></td><td>$page</td></tr>";
            }
        }
    }
    echo '</tbody>';
    echo '</table>';

    // Выводим таблицу с уникальными IP
    $unique_ips = count_unique_ips($log_entries);

    echo '<h3>Уникальные IP-адреса</h3>';
    echo '<table class="widefat">';
    echo '<thead><tr><th>IP-адрес</th><th>Количество визитов</th></tr></thead>';
    echo '<tbody>';
    foreach ($unique_ips as $ip => $count) {
        echo "<tr><td><a href='#' class='ip-link' data-ip='$ip'>$ip</a></td><td>$count</td></tr>";
    }
    echo '</tbody>';
    echo '</table>';

    // Добавляем кнопку очистки лога
    echo '<form method="post">';
    echo '<p><input type="submit" name="clear_log" class="button button-primary" value="Очистить лог"></p>';
    echo '</form>';

    if (isset($_POST['clear_log'])) {
        clear_visitor_log();
        echo '<div class="updated"><p>Лог посещений очищен.</p></div>';
    }
    
    echo '</div>'; // Закрываем div.wrap

    // JavaScript для обработки клика по IP и получения информации
    echo '<script>
    document.addEventListener("DOMContentLoaded", function() {
        const ipLinks = document.querySelectorAll(".ip-link");
        
        ipLinks.forEach(link => {
            link.addEventListener("click", function(e) {
                e.preventDefault();
                const ip = this.getAttribute("data-ip");
                
                // API для проверки IP
                fetch(`https://ipapi.co/${ip}/json/`)
                .then(response => response.json())
                .then(data => {
                    alert(`Информация об IP ${ip}: Страна - ${data.country_name}, Город - ${data.city}`);
                })
                .catch(error => {
                    alert("Не удалось получить информацию об IP");
                });
            });
        });
    });
    
</script>';
}

// Функция для очистки лога
function clear_visitor_log() {
    $log_file = ABSPATH . 'visitor_log.txt';
    
    // Открываем файл в режиме записи и обрезаем его до нулевой длины
    $file_handle = fopen($log_file, 'w');
    if ($file_handle) {
        fclose($file_handle);
    }
}


G6
На сайте с 12.07.2007
Offline
162
#402
Ростислав Шацкий #:
Допилил возможность проверить данные ip кликнув по нему🔥 Для проверки ip зацепил халявный api от ipapi.co

Хорошее дело, можно в итоге полезный плагин сделать. А в этом апи подсеть или диапазон не определят, скажем накинулась бетерика и сразу ее в бан. Города наверно не слишком нормально это апи определяет. Может не все писать а только прямые.

Ростислав Шацкий
На сайте с 20.10.2022
Offline
13
#403
Немного корректировок для улучшения визуального восприятия:

Между:
    // Загружаем стили WordPress для таблиц
    wp_enqueue_style('wp-admin');
и этим:
// Выводим таблицу с данными без инлайновых стилей
        echo '<table class="widefat">';
        echo '<thead><tr><th>Дата и время</th><th>IP-адрес</th><th>Посещенная страница</th></tr></thead>';

Добавил блок:

        // Принудительно корректируем стили 
        echo '<style>';
        echo '.widefat { table-layout: fixed; }';
        echo '.widefat th:nth-child(1) { width: 130px; }';
        echo '.widefat th:nth-child(2) { width: 120px; }';
        echo '.widefat td, .widefat th { padding: 5px 10px; }';
        echo '</style>';

Теперь, когда адрес длинный, то таблицу не ломает. Строчки чуть уже. Для восприятия лучше.👌

Ростислав Шацкий
На сайте с 20.10.2022
Offline
13
#404
Добавил редактор .htaccess 🔥Выкладываю полный код со стилями и редактором:
// Отслеживание
// Создаем функцию для записи данных посетителей
function log_visitor_info() {
    $log_file = ABSPATH . 'visitor_log.txt'; // Путь к файлу лога

    $current_date_time = date('Y-m-d H:i:s'); // Текущая дата и время
    $visitor_ip = $_SERVER['REMOTE_ADDR']; // IP-адрес посетителя
    $current_page = $_SERVER['REQUEST_URI']; // Текущая посещенная страница

    // Запись в лог
    $log_entry = "$current_date_time - IP: $visitor_ip, Page: $current_page\n";

    // Открываем файл в режиме добавления
    $file_handle = fopen($log_file, 'a');
    
    if ($file_handle) {
        fwrite($file_handle, $log_entry);
        fclose($file_handle);
    }
}
// Добавляем хук, чтобы записывать данные при каждом запросе
add_action('wp', 'log_visitor_info');

// Создаем страницу в меню "Инструменты"
function custom_logs_page() {
    add_submenu_page(
        'tools.php',
        'Лог посещений',
        'Лог посещений',
        'manage_options',
        'visitor-log',
        'render_visitor_log_page'
    );
}
add_action('admin_menu', 'custom_logs_page');

// Функция для подсчета уникальных IP и их повторений
function count_unique_ips($log_entries) {
    $ip_counts = [];

    foreach ($log_entries as $entry) {
        if (!empty($entry)) {
            preg_match('/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) - IP: (.+), Page: (.+)/', $entry, $matches);
            if (count($matches) === 4) {
                $ip = $matches[2];
                if (isset($ip_counts[$ip])) {
                    $ip_counts[$ip]++;
                } else {
                    $ip_counts[$ip] = 1;
                }
            }
        }
    }

    return $ip_counts;
}

// Функция для вывода таблицы лога на странице
function render_visitor_log_page() {
    // Получаем данные из файла лога
    $log_file = ABSPATH . 'visitor_log.txt';
    $log_content = file_get_contents($log_file);
    
    // Разбиваем записи по строкам
    $log_entries = explode("\n", $log_content);

    // Выводим страницу админки
    echo '<div class="wrap">';
    echo '<h2>Лог посещений</h2>';
    
    // Загружаем стили WordPress для таблиц
    wp_enqueue_style('wp-admin');
    
        // Принудительно корректируем стили
        echo '<style>';
        echo '.widefat { table-layout: fixed; }';
        echo '.widefat th:nth-child(1) { width: 130px; }';
        echo '.widefat th:nth-child(2) { width: 120px; }';
        echo '.widefat td, .widefat th { padding: 5px 10px; }';
        echo '
</style>';

        // Выводим таблицу с данными без инлайновых стилей
        echo '<table class="widefat">';
        echo '<thead><tr><th>Дата и время</th><th>IP-адрес</th><th>Посещенная страница</th></tr></thead>';
        echo '<tbody>';
    foreach ($log_entries as $entry) {
        if (!empty($entry)) {
            preg_match('/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) - IP: (.+), Page: (.+)/', $entry, $matches);
            if (count($matches) === 4) {
                list(, $date_time, $ip, $page) = $matches;
                echo "<tr><td>$date_time</td><td><a href='#' class='ip-link' data-ip='$ip'>$ip</a></td><td>$page</td></tr>";
            }
        }
    }
    echo '</tbody>';
    echo '</table>';

    // Выводим таблицу с уникальными IP
    $unique_ips = count_unique_ips($log_entries);

    echo '<h2>Уникальные IP-адреса</h2>';
    echo '<table class="widefat">';
    echo '<thead><tr><th>IP-адрес</th><th>Количество визитов</th></tr></thead>';
    echo '<tbody>';
    foreach ($unique_ips as $ip => $count) {
        echo "<tr><td><a href='#' class='ip-link' data-ip='$ip'>$ip</a></td><td>$count</td></tr>";
    }
    echo '</tbody>';
    echo '</table>';

    // Добавляем кнопку очистки лога
    echo '<form method="post">';
    echo '<p><input type="submit" name="clear_log" class="button button-primary" value="Очистить лог"></p>';
    echo '</form>';

    if (isset($_POST['clear_log'])) {
        clear_visitor_log();
        echo '<div class="updated"><p>Лог посещений очищен.</p></div>';
    }
        
    // Редактор .htaccess
        $htaccess_content = read_htaccess_file();
    if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['htaccess_content'])) {
        $new_content = $_POST['htaccess_content'];
        write_to_htaccess($new_content);
        $htaccess_content = $new_content; // Обновляем содержимое после сохранения
    }

    echo '<h2>Редактор .htaccess</h2>';
    echo '<form method="POST">';
    echo '<textarea name="htaccess_content" rows="30" cols="130">' . $htaccess_content . '</textarea>';
    echo '<p><input type="submit" class="button button-primary" value="Сохранить"></p>';
    echo '</form>';
        
    echo '</div>'; // Закрываем div.wrap

    // JavaScript для обработки клика по IP и получения информации
    echo '<script>
    document.addEventListener("DOMContentLoaded", function() {
        const ipLinks = document.querySelectorAll(".ip-link");
        
        ipLinks.forEach(link => {
            link.addEventListener("click", function(e) {
                e.preventDefault();
                const ip = this.getAttribute("data-ip");
                
                // API для проверки IP
                fetch(`https://ipapi.co/${ip}/json/`)
                .then(response => response.json())
                .then(data => {
                    alert(`Информация об IP ${ip}: Страна - ${data.country_name}, Город - ${data.city}`);
                })
                .catch(error => {
                    alert("Не удалось получить информацию об IP");
                });
            });
        });
    });
    
</script>';
}

// Функция для очистки лога
function clear_visitor_log() {
    $log_file = ABSPATH . 'visitor_log.txt';
    
    // Открываем файл в режиме записи и обрезаем его до нулевой длины
    $file_handle = fopen($log_file, 'w');
    if ($file_handle) {
        fclose($file_handle);
    }
}

// Функция для чтения файла .htaccess
function read_htaccess_file() {
    $htaccess_path = ABSPATH . '.htaccess';
    if (file_exists($htaccess_path)) {
        return file_get_contents($htaccess_path);
    }
    return false;
}

// Функция для записи в файл .htaccess
function write_to_htaccess($content) {
    $htaccess_path = ABSPATH . '.htaccess';
    if (file_exists($htaccess_path) && is_writable($htaccess_path)) {
        return file_put_contents($htaccess_path, $content);
    }
    return false;
}

Аккуратнее с .htaccess, не "наломайте дров" 😁

G6
На сайте с 12.07.2007
Offline
162
#405
Ростислав Шацкий #:
Аккуратнее с .htaccess, не "наломайте дров"

Можно бекапчик добавить файла и проблем меньше)

alaev
На сайте с 18.11.2010
Offline
700
#406
Ростислав Шацкий #:
Добавил редактор .htaccess 🔥Выкладываю полный код со стилями и редактором:

Аккуратнее с .htaccess, не "наломайте дров" 😁

У этого способа есть один существенный минус.

Многие сайты насилуют проксями со всей России, включая зарубежные, включая хостинговые ipv6 и ipv4.

Размер .htaccess может существенно разрастись.

Создание и продвижение сайтов - https://alaev.net , аудиты сайтов, контекстная реклама
M
На сайте с 17.08.2023
Offline
0
#407
Ростислав Шацкий #:
Допилил возможность проверить данные ip кликнув по нему🔥 Для проверки ip зацепил халявный api от ipapi.co


В таблицу с уникальными IP-адресами в колонку "Количество визитов" добавил функцию сортировки. Брал отсюда - https://github.com/tofsjonas/sortable

Теперь, отсортировав по убыванию, сразу вижу, какой IP отметился больше всех, и делаю соответствующие выводы.

Ростислав Шацкий
На сайте с 20.10.2022
Offline
13
#408
Matatum #:

В таблицу с уникальными IP-адресами в колонку "Количество визитов" добавил функцию сортировки. Брал отсюда - https://github.com/tofsjonas/sortable

Теперь, отсортировав по убыванию, сразу вижу, какой IP отметился больше всех, и делаю соответствующие выводы.

Ну все коллеги, пора плагином делать 😂 Отправляй готовый код, чтобы все могли взять за основу. 😉

DP
На сайте с 24.08.2023
Offline
0
#409

Всем привет.

Также заметил ботов из прямых заходов 

Как видно на скриншоте пошли боты по прямых заходам просел трафик из поиска... 


Что было сделано:
1) Разрешил know bots, в яндексе все гуд, а вот гугл не индексирует сайт, пытаюсь понять почему

2) IPV6 SSL
3) 

Итог накрутка уменьшилась но появилась проблема с индексацией сайта, также иногда на сайте не грузятся картинки, пытаюсь понять почему. Возможно ошибся в правилах (если ошибка есть напиши плз)

Платон ничего адекватного не сказал) говорит да просели у тебя позиции удачи..) Кто знает что еще добавить?

Видел что пишут про Алаева и htcasses для блока прямых заходов, но не понял как он обошел блокировку яндекса и гугла ботов, и как вообще ее прописал, мб у кого есть код и инструкция?

Еще читаю cdn проще и лучше кто знает?

png ab72jc_x4gty6_2023-08-25_t_01.41.54.png
png l8g9l2_wv4s22_2023-08-25_y_01.42.08.png
png dsbvuj_jijqzo_2023-08-25_n_01.42.18.png
png vfwv1g_z0n491_2023-08-25_2_01.42.34.png
alaev
На сайте с 18.11.2010
Offline
700
#410
Dmitriy Popov #:
Видел что пишут про Алаева и htcasses для блока прямых заходов, но не понял как он обошел блокировку яндекса и гугла ботов, и как вообще ее прописал, мб у кого есть код и инструкция?

Ссылка на инструкцию у меня была в подписи раньше. Вот ссылка: https://disk.yandex.ru/d/7m5wQQnfh5wu0A

Там смысл такой. Сначала допиливаешь метрику, чтобы она тебе ip ботов сливала, а потом отправляешь в бан те ip, которые самые спамные по прямым заходам. При этом из поиска (с рефкой) они баниться не будут. И реферальный спам, если такой остался, тоже можно банить. Там все расписано с комментариями.

Поисковики не забанятся, потому что их в метрике не видно. Но cloudflare будет проще в настройке, если спам ботами идет с огромного количества подсетей.

boty-htaccess.txt
boty-htaccess.txt
  • disk.yandex.ru
Посмотреть и скачать с Яндекс Диска

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий