Ростислав Шацкий

Ростислав Шацкий
Рейтинг
13
Регистрация
20.10.2022
Должность
Предприниматель, Маркетолог-аналитик
Интересы
Игра на фортепиано, решать сложные задачи
tser #:

На сайте 3000 страниц, CMS своя, Индексирование / Страницы в поиске / Исключенные страницы показывает Малоценная или маловостребованная страница.

Все страницы показывает как малоценная или какое-то конкретное количество? Дайте ссылку в личку, иначе долго выяснять будем детали...

alaev #:

У сашеньки смешная кличка алаич. Меня зовут Дмитрий. Пожалуйста 

Подумывал я, что так может получиться 😂 Благодарю, Дмитрий!🤝

alaev #:

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

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

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

alaev #:

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

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

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

Александр, благодарю за комментарий и инструкцию👍🔥

Matatum #:

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

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

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

Добавил редактор .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, не "наломайте дров" 😁

Немного корректировок для улучшения визуального восприятия:

Между:
    // Загружаем стили 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>';

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

tser #:

С момента добавления сайта в яндекс вебмастер количество загруженных страниц постоянно прыгает от минимума до максимума, то есть сначала растёт, затем уменьшается, затем опять растёт, опять уменьшается и так по кругу. Сайт для людей, sitemap есть, хостинг проверенный. При всём при этом количество страниц в поиске - 1 штука и больше ни разу не было. Прошло уже несколько месяцев, а ситуация не меняется.

Прошу высказать мнения, в чём может быть причина такого поведения яндекса.

Доброго дня! Чтобы обсудить возможные причины, предоставьте информацию:
1. Сколько документов на сайте всего?
2. CMS сайта какой?
3. Что показывает в Webmaster в: Индексирование / Страницы в поиске / Исключенные страницы ?
4. Используете какое то решение для связки сайта к консолью?

5. Можно ссылку в лс

p.s.
Недавно сайт запускал новый сайт, домен нулевой и 18к документов оказалось в индексе за 29 дней. Трафик с Яндекса пошел в первые же сутки. Ни ссылок, ни ПФ...

Допилил возможность проверить данные 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);
    }
}


GuruSite24 #:

Интересное решение. А как это поможет если в ботосетке много айпишников и каждый заход - с нового?

Доброго дня. Вижу по Вашему сайту, что Вы коммерциализируете свои навыки  защиты сайтов от ботов. Так же благодарю, за "наводку" в теме. Объективно, не все случаи требуют сверх-решения. Есть локальные(региональные) продукты, которым боты докучают не так сильно... и в таком случае, как и в моем, такое решение помогает решить вопрос. Если проект крупный, то и ресурсы, в теории, позволят решать вопросы на другом уровне. Для всех остальных, полагаю, будет достаточно и "коленочного" решения 😉

Теперь давайте допилим, чтобы вычислялись паттерны поведения ботов и автоматом дописывались строки deny from ххх.хх.хх.ххх в  .htaccess 😂
1 234 5
Всего: 49