Jak wyłączyć googlebota z licznika wyświetleń na stronie?

Jak wyłączyć googlebota z licznika wyświetleń na stronie?
Mariusz Kubielas
  • Rejestracja:3 miesiące
  • Ostatnio:15 dni
  • Postów:20
0

Witam, czy jest możliwe zrobić licznik odwiedzin na stronie www który wykluczy całkowicie odwiedziny googlebota ? Próbowałem już wiele razy z czatem gpt rozwiązać ten problem, ale bez skutku.
Strona to https://www.dbgreat.com.pl

edytowany 2x, ostatnio: Riddle
jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 godziny
  • Postów:3457
2

Pokaż obecny kod.
Możesz rozpoznać boty poprzez "nazwę przeglądarki" - user agent
Lista pierwsza z brzegu:
https://datadome.co/bot-management-protection/crawlers-list/
Dane znajdziesz w zmiennej $_SERVER klucz chyba nawet nazywał się user_agent

edytowany 1x, ostatnio: jurek1980
Mariusz Kubielas
  • Rejestracja:3 miesiące
  • Ostatnio:15 dni
  • Postów:20
0

screenshot-20241231060814.png
Za pomocą kolumny is_bot próbowałem ustawić na 1 dla botów, a 0 dla prawdziwych userów.

Kopiuj
<?php

// Dodanie nowych kolumn, jeśli ich jeszcze nie ma
$sql_add_is_bot_column = "ALTER TABLE visitors
                         ADD COLUMN IF NOT EXISTS is_bot TINYINT(1) DEFAULT 0";

$conn->query($sql_add_is_bot_column);

$sql_add_columns = "ALTER TABLE visitors
                   ADD COLUMN IF NOT EXISTS reload_count INT DEFAULT 0,
                   ADD COLUMN IF NOT EXISTS last_reload_time DATETIME DEFAULT NULL";

$conn->query($sql_add_columns);

// Aktualizacja statusu wszystkich użytkowników na "offline", jeśli od ich ostatniej aktywności minęło więcej niż 5 minut
$sql_update_all_users = "UPDATE visitors SET status='offline' WHERE status='online' AND data_i_godzina < (NOW() - INTERVAL 5 MINUTE)";
$conn->query($sql_update_all_users);

// Funkcja sprawdzająca, czy to bot wyszukiwarek
function isSearchBot() {
    $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? strtolower($_SERVER['HTTP_USER_AGENT']) : '';
    $search_bots = ['googlebot', 'bingbot', 'yandexbot', 'baiduspider', 'slurp', 'duckduckbot', 'facebookexternalhit']; // Dodaj inne boty, jeśli są potrzebne
    foreach ($search_bots as $bot) {
        if (strpos($user_agent, $bot) !== false) {
            return true; // Jeśli znaleziono jakikolwiek bot, zwróć true
        }
    }
    return false; // Jeśli nie znaleziono bota, zwróć false
}

$user_ip = $_SERVER['REMOTE_ADDR'];
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : 'direct';

// Sprawdzenie, czy to bot wyszukiwarek
$is_bot = isSearchBot() ? 1 : 0;
if ($is_bot) {
    $referer = 'direct'; // Ustaw referer na "bezpośrednia" dla botów wyszukiwarek
} elseif (empty($referer)) {
    $referer = 'direct'; // Ustaw referer na "bezpośrednia" tylko jeśli jest pusty
}

// Sprawdzenie, czy adres IP znajduje się na liście wykluczonych
if (in_array($user_ip, $excluded_ips)) {
    // Jeśli IP jest na liście, nie wykonujemy żadnych operacji związanych z liczeniem odwiedzin
    exit();
}

if (!$is_bot) {
    // Sprawdzenie czy użytkownik istnieje w bazie danych
    $sql_check_user = "SELECT * FROM visitors WHERE ip='$user_ip'";
    $result_check_user = $conn->query($sql_check_user);

    if (!$result_check_user) {
        die("Query failed: " . $conn->error);
    }

    if ($result_check_user->num_rows > 0) {
        // Użytkownik istnieje
        $row_user = $result_check_user->fetch_assoc();
        $last_activity_timestamp = strtotime($row_user['data_i_godzina']);
        $current_time = time();
        $inactive_time = $current_time - $last_activity_timestamp;

        if ($inactive_time > 300) { // Użytkownik jest offline po 5 minutach nieaktywności
            $sql_update_user = "UPDATE visitors SET data_i_godzina=NOW(), status='offline', reload_count=0, is_bot=0 WHERE ip='$user_ip'";
            $conn->query($sql_update_user);
        } else {
            // Użytkownik jest aktywny
            $sql_update_user = "UPDATE visitors SET data_i_godzina=NOW(), reload_count=reload_count+1, last_reload_time=NOW(), is_bot=0 WHERE ip='$user_ip'";
            $conn->query($sql_update_user);

            // Ustawienie statusu na "online", jeśli użytkownik jest aktywny
            if ($row_user['status'] == 'offline') {
                $sql_update_status = "UPDATE visitors SET status='online' WHERE ip='$user_ip'";
                $conn->query($sql_update_status);
            }
        }
    } else {
        // Użytkownik nie istnieje, dodaj go do bazy danych
        $sql_insert_user = "INSERT INTO visitors (ip, data_i_godzina, status, referer, reload_count, last_reload_time, is_bot) VALUES (?, NOW(), 'online', ?, 0, NULL, 0)";
        $stmt = $conn->prepare($sql_insert_user);
        $stmt->bind_param("ss", $user_ip, $referer);
        $stmt->execute();
        $stmt->close();
    }
} else {
    // Obsługa przypadku, kiedy jest bot
    $sql_check_user = "SELECT * FROM visitors WHERE ip='$user_ip'";
    $result_check_user = $conn->query($sql_check_user);

    if (!$result_check_user) {
        die("Query failed: " . $conn->error);
    }

    if ($result_check_user->num_rows > 0) {
        // Bot już istnieje, aktualizuj dane
        $sql_update_user = "UPDATE visitors SET data_i_godzina=NOW(), is_bot=1 WHERE ip='$user_ip'";
        $conn->query($sql_update_user);
    } else {
        // Bot nie istnieje, dodaj go do bazy danych
        $sql_insert_user = "INSERT INTO visitors (ip, data_i_godzina, status, referer, reload_count, last_reload_time, is_bot) VALUES (?, NOW(), 'online', ?, 0, NULL, 1)";
        $stmt = $conn->prepare($sql_insert_user);
        $stmt->bind_param("ss", $user_ip, $referer);
        $stmt->execute();
        $stmt->close();
    }
}

// Zliczanie odwiedzin dzisiaj (z wykluczeniem botów)
$sql_count_visits_today = "SELECT COUNT(*) as visit_count FROM visitors WHERE DATE(data_i_godzina) = CURDATE() AND is_bot = 0 AND ip NOT IN ('" . implode("','", $excluded_ips) . "')";
$result_count_visits_today = $conn->query($sql_count_visits_today);

if (!$result_count_visits_today) {
    die("Query failed: " . $conn->error);
}

$row_count_visits_today = $result_count_visits_today->fetch_assoc();
$visits_today = $row_count_visits_today['visit_count'];

// Zliczanie użytkowników online (z wykluczeniem botów)
$sql_count_online = "SELECT COUNT(*) as online_count FROM visitors WHERE status='online' AND is_bot = 0 AND ip NOT IN ('" . implode("','", $excluded_ips) . "')";
$result_count_online = $conn->query($sql_count_online);

if (!$result_count_online) {
    die("Query failed: " . $conn->error);
}

$row_count_online = $result_count_online->fetch_assoc();
$online_count = $row_count_online['online_count'];

echo "Liczba odwiedzin<br>dzisiaj: " . $visits_today . "<br><br>";
echo "Liczba gości online: " . $online_count;

?>

..
Próbowałem z user agents IsSearchBot ale to nic nie daje. Jedynie blokowanie adresów IP.

DZIĘKI chyba SIĘ UDAŁO - CHYBA TO ZASŁUGA $_SERVER['HTTP_USER_AGENT]. Teraz jak wejdzie bot to ustawia wartość is_bot w bazie danych na 1. Przynajmniej na razie tak to wygląda. Dam znać jak przyobserwuje czy dobrze zlicza statsy.

screenshot-20241231063353.png

edytowany 15x, ostatnio: Riddle
jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 godziny
  • Postów:3457
0

Z grubsza kod wygląda na działający poprawnie.

Mariusz Kubielas
  • Rejestracja:3 miesiące
  • Ostatnio:15 dni
  • Postów:20
0

A czy plik z wynikami może wpłynąć na statystyki ?

Kopiuj
<?php

// Lista znanych botów (możesz dodać więcej botów do tej listy)
$knownBots = [
    'googlebot',
    'bingbot',
    'yandex',
    'baiduspider',
    'msnbot',
    'duckduckbot',
    'slurp',
    'facebot',
    'ia_archiver'
];

// Pobierz IP użytkownika
$userIP = $_SERVER['REMOTE_ADDR'];

// Sprawdzenie, czy tabela visitors istnieje
$checkTableQuery = "SHOW TABLES LIKE 'visitors'";
$result = $conn->query($checkTableQuery);

// Pobierz 20 ostatnich rekordów z tabeli visitors z uwzględnieniem nowych kolumn
$selectQuery1 = "SELECT `id`, `ip`, `data_i_godzina`, `status`, `reload_count`, `last_reload_time`, `is_bot` FROM `visitors` ORDER BY `data_i_godzina` DESC LIMIT 15";
$result1 = $conn->query($selectQuery1);

// Przygotuj tablicę na wiersze
$rows = array();

while ($row = $result1->fetch_assoc()) {
    $isCurrentUserIP = ($row['ip'] == $_SERVER['REMOTE_ADDR']);
    $style = $isCurrentUserIP ? 'color: #aa8a44; font-weight: bold;' : '';

    // Dodaj wiersz do tablicy
    $rows[] = array(
        'style' => $style,
        'id' => $row['id'],
        'ip' => $row['ip'],
        'data_i_godzina' => $row['data_i_godzina'],
        'status' => $row['status'],
        'reload_count' => $row['reload_count'],
        'is_bot' => $row['is_bot'],  // Dodana kolumna is_bot
        'last_reload_time' => $row['last_reload_time']
    );
}

// Sortuj tablicę, umieszczając wiersze z Twoim adresem IP na końcu
usort($rows, function ($a, $b) {
    return ($a['style'] === '') ? -1 : 1;
});

// Wyświetlanie wyników pierwszej tabeli
if ($result1->num_rows > 0) {
    // Wyświetl tabelę
    echo "<h2>Ostatnie 20 rekordów z tabeli visitors</h2>";
echo "<table rules='all' style='border:1px solid rgba(255,255,255,0.1);width:100%;text-align:center;font-size:13;'>
    <tr>
        <th>ID</th>
        <th>Adres IP</th>
        <th>Data i Godzina</th>
        <th>Reload Count</th>
        <th>Status</th>
        <th>Bot</th> <!-- Nowa kolumna dla is_bot -->
    </tr>";

foreach ($rows as $row) {
    echo "<tr style='{$row['style']}'>
        <td>{$row['id']}</td>
        <td>{$row['ip']}</td>
        <td>{$row['data_i_godzina']}</td>
        <td>{$row['reload_count']}</td>
        <td>{$row['status']}</td>
        <td>{$row['is_bot']}</td> <!-- Nowa kolumna dla is_bot -->
      </tr>";
}

echo "</table>";
} else {
    echo "Brak wyników do wyświetlenia.";
}

// Pobierz id, referer i datę z odpowiedniego zapytania SQL
$selectQueryReferer = "SELECT `id`, `referer`, `data_i_godzina` FROM `visitors` WHERE `referer` IS NOT NULL ORDER BY `data_i_godzina` DESC LIMIT 15";

$resultReferer = $conn->query($selectQueryReferer);

// Wyświetlanie wyników tabeli z refererem i datą
if ($resultReferer->num_rows > 0) {
    echo "<h2>Tabela z Refererem</h2>";
    echo "<table rules='all' style='border:1px solid rgba(255,255,255,0.1);width:100%;text-align:center;'>
            <tr>
                <th>ID</th>
                <th>Referer</th>
                <th>Data i Godzina</th>
            </tr>";

    while ($rowReferer = $resultReferer->fetch_assoc()) {
        // Dodaj trzy kropki, jeśli referer ma więcej niż 20 znaków
        $shortenedReferer = (strlen($rowReferer['referer']) > 50) ? substr($rowReferer['referer'], 0, 50) . "..." : $rowReferer['referer'];

        echo "<tr>
                <td>{$rowReferer['id']}</td>
                <td style='width:40%'>{$shortenedReferer}</td>
                <td>{$rowReferer['data_i_godzina']}</td>
              </tr>";
    }

    echo "</table>";
} else {
    echo "Brak wyników do wyświetlenia.";
}

// Pobierz codzienne odwiedziny (bez botów) z ostatnich 10 dni
$selectQuery2 = "SELECT DATE(`data_i_godzina`) AS `dzien`, COUNT(*) AS `liczba_odwiedzin`
                 FROM `visitors`
                 WHERE `is_bot` = 0
                 GROUP BY DATE(`data_i_godzina`)
                 ORDER BY `dzien` DESC
                 LIMIT 10";
$result2 = $conn->query($selectQuery2);

// Wyświetlanie wyników w tabeli
if ($result2->num_rows > 0) {
    echo "<h2>Codzienne odwiedziny (bez botów) z ostatnich 10 dni</h2>";
    echo "<table rules='all' style='border:1px solid rgba(255,255,255,0.1);width:100%;text-align:center;'>
            <tr>
                <th>Data</th>
                <th>Liczba odwiedzin</th>
            </tr>";

    while ($row = $result2->fetch_assoc()) {
        echo "<tr>
                <td>{$row['dzien']}</td>
                <td>{$row['liczba_odwiedzin']}</td>
              </tr>";
    }

    echo "</table>";
} else {
    echo "Brak wyników do wyświetlenia.";
}


// Zamknij połączenie z bazą danych
$conn->close();
?>
Mariusz Kubielas
  • Rejestracja:3 miesiące
  • Ostatnio:15 dni
  • Postów:20
0

Przez chwilę działał licznik, coś sknociłem i nie wiem jak naprawić.

Obecny kod wygląda tak:

Kopiuj
<?php
$excluded_ips = ['4.227.36.22', '10.0.0.1']; // Wykluczone IP

// Funkcja sprawdzająca, czy to bot na podstawie user agent
function isSearchBot() {
    $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? strtolower($_SERVER['HTTP_USER_AGENT']) : '';
    $search_bots = ['googlebot', 'bingbot', 'yandexbot', 'baiduspider', 'slurp', 'duckduckbot', 'facebookexternalhit'];
    foreach ($search_bots as $bot) {
        if (strpos($user_agent, $bot) !== false) {
            return true;
        }
    }
    return false;
}

function sendEmailNotification($ip) {
    $to = 'fukurou@dbgreat.com.pl';
    $subject = 'Nowa wizyta na stronie';
    $message = "Nowy użytkownik odwiedził stronę. IP: $ip";
    $headers = "From: no-reply@example.com";
    mail($to, $subject, $message, $headers);
}

$user_ip = $_SERVER['REMOTE_ADDR'];
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : 'direct';
$is_bot = isSearchBot() ? 1 : 0;

// Dodanie kolumny is_bot, jeśli nie istnieje
$conn->query("ALTER TABLE visitors ADD COLUMN IF NOT EXISTS is_bot TINYINT(1) DEFAULT 0");

// Aktualizacja wszystkich rekordów botów
$conn->query("UPDATE visitors SET is_bot = 1 WHERE LOWER(user_agent) REGEXP 'googlebot|bingbot|yandexbot|baiduspider|slurp|duckduckbot|facebookexternalhit'");

if (in_array($user_ip, $excluded_ips)) {
    exit();  // Wyjdź, jeśli to wykluczone IP
}

$sql_check_user = "SELECT * FROM visitors WHERE ip='$user_ip'";
$result_check_user = $conn->query($sql_check_user);

if ($result_check_user->num_rows > 0) {
    $row_user = $result_check_user->fetch_assoc();
    $inactive_time = time() - strtotime($row_user['data_i_godzina']);
    
    if ($inactive_time > 300) {
        $sql_update_user = "UPDATE visitors 
        SET data_i_godzina=NOW(), status='offline', reload_count=0, is_bot='$is_bot' 
        WHERE ip='$user_ip'";
    } else {
        $sql_update_user = "UPDATE visitors 
        SET data_i_godzina=NOW(), 
        reload_count = IF(ip != '79.175.215.54', reload_count + 1, reload_count), 
        last_reload_time=NOW(), status='online', is_bot='$is_bot' 
        WHERE ip='$user_ip'";
    }
    $conn->query($sql_update_user);
} else {
    $sql_insert_user = "INSERT INTO visitors (ip, data_i_godzina, status, referer, reload_count, last_reload_time, is_bot) VALUES (?, NOW(), 'online', ?, 0, NULL, ?)";
    $stmt = $conn->prepare($sql_insert_user);
    $stmt->bind_param("ssi", $user_ip, $referer, $is_bot);
    $stmt->execute();
    $stmt->close();
	
	if (!$is_bot) {
        sendEmailNotification($user_ip);
    }
}

$sql_count_visits_today = "SELECT COUNT(*) as visit_count FROM visitors 
WHERE DATE(data_i_godzina) = CURDATE() 
AND is_bot = 0 
AND ip NOT IN ('" . implode("','", $excluded_ips) . "') 
AND ip != '79.175.215.54'";
$result_count_visits_today = $conn->query($sql_count_visits_today);
$visits_today = $result_count_visits_today->fetch_assoc()['visit_count'];

$sql_count_online = "SELECT COUNT(*) as online_count FROM visitors 
WHERE status='online' 
AND is_bot = 0 
AND ip NOT IN ('" . implode("','", $excluded_ips) . "') 
AND ip != '79.175.215.54'";
$result_count_online = $conn->query($sql_count_online);
$online_count = $result_count_online->fetch_assoc()['online_count'];

echo "Liczba odwiedzin dzisiaj: " . $visits_today . "<br><br>";
echo "Liczba gości online: " . $online_count;

$conn->close();
?>

edytowany 4x, ostatnio: Mariusz Kubielas
jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 godziny
  • Postów:3457
0

Opisz co chcesz żeby ten kod robił. Tylko dokładnie. Druga wersja realizuje inny schemat działania. Bez wiedzy jak to ma działać i jaki dokładnie jest problem ciężko coś podpowiedzieć.

Mariusz Kubielas
  • Rejestracja:3 miesiące
  • Ostatnio:15 dni
  • Postów:20
0

No bo drugi kod to wyświetlanie na stronie statystyk w formie tabelki. Skupmy się na tym ostatnim kodzie co podałem. Chcę żeby ustawiała się w bazie danych w tabeli "visitors" w kolumnie "is_bot" wartość 1 dla rekordów które pochodzą od botów. A dla prawdziwych użytkowników ma być 0. W ten sposób chcę zliczać tylko te odwiedziny co wskazują 0.

jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 godziny
  • Postów:3457
2
Kopiuj
// Dodanie kolumny is_bot, jeśli nie istnieje
$conn->query("ALTER TABLE visitors ADD COLUMN IF NOT EXISTS is_bot TINYINT(1) DEFAULT 0");

// Aktualizacja wszystkich rekordów botów
$conn->query("UPDATE visitors SET is_bot = 1 WHERE LOWER(user_agent) REGEXP 'googlebot|bingbot|yandexbot|baiduspider|slurp|duckduckbot|facebookexternalhit'");

Po co to wywołujesz za każdym razem?
Kolumnę dodajesz raz. Update też jak już raz.

W linii 47 w update znów sprawdzasz czy to bot. Jest sens? Raz wykryty wpis o automacie powinien już istnieć. Inna sprawa, że z takiego IP w teorii może się łączyć wielu użytkowników.
W linii 58 z kolei dodajesz tylko wpisy do bazy dla użytkowników nie rozpoznanych jako bot.
Ja bym na Twoim miejscu dokładnie przemyślał jak działa ten kod wygenerowany z chatu a jak chciałbyś żeby działał.

4w0rX4t4X
  • Rejestracja:prawie 2 lata
  • Ostatnio:około 2 miesiące
  • Postów:351
2

Google ma różne boty i różnie się przedstawiają. Na szczęście Google podaje listę adresów IP, z których korzystają więc możesz je łatwo wykluczyć:
https://www.gstatic.com/ipranges/goog.json

Mariusz Kubielas
Tyle że mi zadziałał ten kod bez dodawania adresów ip, wykluczało boty. Po czym zmieniłem coś znowu w kodzie i przestało działać. Dlatego pytam się gdzie popełniłem błąd.
4w0rX4t4X
Piszesz kod z GPT to może dokończ to z GPT. Podziel kod na mniejsze fragmenty i gadaj z nim o poszczególnych fragmentach.
Mariusz Kubielas
  • Rejestracja:3 miesiące
  • Ostatnio:15 dni
  • Postów:20
0

screenshot-20241231164554.png

patrze na referer, jak wchodzą z jakiegoś adresu to mam pewność że to człowiek, jak z direct to raczj bot

SM
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 2 godziny
  • Postów:277
1
Mariusz Kubielas napisał(a):

Witam, czy jest możliwe zrobić licznik odwiedzin na stronie www który wykluczy całkowicie odwiedziny googlebota ? Próbowałem już wiele razy z czatem gpt rozwiązać ten problem, ale bez skutku.
Strona to https://www.dbgreat.com.pl

Oficjalne boty się przedstawiają w UserAgencie jako boty.

edytowany 1x, ostatnio: smieszekheheszek
SM
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 2 godziny
  • Postów:277
1
Mariusz Kubielas napisał(a):

screenshot-20241231164554.png

patrze na referer, jak wchodzą z jakiegoś adresu to mam pewność że to człowiek, jak z direct to raczj bot

Wcale nie, crawlery działają w rózny sposób niektóre chodzą po stronach i wchodzą z jakiegoś adresu a niektóre robią "direct search" i wchodzą bezpośrednio.
Oficjalne boty najłatwiej wykosić po UserAgencie. A inne no cóż jak ktoś się kryje z tym że jest botem to możesz patrzeć na różne parametry przeglądarki i szukać jakiś schematów zgadzających się dla większej ilości połączeń.

edytowany 1x, ostatnio: smieszekheheszek
Mariusz Kubielas
  • Rejestracja:3 miesiące
  • Ostatnio:15 dni
  • Postów:20
0

A da sie zaktualizować istniejące już rekordy w bazie danych i oznaczyć które to boty tak jak to robię za pomocą wartości 1 w kolumnie "is_bot" ?

VBService
  • Rejestracja:około 16 lat
  • Ostatnio:około miesiąc
0

IMO, może dodaj kolumnę do db i zbieraj z każdego wejścia dane z 'HTTP_USER_AGENT' tak jak są w oryginale, bez obrabiana, po prostu zrób to przez kilka dni. Jak nazbierasz już sporą ilość danych zrób ich analizę np. pod kątem występowania nietypowych wpisów (typowych dla bot-a).
Po tej analizie może będzie łatwiej napisać jakiś sensowny kod do wyłapywania bot-ów.

Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Chrome/W.X.Y.Z Safari/537.36
Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) Chrome/W.X.Y.Z Safari/537.36
Twitterbot/1.0 Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.12.3 Chrome/69.0.3497.128 Safari/537.36
itp.


Talk is cheap. Show me the code! - Linus Torvalds
-----------------------------------------------------------------------------------------------------------
Simplicity is a great virtue but it requires hard work to achieve it and education to appreciate it. And to make matters worse: complexity sells better. - Edsger W. Dijkstra
VBService
  • Rejestracja:około 16 lat
  • Ostatnio:około miesiąc
0
Mariusz Kubielas napisał(a):

A da sie zaktualizować istniejące już rekordy w bazie danych i oznaczyć które to boty tak jak to robię za pomocą wartości 1 w kolumnie "is_bot" ?

jeżeli pytasz o sam sqł, jak najbardziej.

Kopiuj
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

Talk is cheap. Show me the code! - Linus Torvalds
-----------------------------------------------------------------------------------------------------------
Simplicity is a great virtue but it requires hard work to achieve it and education to appreciate it. And to make matters worse: complexity sells better. - Edsger W. Dijkstra
Mariusz Kubielas
Pytam o możliwość zaktualizowania istniejących już wpisów za pomocą user agents
VBService
Mam pytanie. Czy jak kod wykryje wizytę bot-a, czy chcesz ten stan mimo wszystko zapisać, zachować (nie wiem, np. dla jakiś statystyk). Czy po wykryciu bot-a zliczanie wejść ma być ignorowane?
Mariusz Kubielas
Chcę widzieć wizyty bota chce widzieć co jest na rzeczy 😀
Mariusz Kubielas
  • Rejestracja:3 miesiące
  • Ostatnio:15 dni
  • Postów:20
0

UDAŁO SIĘ, "troche"(bo całą nocke zarwałem) pomęczyłem chata gpt i się udało ustawia 1 dla botów. Jescze poobserwuje jakiś czas i dam znać czy działa.

Przyczyna była w tej funkcji:

Kopiuj
function isSearchBot() {
    $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? strtolower($_SERVER['HTTP_USER_AGENT']) : '';

    // Lista botów do wykrycia (w tym boty Google, Bing, Yahoo, DuckDuckGo, Baidu, Yandex, Facebook i inne)
    $bot_user_agents = [
        'googlebot', 'bingbot', 'yahoo', 'duckduckbot', 'baiduspider', 
        'yandexbot', 'facebookexternalhit', 'facebot', 'mj12bot', 'twitterbot',
        'slurp', 'crawl', 'spider', 'bot', 'crawler', 'googlebot-mobile', 'googlebot-image',
        'mediapartners-google', 'adsbot-google', 'google-sitemaps', 'feedfetcher-google',
        'ahrefsbot', 'seokicks-robot', 'bingbot', 'semrushbot', 'majesticbot', 'seznambot'
    ];

    foreach ($bot_user_agents as $bot) {
        if (strpos($user_agent, $bot) !== false) {
            return true; // Jeśli znaleziono jakikolwiek bot, zwróć true
        }
    }

    return false; // Jeśli nie znaleziono żadnego bota, zwróć false
}

![zrzut.png](https://dbgreat.com.pl/zrzut.png

Działa 😊😊 A mój brat mówił że nie da się wykluczyć bota google... Jednak sie mylił

screenshot-20241231175344.png

edytowany 9x, ostatnio: Mariusz Kubielas
VBService
  • Rejestracja:około 16 lat
  • Ostatnio:około miesiąc
2

Proponuje taką zmianę w liniii 2, jeżeli $_SERVER['HTTP_USER_AGENT'] zwróci '' pusty to nie ma sensu wykonywać reszty kodu, można od razu zwrócić false.

Kopiuj
    $user_agent = $_SERVER['HTTP_USER_AGENT'] ? strtolower($_SERVER['HTTP_USER_AGENT']) : null;
    if (!$user_agent) return false;

Talk is cheap. Show me the code! - Linus Torvalds
-----------------------------------------------------------------------------------------------------------
Simplicity is a great virtue but it requires hard work to achieve it and education to appreciate it. And to make matters worse: complexity sells better. - Edsger W. Dijkstra
edytowany 3x, ostatnio: VBService
Mariusz Kubielas
Teraz mi nie wyświetla liczby odwiedzin dzisiaj i liczby online w STATS pod sondą pod Stat4u
VBService
  • Rejestracja:około 16 lat
  • Ostatnio:około miesiąc
0

Sprawdź to [ wersja online ]:

Kopiuj
  $http_users_agent = [
      'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Chrome/W.X.Y.Z Safari/537.36', // Googlebot
      'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) Chrome/W.X.Y.Z Safari/537.36', // Bingbot
      'Twitterbot/1.0 Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.12.3 Chrome/69.0.3497.128 Safari/537.36', // Twitterbot
      'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', // Zwykły użytkownik
      'Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.152 Mobile Safari/537.36', // Kolejny zwykły użytkownik
      'Mozilla/5.0 (compatible; AhrefsBot/7.0; +http://ahrefs.com/robot/)' // AhrefsBot
  ];
    
  function isSearchBot() {
    $user_agent = $_SERVER['HTTP_USER_AGENT'] ? strtolower($_SERVER['HTTP_USER_AGENT']) : null;
    if (!$user_agent) return false;
  
    $bot_user_agents = [
        'googlebot', 'bingbot', 'yahoo', 'duckduckbot', 'baiduspider', 
        'yandexbot', 'facebookexternalhit', 'facebot', 'mj12bot', 'twitterbot',
        'slurp', 'crawl', 'spider', 'bot', 'crawler', 'googlebot-mobile', 'googlebot-image',
        'mediapartners-google', 'adsbot-google', 'google-sitemaps', 'feedfetcher-google',
        'ahrefsbot', 'seokicks-robot', 'bingbot', 'semrushbot', 'majesticbot', 'seznambot'
    ];
  
    $clean_user_agent = preg_replace('/[^a-z]+/', ' ', $user_agent);
    $user_agent = preg_split('/\W+/', $clean_user_agent);
  
    return !empty(array_intersect($user_agent, $bot_user_agents));
  }

  // dla testu
  foreach ($http_users_agent as $agent) {
    $_SERVER['HTTP_USER_AGENT'] = $agent;
    //echo $agent . PHP_EOL . (isSearchBot() ? 'true' : 'false') . PHP_EOL . PHP_EOL; // wersja konsolowa
    echo "$agent<br>" . (isSearchBot() ? 'true' : 'false') . '<br><br>'; // wersja html
  }

lub [ wersja online ]:

Kopiuj
  function isSearchBot() {
    $user_agent = $_SERVER['HTTP_USER_AGENT'] ? strtolower($_SERVER['HTTP_USER_AGENT']) : null;
    if (!$user_agent) return false;
  
    $bot_user_agents = file('bot_user_agents.dat', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
  
    $clean_user_agent = preg_replace('/[^a-z]+/', ' ', $user_agent);
    $user_agent = preg_split('/\W+/', $clean_user_agent);
  
    return !empty(array_intersect($user_agent, $bot_user_agents));
  }

bot_user_agents.dat

Kopiuj
googlebot
bingbot
yahoo
duckduckbot
baiduspider
yandexbot
facebookexternalhit
facebot
mj12bot
twitterbot
slurp
crawl
spider
bot
crawler
googlebot-mobile
googlebot-image
mediapartners-google
adsbot-google
google-sitemaps
feedfetcher-google
ahrefsbot
seokicks-robot
semrushbot
majesticbot
seznambot

Talk is cheap. Show me the code! - Linus Torvalds
-----------------------------------------------------------------------------------------------------------
Simplicity is a great virtue but it requires hard work to achieve it and education to appreciate it. And to make matters worse: complexity sells better. - Edsger W. Dijkstra
edytowany 2x, ostatnio: VBService
jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 godziny
  • Postów:3457
2

Wersja uproszczona do minimum:

Kopiuj
<?php

function isSearchBot(userAgent) {
    return stripos($userAgent, 'bot') !== false;
}

// Funkcja testująca różne User Agenty
function testUserAgents() {
    $userAgents = [
        // Popularne przeglądarki
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/115.0',
        'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1',
        // Boty
        'Googlebot/2.1 (+http://www.google.com/bot.html)',
        'Mozilla/5.0 (compatible; Bingbot/2.0; +http://www.bing.com/bingbot.htm)',
        'DuckDuckBot/1.1 (+https://duckduckgo.com/duckduckbot)',
        'Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)',
        'facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)',
        // Fałszywe boty (test)
        'Mozilla/5.0 (compatible; Fakebot/1.0; +http://fakebot.com)',
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Bot/537.36',
    ];

    foreach ($userAgents as $agent) {
        $result = isSearchBot($agent) ? 'BOT' : 'Przeglądarka';
        echo "User-Agent: $agent\nWynik: $result\n\n";
    }
}

// Uruchomienie testów
testUserAgents();
?>

Online:
https://onlinephp.io/c/33a1b

Przy takim sprawdzaniu wystarczy szukać wystąpienia napisu bot

edytowany 1x, ostatnio: jurek1980
Mariusz Kubielas
  • Rejestracja:3 miesiące
  • Ostatnio:15 dni
  • Postów:20
0

OK, wszystko działa, tylko nie wyświetla ile osob odwiedziło dziś strone i liczby online. Prawdopodobnie w którymś miejcu w kodzie jest błąd.

Edit: exit() przerwał działanie dalszego skryptu dlatego nie wyświetlało się w ogóle "echo". Zamiast exit () dałem return; - nie wiem czy dobrze zrobiłem ?

edytowany 2x, ostatnio: Mariusz Kubielas
Mariusz Kubielas
OK naprawiłem sam. Dzięki. 😀👌
VBService
  • Rejestracja:około 16 lat
  • Ostatnio:około miesiąc
2

😉 @jurek1980
[ pełny przykład online ]

Kopiuj
  function isBot($userAgent) {
  	return (bool)array_filter(['bot', 'google-', 'crawl'], function($needle) use ($userAgent) {
  		return stripos($userAgent, $needle) !== false;
  	});
  }

  // Funkcja testująca różne User Agenty
  function testUserAgents() {
  	$userAgents = [
  		'Mozilla/5.0 (compatible; OnCrawl/2.0; +https://www.oncrawl.com)',
  		'Mozilla/5.0 (compatible; Google-InspectionTool/1.0;)',
  		// Popularne przeglądarki
  		'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
  		'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/115.0',
  		'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1',
  		// Boty
  		'Googlebot/2.1 (+http://www.google.com/bot.html)',
  		'Mozilla/5.0 (compatible; Bingbot/2.0; +http://www.bing.com/bingbot.htm)',
  		'DuckDuckBot/1.1 (+https://duckduckgo.com/duckduckbot)',
  		'Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)',
  		'facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)',
  		// Fałszywe boty (test)
  		'Mozilla/5.0 (compatible; Fakebot/1.0; +http://fakebot.com)',
  		'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Bot/537.36',
  	];
  
  	foreach ($userAgents as $agent) {
  		$result = isBot($agent) ? 'BOT' : 'Przeglądarka';
  		echo "User-Agent: $agent\nWynik: $result\n\n";
  	}
  }

  // Uruchomienie testów
  testUserAgents();

Talk is cheap. Show me the code! - Linus Torvalds
-----------------------------------------------------------------------------------------------------------
Simplicity is a great virtue but it requires hard work to achieve it and education to appreciate it. And to make matters worse: complexity sells better. - Edsger W. Dijkstra
Mariusz Kubielas
  • Rejestracja:3 miesiące
  • Ostatnio:15 dni
  • Postów:20
0

Ok. 500 botów mi wykluczyło od północy do teraz, czyli w ciągu niecałej godziny 😂

Nie wiem, wydaje mi się że dalej odwiedzają strone boty, bo w rekordach nie ma przeładowań, a zawsze jak ktoś wchodził to widziałem kilka przeładowań. Teraz pokazuje same zera, więc to pewno googleboty, albo jakieś inne. Plus jest taki, że jest teraz taka garstka botów. Zaledwie 22 odwiedziny do południa to i tak git. Może da się jeszcze jakoś je wykopać. Może za pomocą tego kodu co podałeś @VBService jak myślisz ?

edytowany 5x, ostatnio: Mariusz Kubielas
SM
To popularną masz tą strone :)
Mariusz Kubielas
  • Rejestracja:3 miesiące
  • Ostatnio:15 dni
  • Postów:20
0

Najlepsze jest to, że dzisiaj porównałem odwiedziny z mojego licznika do licznika google analytics i taki sam wynik wczoraj 55 odwiedzin. To znaczy że całkowicie wyeliminowałem boty. Tak się cieszę, dziękuję za rady, pomogliście. Z botami by było z 5 tys. wyświetleń. Wchodzą jeden na sekunde.

Mariusz Kubielas
Co ja pisze, 86,400 tys osób by weszło z botami, bo co sekunde daje taki wynik :D
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)